To: vim-dev@vim.org Subject: Patch 7.2.221 Fcc: outbox From: Bram Moolenaar 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 *** ../vim-7.2.220/src/gui_gtk_x11.c 2009-06-16 15:23:07.000000000 +0200 --- src/gui_gtk_x11.c 2009-07-01 11:55:34.000000000 +0200 *************** *** 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); } /* *** ../vim-7.2.220/src/message.c 2009-05-17 13:30:58.000000000 +0200 --- src/message.c 2009-07-01 16:43:08.000000000 +0200 *************** *** 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. */ *** ../vim-7.2.220/src/ops.c 2009-05-26 18:12:13.000000000 +0200 --- src/ops.c 2009-07-01 12:15:31.000000000 +0200 *************** *** 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); } *** ../vim-7.2.220/src/proto/ui.pro 2007-05-05 19:58:49.000000000 +0200 --- src/proto/ui.pro 2009-07-01 11:48:11.000000000 +0200 *************** *** 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)); *** ../vim-7.2.220/src/ui.c 2009-05-17 13:30:58.000000000 +0200 --- src/ui.c 2009-07-01 15:44:07.000000000 +0200 *************** *** 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) /* *** ../vim-7.2.220/src/version.c 2009-07-01 17:11:40.000000000 +0200 --- src/version.c 2009-07-01 17:56:02.000000000 +0200 *************** *** 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 ///