1 To: [email protected] |
|
2 Subject: Patch 7.2.221 |
|
3 Fcc: outbox |
|
4 From: Bram Moolenaar <[email protected]> |
|
5 Mime-Version: 1.0 |
|
6 Content-Type: text/plain; charset=UTF-8 |
|
7 Content-Transfer-Encoding: 8bit |
|
8 ------------ |
|
9 |
|
10 Patch 7.2.221 |
|
11 Problem: X cut_buffer0 text is used as-is, it may be in the wrong encoding. |
|
12 Solution: Convert between 'enc' and latin1. (James Vega) |
|
13 Files: src/gui_gtk_x11.c, src/message.c, src/ops.c, src/proto/ui.pro, |
|
14 src/ui.c |
|
15 |
|
16 |
|
17 *** ../vim-7.2.220/src/gui_gtk_x11.c 2009-06-16 15:23:07.000000000 +0200 |
|
18 --- src/gui_gtk_x11.c 2009-07-01 11:55:34.000000000 +0200 |
|
19 *************** |
|
20 *** 6717,6724 **** |
|
21 { |
|
22 GdkAtom target; |
|
23 unsigned i; |
|
24 - int nbytes; |
|
25 - char_u *buffer; |
|
26 time_t start; |
|
27 |
|
28 for (i = 0; i < N_SELECTION_TARGETS; ++i) |
|
29 --- 6717,6722 ---- |
|
30 *************** |
|
31 *** 6746,6767 **** |
|
32 } |
|
33 |
|
34 /* Final fallback position - use the X CUT_BUFFER0 store */ |
|
35 ! nbytes = 0; |
|
36 ! buffer = (char_u *)XFetchBuffer(GDK_WINDOW_XDISPLAY(gui.mainwin->window), |
|
37 ! &nbytes, 0); |
|
38 ! if (nbytes > 0) |
|
39 ! { |
|
40 ! /* Got something */ |
|
41 ! clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd); |
|
42 ! if (p_verbose > 0) |
|
43 ! { |
|
44 ! verbose_enter(); |
|
45 ! smsg((char_u *)_("Used CUT_BUFFER0 instead of empty selection")); |
|
46 ! verbose_leave(); |
|
47 ! } |
|
48 ! } |
|
49 ! if (buffer != NULL) |
|
50 ! XFree(buffer); |
|
51 } |
|
52 |
|
53 /* |
|
54 --- 6744,6750 ---- |
|
55 } |
|
56 |
|
57 /* Final fallback position - use the X CUT_BUFFER0 store */ |
|
58 ! yank_cut_buffer0(GDK_WINDOW_XDISPLAY(gui.mainwin->window), cbd); |
|
59 } |
|
60 |
|
61 /* |
|
62 *** ../vim-7.2.220/src/message.c 2009-05-17 13:30:58.000000000 +0200 |
|
63 --- src/message.c 2009-07-01 16:43:08.000000000 +0200 |
|
64 *************** |
|
65 *** 107,113 **** |
|
66 } |
|
67 |
|
68 #if defined(FEAT_EVAL) || defined(FEAT_X11) || defined(USE_XSMP) \ |
|
69 ! || defined(PROTO) |
|
70 /* |
|
71 * Like msg() but keep it silent when 'verbosefile' is set. |
|
72 */ |
|
73 --- 107,113 ---- |
|
74 } |
|
75 |
|
76 #if defined(FEAT_EVAL) || defined(FEAT_X11) || defined(USE_XSMP) \ |
|
77 ! || defined(FEAT_GUI_GTK) || defined(PROTO) |
|
78 /* |
|
79 * Like msg() but keep it silent when 'verbosefile' is set. |
|
80 */ |
|
81 *** ../vim-7.2.220/src/ops.c 2009-05-26 18:12:13.000000000 +0200 |
|
82 --- src/ops.c 2009-07-01 12:15:31.000000000 +0200 |
|
83 *************** |
|
84 *** 5591,5596 **** |
|
85 --- 5591,5619 ---- |
|
86 if (dpy != NULL && str != NULL && motion_type >= 0 |
|
87 && len < 1024*1024 && len > 0) |
|
88 { |
|
89 + #ifdef FEAT_MBYTE |
|
90 + /* The CUT_BUFFER0 is supposed to always contain latin1. Convert from |
|
91 + * 'enc' when it is a multi-byte encoding. When 'enc' is an 8-bit |
|
92 + * encoding conversion usually doesn't work, so keep the text as-is. |
|
93 + */ |
|
94 + if (has_mbyte) |
|
95 + { |
|
96 + char_u *conv_str = str; |
|
97 + vimconv_T vc; |
|
98 + |
|
99 + vc.vc_type = CONV_NONE; |
|
100 + if (convert_setup(&vc, p_enc, (char_u *)"latin1") == OK) |
|
101 + { |
|
102 + conv_str = string_convert(&vc, str, (int*)&len); |
|
103 + if (conv_str != NULL) |
|
104 + { |
|
105 + vim_free(str); |
|
106 + str = conv_str; |
|
107 + } |
|
108 + convert_setup(&vc, NULL, NULL); |
|
109 + } |
|
110 + } |
|
111 + #endif |
|
112 XStoreBuffer(dpy, (char *)str, (int)len, 0); |
|
113 XFlush(dpy); |
|
114 } |
|
115 *** ../vim-7.2.220/src/proto/ui.pro 2007-05-05 19:58:49.000000000 +0200 |
|
116 --- src/proto/ui.pro 2009-07-01 11:48:11.000000000 +0200 |
|
117 *************** |
|
118 *** 48,53 **** |
|
119 --- 48,54 ---- |
|
120 void open_app_context __ARGS((void)); |
|
121 void x11_setup_atoms __ARGS((Display *dpy)); |
|
122 void clip_x11_request_selection __ARGS((Widget myShell, Display *dpy, VimClipboard *cbd)); |
|
123 + void yank_cut_buffer0 __ARGS((Display *dpy, VimClipboard *cbd)); |
|
124 void clip_x11_lose_selection __ARGS((Widget myShell, VimClipboard *cbd)); |
|
125 int clip_x11_own_selection __ARGS((Widget myShell, VimClipboard *cbd)); |
|
126 void clip_x11_set_selection __ARGS((VimClipboard *cbd)); |
|
127 *** ../vim-7.2.220/src/ui.c 2009-05-17 13:30:58.000000000 +0200 |
|
128 --- src/ui.c 2009-07-01 15:44:07.000000000 +0200 |
|
129 *************** |
|
130 *** 2104,2111 **** |
|
131 Atom type; |
|
132 static int success; |
|
133 int i; |
|
134 - int nbytes = 0; |
|
135 - char_u *buffer; |
|
136 time_t start_time; |
|
137 int timed_out = FALSE; |
|
138 |
|
139 --- 2104,2109 ---- |
|
140 *************** |
|
141 *** 2185,2199 **** |
|
142 } |
|
143 |
|
144 /* Final fallback position - use the X CUT_BUFFER0 store */ |
|
145 ! buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0); |
|
146 ! if (nbytes > 0) |
|
147 ! { |
|
148 ! /* Got something */ |
|
149 ! clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd); |
|
150 ! XFree((void *)buffer); |
|
151 ! if (p_verbose > 0) |
|
152 ! verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection")); |
|
153 ! } |
|
154 } |
|
155 |
|
156 static Boolean clip_x11_convert_selection_cb __ARGS((Widget, Atom *, Atom *, Atom *, XtPointer *, long_u *, int *)); |
|
157 --- 2183,2189 ---- |
|
158 } |
|
159 |
|
160 /* Final fallback position - use the X CUT_BUFFER0 store */ |
|
161 ! yank_cut_buffer0(dpy, cbd); |
|
162 } |
|
163 |
|
164 static Boolean clip_x11_convert_selection_cb __ARGS((Widget, Atom *, Atom *, Atom *, XtPointer *, long_u *, int *)); |
|
165 *************** |
|
166 *** 2369,2374 **** |
|
167 --- 2359,2418 ---- |
|
168 } |
|
169 #endif |
|
170 |
|
171 + #if defined(FEAT_XCLIPBOARD) || defined(FEAT_GUI_X11) \ |
|
172 + || defined(FEAT_GUI_GTK) || defined(PROTO) |
|
173 + /* |
|
174 + * Get the contents of the X CUT_BUFFER0 and put it in "cbd". |
|
175 + */ |
|
176 + void |
|
177 + yank_cut_buffer0(dpy, cbd) |
|
178 + Display *dpy; |
|
179 + VimClipboard *cbd; |
|
180 + { |
|
181 + int nbytes = 0; |
|
182 + char_u *buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0); |
|
183 + |
|
184 + if (nbytes > 0) |
|
185 + { |
|
186 + #ifdef FEAT_MBYTE |
|
187 + int done = FALSE; |
|
188 + |
|
189 + /* CUT_BUFFER0 is supposed to be always latin1. Convert to 'enc' when |
|
190 + * using a multi-byte encoding. Conversion between two 8-bit |
|
191 + * character sets usually fails and the text might actually be in |
|
192 + * 'enc' anyway. */ |
|
193 + if (has_mbyte) |
|
194 + { |
|
195 + char_u *conv_buf = buffer; |
|
196 + vimconv_T vc; |
|
197 + |
|
198 + vc.vc_type = CONV_NONE; |
|
199 + if (convert_setup(&vc, (char_u *)"latin1", p_enc) == OK) |
|
200 + { |
|
201 + conv_buf = string_convert(&vc, buffer, &nbytes); |
|
202 + if (conv_buf != NULL) |
|
203 + { |
|
204 + clip_yank_selection(MCHAR, conv_buf, (long)nbytes, cbd); |
|
205 + vim_free(conv_buf); |
|
206 + done = TRUE; |
|
207 + } |
|
208 + convert_setup(&vc, NULL, NULL); |
|
209 + } |
|
210 + } |
|
211 + if (!done) /* use the text without conversion */ |
|
212 + #endif |
|
213 + clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd); |
|
214 + XFree((void *)buffer); |
|
215 + if (p_verbose > 0) |
|
216 + { |
|
217 + verbose_enter(); |
|
218 + verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection")); |
|
219 + verbose_leave(); |
|
220 + } |
|
221 + } |
|
222 + } |
|
223 + #endif |
|
224 + |
|
225 #if defined(FEAT_MOUSE) || defined(PROTO) |
|
226 |
|
227 /* |
|
228 *** ../vim-7.2.220/src/version.c 2009-07-01 17:11:40.000000000 +0200 |
|
229 --- src/version.c 2009-07-01 17:56:02.000000000 +0200 |
|
230 *************** |
|
231 *** 678,679 **** |
|
232 --- 678,681 ---- |
|
233 { /* Add new patch number below this line */ |
|
234 + /**/ |
|
235 + 221, |
|
236 /**/ |
|
237 |
|
238 -- |
|
239 hundred-and-one symptoms of being an internet addict: |
|
240 40. You tell the cab driver you live at |
|
241 http://123.elm.street/house/bluetrim.html |
|
242 41. You actually try that 123.elm.street address. |
|
243 |
|
244 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\ |
|
245 /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
|
246 \\\ download, build and distribute -- http://www.A-A-P.org /// |
|
247 \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |
|