Loading ...
Sorry, an error occurred while loading the content.

Patch 7.2.221

Expand Messages
  • Bram Moolenaar
    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:
    Message 1 of 1 , Jul 1, 2009
    View Source
    • 0 Attachment
      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@... -- 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
      -~----------~----~----~----~------~----~------~--~---
    Your message has been successfully submitted and would be delivered to recipients shortly.