summaryrefslogtreecommitdiffstats
path: root/vi/vim-7.2/7.2.093
blob: b0f44909bbafba306f5ceec9da6fa92678df3378 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
To: vim-dev@vim.org
Subject: Patch 7.2.093 (extra)
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------

Patch 7.2.093 (extra)
Problem:    Win32: inputdialog() and find/replace dialogs can't handle
	    multi-byte text.
Solution:   Use the wide version of dialog functions when available. (Yanwei
	    Jia)
Files:	    src/gui_w32.c, src/gui_w48.c


*** ../vim-7.2.092/src/gui_w32.c	Thu Nov 20 17:09:09 2008
--- src/gui_w32.c	Wed Jan 28 21:15:29 2009
***************
*** 1582,1587 ****
--- 1582,1598 ----
      s_findrep_struct.lpstrReplaceWith[0] = NUL;
      s_findrep_struct.wFindWhatLen = MSWIN_FR_BUFSIZE;
      s_findrep_struct.wReplaceWithLen = MSWIN_FR_BUFSIZE;
+ # if defined(FEAT_MBYTE) && defined(WIN3264)
+     s_findrep_struct_w.lStructSize = sizeof(s_findrep_struct_w);
+     s_findrep_struct_w.lpstrFindWhat =
+ 			      (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
+     s_findrep_struct_w.lpstrFindWhat[0] = NUL;
+     s_findrep_struct_w.lpstrReplaceWith =
+ 			      (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
+     s_findrep_struct_w.lpstrReplaceWith[0] = NUL;
+     s_findrep_struct_w.wFindWhatLen = MSWIN_FR_BUFSIZE;
+     s_findrep_struct_w.wReplaceWithLen = MSWIN_FR_BUFSIZE;
+ # endif
  #endif
  
  theend:
***************
*** 2938,2945 ****
  
  	/* If the edit box exists, copy the string. */
  	if (s_textfield != NULL)
! 	    GetDlgItemText(hwnd, DLG_NONBUTTON_CONTROL + 2,
  							 s_textfield, IOSIZE);
  
  	/*
  	 * Need to check for IDOK because if the user just hits Return to
--- 2949,2975 ----
  
  	/* If the edit box exists, copy the string. */
  	if (s_textfield != NULL)
! 	{
! # if defined(FEAT_MBYTE) && defined(WIN3264)
! 	    /* If the OS is Windows NT, and 'encoding' differs from active
! 	     * codepage: use wide function and convert text. */
! 	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
! 		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
!             {
! 	       WCHAR  *wp = (WCHAR *)alloc(IOSIZE * sizeof(WCHAR));
! 	       char_u *p;
! 
! 	       GetDlgItemTextW(hwnd, DLG_NONBUTTON_CONTROL + 2, wp, IOSIZE);
! 	       p = utf16_to_enc(wp, NULL);
! 	       vim_strncpy(s_textfield, p, IOSIZE);
! 	       vim_free(p);
! 	       vim_free(wp);
! 	    }
! 	    else
! # endif
! 		GetDlgItemText(hwnd, DLG_NONBUTTON_CONTROL + 2,
  							 s_textfield, IOSIZE);
+ 	}
  
  	/*
  	 * Need to check for IDOK because if the user just hits Return to
*** ../vim-7.2.092/src/gui_w48.c	Wed Jan 28 14:17:21 2009
--- src/gui_w48.c	Wed Jan 28 21:10:26 2009
***************
*** 153,158 ****
--- 153,161 ----
  #ifdef MSWIN_FIND_REPLACE
  static UINT		s_findrep_msg = 0;	/* set in gui_w[16/32].c */
  static FINDREPLACE	s_findrep_struct;
+ # if defined(FEAT_MBYTE) && defined(WIN3264)
+ static FINDREPLACEW	s_findrep_struct_w;
+ # endif
  static HWND		s_findrep_hwnd = NULL;
  static int		s_findrep_is_find;	/* TRUE for find dialog, FALSE
  						   for find/replace dialog */
***************
*** 884,889 ****
--- 887,931 ----
  #endif
  
  #ifdef MSWIN_FIND_REPLACE
+ # if defined(FEAT_MBYTE) && defined(WIN3264)
+ /*
+  * copy useful data from structure LPFINDREPLACE to structure LPFINDREPLACEW
+  */
+     static void
+ findrep_atow(LPFINDREPLACEW lpfrw, LPFINDREPLACE lpfr)
+ {
+     WCHAR *wp;
+ 
+     lpfrw->hwndOwner = lpfr->hwndOwner;
+     lpfrw->Flags = lpfr->Flags;
+ 
+     wp = enc_to_utf16(lpfr->lpstrFindWhat, NULL);
+     wcsncpy(lpfrw->lpstrFindWhat, wp, lpfrw->wFindWhatLen - 1);
+     vim_free(wp);
+ 
+     /* the field "lpstrReplaceWith" doesn't need to be copied */
+ }
+ 
+ /*
+  * copy useful data from structure LPFINDREPLACEW to structure LPFINDREPLACE
+  */
+     static void
+ findrep_wtoa(LPFINDREPLACE lpfr, LPFINDREPLACEW lpfrw)
+ {
+     char_u *p;
+ 
+     lpfr->Flags = lpfrw->Flags;
+ 
+     p = utf16_to_enc(lpfrw->lpstrFindWhat, NULL);
+     vim_strncpy(lpfr->lpstrFindWhat, p, lpfr->wFindWhatLen - 1);
+     vim_free(p);
+ 
+     p = utf16_to_enc(lpfrw->lpstrReplaceWith, NULL);
+     vim_strncpy(lpfr->lpstrReplaceWith, p, lpfr->wReplaceWithLen - 1);
+     vim_free(p);
+ }
+ # endif
+ 
  /*
   * Handle a Find/Replace window message.
   */
***************
*** 893,898 ****
--- 935,950 ----
      int	    flags = 0;
      int	    down;
  
+ # if defined(FEAT_MBYTE) && defined(WIN3264)
+     /* If the OS is Windows NT, and 'encoding' differs from active codepage:
+      * convert text from wide string. */
+     if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
+ 			&& enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     {
+         findrep_wtoa(&s_findrep_struct, &s_findrep_struct_w);
+     }
+ # endif
+ 
      if (s_findrep_struct.Flags & FR_DIALOGTERM)
  	/* Give main window the focus back. */
  	(void)SetFocus(s_hwnd);
***************
*** 2562,2568 ****
  	if (!IsWindow(s_findrep_hwnd))
  	{
  	    initialise_findrep(eap->arg);
! 	    s_findrep_hwnd = FindText((LPFINDREPLACE) &s_findrep_struct);
  	}
  
  	set_window_title(s_findrep_hwnd,
--- 2614,2632 ----
  	if (!IsWindow(s_findrep_hwnd))
  	{
  	    initialise_findrep(eap->arg);
! # if defined(FEAT_MBYTE) && defined(WIN3264)
! 	    /* If the OS is Windows NT, and 'encoding' differs from active
! 	     * codepage: convert text and use wide function. */
! 	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
! 		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
! 	    {
! 	        findrep_atow(&s_findrep_struct_w, &s_findrep_struct);
! 		s_findrep_hwnd = FindTextW(
! 					(LPFINDREPLACEW) &s_findrep_struct_w);
! 	    }
! 	    else
! # endif
! 		s_findrep_hwnd = FindText((LPFINDREPLACE) &s_findrep_struct);
  	}
  
  	set_window_title(s_findrep_hwnd,
***************
*** 2587,2593 ****
  	if (!IsWindow(s_findrep_hwnd))
  	{
  	    initialise_findrep(eap->arg);
! 	    s_findrep_hwnd = ReplaceText((LPFINDREPLACE) &s_findrep_struct);
  	}
  
  	set_window_title(s_findrep_hwnd,
--- 2651,2668 ----
  	if (!IsWindow(s_findrep_hwnd))
  	{
  	    initialise_findrep(eap->arg);
! # if defined(FEAT_MBYTE) && defined(WIN3264)
! 	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
! 		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
! 	    {
! 		findrep_atow(&s_findrep_struct_w, &s_findrep_struct);
! 		s_findrep_hwnd = ReplaceTextW(
! 					(LPFINDREPLACEW) &s_findrep_struct_w);
! 	    }
! 	    else
! # endif
! 		s_findrep_hwnd = ReplaceText(
! 					   (LPFINDREPLACE) &s_findrep_struct);
  	}
  
  	set_window_title(s_findrep_hwnd,
*** ../vim-7.2.092/src/version.c	Wed Jan 28 19:08:31 2009
--- src/version.c	Wed Jan 28 21:19:56 2009
***************
*** 678,679 ****
--- 678,681 ----
  {   /* Add new patch number below this line */
+ /**/
+     93,
  /**/

-- 
I'm not familiar with this proof, but I'm aware of a significant
following of toddlers who believe that peanut butter is the solution
to all of life's problems... 		-- Tim Hammerquist

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///