components/vim/vim72-patches/7.2.221
changeset 379 c6a17bba1da3
parent 378 f0b61ed1d10d
child 380 e92b3b4a1c66
equal deleted inserted replaced
378:f0b61ed1d10d 379:c6a17bba1da3
     1 To: [email protected]
       
     2 Subject: Patch 7.2.221
       
     3 Fcc: outbox
       
     4 From: Bram Moolenaar <[email protected]>
       
     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 -- [email protected] -- 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    ///