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 -- [email protected] -- 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    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui