]>
Commit | Line | Data |
---|---|---|
39a54fe5 AG |
1 | To: vim-dev@vim.org |
2 | Subject: Patch 7.2.221 | |
3 | Fcc: outbox | |
4 | From: Bram Moolenaar <Bram@moolenaar.net> | |
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 -- Bram@Moolenaar.net -- 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 /// |