| To: vim-dev@vim.org |
| Subject: Patch 7.2.221 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.2.221 |
| Problem: X cut_buffer0 text is used as-is, it may be in the wrong encoding. |
| Solution: Convert between 'enc' and latin1. (James Vega) |
| Files: src/gui_gtk_x11.c, src/message.c, src/ops.c, src/proto/ui.pro, |
| src/ui.c |
| |
| |
| |
| |
| |
| *** 6717,6724 **** |
| { |
| GdkAtom target; |
| unsigned i; |
| - int nbytes; |
| - char_u *buffer; |
| time_t start; |
| |
| for (i = 0; i < N_SELECTION_TARGETS; ++i) |
| --- 6717,6722 ---- |
| |
| *** 6746,6767 **** |
| } |
| |
| /* Final fallback position - use the X CUT_BUFFER0 store */ |
| ! nbytes = 0; |
| ! buffer = (char_u *)XFetchBuffer(GDK_WINDOW_XDISPLAY(gui.mainwin->window), |
| ! &nbytes, 0); |
| ! if (nbytes > 0) |
| ! { |
| ! /* Got something */ |
| ! clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd); |
| ! if (p_verbose > 0) |
| ! { |
| ! verbose_enter(); |
| ! smsg((char_u *)_("Used CUT_BUFFER0 instead of empty selection")); |
| ! verbose_leave(); |
| ! } |
| ! } |
| ! if (buffer != NULL) |
| ! XFree(buffer); |
| } |
| |
| /* |
| --- 6744,6750 ---- |
| } |
| |
| /* Final fallback position - use the X CUT_BUFFER0 store */ |
| ! yank_cut_buffer0(GDK_WINDOW_XDISPLAY(gui.mainwin->window), cbd); |
| } |
| |
| /* |
| |
| |
| |
| *** 107,113 **** |
| } |
| |
| #if defined(FEAT_EVAL) || defined(FEAT_X11) || defined(USE_XSMP) \ |
| ! || defined(PROTO) |
| /* |
| * Like msg() but keep it silent when 'verbosefile' is set. |
| */ |
| --- 107,113 ---- |
| } |
| |
| #if defined(FEAT_EVAL) || defined(FEAT_X11) || defined(USE_XSMP) \ |
| ! || defined(FEAT_GUI_GTK) || defined(PROTO) |
| /* |
| * Like msg() but keep it silent when 'verbosefile' is set. |
| */ |
| |
| |
| |
| *** 5591,5596 **** |
| --- 5591,5619 ---- |
| if (dpy != NULL && str != NULL && motion_type >= 0 |
| && len < 1024*1024 && len > 0) |
| { |
| + #ifdef FEAT_MBYTE |
| + /* The CUT_BUFFER0 is supposed to always contain latin1. Convert from |
| + * 'enc' when it is a multi-byte encoding. When 'enc' is an 8-bit |
| + * encoding conversion usually doesn't work, so keep the text as-is. |
| + */ |
| + if (has_mbyte) |
| + { |
| + char_u *conv_str = str; |
| + vimconv_T vc; |
| + |
| + vc.vc_type = CONV_NONE; |
| + if (convert_setup(&vc, p_enc, (char_u *)"latin1") == OK) |
| + { |
| + conv_str = string_convert(&vc, str, (int*)&len); |
| + if (conv_str != NULL) |
| + { |
| + vim_free(str); |
| + str = conv_str; |
| + } |
| + convert_setup(&vc, NULL, NULL); |
| + } |
| + } |
| + #endif |
| XStoreBuffer(dpy, (char *)str, (int)len, 0); |
| XFlush(dpy); |
| } |
| |
| |
| |
| *** 48,53 **** |
| --- 48,54 ---- |
| void open_app_context __ARGS((void)); |
| void x11_setup_atoms __ARGS((Display *dpy)); |
| void clip_x11_request_selection __ARGS((Widget myShell, Display *dpy, VimClipboard *cbd)); |
| + void yank_cut_buffer0 __ARGS((Display *dpy, VimClipboard *cbd)); |
| void clip_x11_lose_selection __ARGS((Widget myShell, VimClipboard *cbd)); |
| int clip_x11_own_selection __ARGS((Widget myShell, VimClipboard *cbd)); |
| void clip_x11_set_selection __ARGS((VimClipboard *cbd)); |
| |
| |
| |
| *** 2104,2111 **** |
| Atom type; |
| static int success; |
| int i; |
| - int nbytes = 0; |
| - char_u *buffer; |
| time_t start_time; |
| int timed_out = FALSE; |
| |
| --- 2104,2109 ---- |
| |
| *** 2185,2199 **** |
| } |
| |
| /* Final fallback position - use the X CUT_BUFFER0 store */ |
| ! buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0); |
| ! if (nbytes > 0) |
| ! { |
| ! /* Got something */ |
| ! clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd); |
| ! XFree((void *)buffer); |
| ! if (p_verbose > 0) |
| ! verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection")); |
| ! } |
| } |
| |
| static Boolean clip_x11_convert_selection_cb __ARGS((Widget, Atom *, Atom *, Atom *, XtPointer *, long_u *, int *)); |
| --- 2183,2189 ---- |
| } |
| |
| /* Final fallback position - use the X CUT_BUFFER0 store */ |
| ! yank_cut_buffer0(dpy, cbd); |
| } |
| |
| static Boolean clip_x11_convert_selection_cb __ARGS((Widget, Atom *, Atom *, Atom *, XtPointer *, long_u *, int *)); |
| |
| *** 2369,2374 **** |
| --- 2359,2418 ---- |
| } |
| #endif |
| |
| + #if defined(FEAT_XCLIPBOARD) || defined(FEAT_GUI_X11) \ |
| + || defined(FEAT_GUI_GTK) || defined(PROTO) |
| + /* |
| + * Get the contents of the X CUT_BUFFER0 and put it in "cbd". |
| + */ |
| + void |
| + yank_cut_buffer0(dpy, cbd) |
| + Display *dpy; |
| + VimClipboard *cbd; |
| + { |
| + int nbytes = 0; |
| + char_u *buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0); |
| + |
| + if (nbytes > 0) |
| + { |
| + #ifdef FEAT_MBYTE |
| + int done = FALSE; |
| + |
| + /* CUT_BUFFER0 is supposed to be always latin1. Convert to 'enc' when |
| + * using a multi-byte encoding. Conversion between two 8-bit |
| + * character sets usually fails and the text might actually be in |
| + * 'enc' anyway. */ |
| + if (has_mbyte) |
| + { |
| + char_u *conv_buf = buffer; |
| + vimconv_T vc; |
| + |
| + vc.vc_type = CONV_NONE; |
| + if (convert_setup(&vc, (char_u *)"latin1", p_enc) == OK) |
| + { |
| + conv_buf = string_convert(&vc, buffer, &nbytes); |
| + if (conv_buf != NULL) |
| + { |
| + clip_yank_selection(MCHAR, conv_buf, (long)nbytes, cbd); |
| + vim_free(conv_buf); |
| + done = TRUE; |
| + } |
| + convert_setup(&vc, NULL, NULL); |
| + } |
| + } |
| + if (!done) /* use the text without conversion */ |
| + #endif |
| + clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd); |
| + XFree((void *)buffer); |
| + if (p_verbose > 0) |
| + { |
| + verbose_enter(); |
| + verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection")); |
| + verbose_leave(); |
| + } |
| + } |
| + } |
| + #endif |
| + |
| #if defined(FEAT_MOUSE) || defined(PROTO) |
| |
| /* |
| |
| |
| |
| *** 678,679 **** |
| --- 678,681 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 221, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 40. You tell the cab driver you live at |
| http://123.elm.street/house/bluetrim.html |
| 41. You actually try that 123.elm.street address. |
| |
| /// 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 /// |