components/vim/vim72-patches/7.2.017
changeset 198 172fc01ce997
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/vim/vim72-patches/7.2.017	Thu Apr 07 16:25:07 2011 -0700
@@ -0,0 +1,162 @@
+To: [email protected]
+Subject: Patch 7.2.017
+Fcc: outbox
+From: Bram Moolenaar <[email protected]>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.017
+Problem:    strlen() used on text that may not end in a NUL. (Dominique Pelle)
+	    Pasting a very big selection doesn't work.
+Solution:   Use the length passed to the XtSelectionCallbackProc() function.
+	    After getting the SelectionNotify event continue dispatching
+	    events until the callback is actually called.  Also dispatch the
+	    PropertyNotify event.
+Files:	    src/ui.c
+
+
+*** ../vim-7.2.016/src/ui.c	Sun Sep  7 21:47:51 2008
+--- src/ui.c	Sun Sep 14 15:52:19 2008
+***************
+*** 2020,2026 ****
+  
+      if (value == NULL || *length == 0)
+      {
+! 	clip_free_selection(cbd);	/* ???  [what's the query?] */
+  	*(int *)success = FALSE;
+  	return;
+      }
+--- 2020,2026 ----
+  
+      if (value == NULL || *length == 0)
+      {
+! 	clip_free_selection(cbd);	/* nothing received, clear register */
+  	*(int *)success = FALSE;
+  	return;
+      }
+***************
+*** 2076,2082 ****
+  	text_prop.value = (unsigned char *)value;
+  	text_prop.encoding = *type;
+  	text_prop.format = *format;
+! 	text_prop.nitems = STRLEN(value);
+  	status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
+  							 &text_list, &n_text);
+  	if (status != Success || n_text < 1)
+--- 2076,2082 ----
+  	text_prop.value = (unsigned char *)value;
+  	text_prop.encoding = *type;
+  	text_prop.format = *format;
+! 	text_prop.nitems = len;
+  	status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
+  							 &text_list, &n_text);
+  	if (status != Success || n_text < 1)
+***************
+*** 2131,2137 ****
+  	    case 3:  type = text_atom;		break;
+  	    default: type = XA_STRING;
+  	}
+! 	success = FALSE;
+  	XtGetSelectionValue(myShell, cbd->sel_atom, type,
+  	    clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
+  
+--- 2131,2137 ----
+  	    case 3:  type = text_atom;		break;
+  	    default: type = XA_STRING;
+  	}
+! 	success = MAYBE;
+  	XtGetSelectionValue(myShell, cbd->sel_atom, type,
+  	    clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
+  
+***************
+*** 2145,2169 ****
+  	 * paste!  Don't worry, we will catch up with any other events later.
+  	 */
+  	start_time = time(NULL);
+! 	for (;;)
+  	{
+! 	    if (XCheckTypedEvent(dpy, SelectionNotify, &event))
+  	    {
+! 		/* this is where clip_x11_request_selection_cb() is actually
+! 		 * called */
+  		XtDispatchEvent(&event);
+! 		break;
+  	    }
+- 	    if (XCheckTypedEvent(dpy, SelectionRequest, &event))
+- 		/* We may get a SelectionRequest here and if we don't handle
+- 		 * it we hang.  KDE klipper does this, for example. */
+- 		XtDispatchEvent(&event);
+  
+  	    /* Time out after 2 to 3 seconds to avoid that we hang when the
+  	     * other process doesn't respond.  Note that the SelectionNotify
+  	     * event may still come later when the selection owner comes back
+! 	     * to life and the text gets inserted unexpectedly (by xterm).
+! 	     * Don't know how to avoid that :-(. */
+  	    if (time(NULL) > start_time + 2)
+  	    {
+  		timed_out = TRUE;
+--- 2145,2171 ----
+  	 * paste!  Don't worry, we will catch up with any other events later.
+  	 */
+  	start_time = time(NULL);
+! 	while (success == MAYBE)
+  	{
+! 	    if (XCheckTypedEvent(dpy, SelectionNotify, &event)
+! 		    || XCheckTypedEvent(dpy, SelectionRequest, &event)
+! 		    || XCheckTypedEvent(dpy, PropertyNotify, &event))
+  	    {
+! 		/* This is where clip_x11_request_selection_cb() should be
+! 		 * called.  It may actually happen a bit later, so we loop
+! 		 * until "success" changes.
+! 		 * We may get a SelectionRequest here and if we don't handle
+! 		 * it we hang.  KDE klipper does this, for example.
+! 		 * We need to handle a PropertyNotify for large selections. */
+  		XtDispatchEvent(&event);
+! 		continue;
+  	    }
+  
+  	    /* Time out after 2 to 3 seconds to avoid that we hang when the
+  	     * other process doesn't respond.  Note that the SelectionNotify
+  	     * event may still come later when the selection owner comes back
+! 	     * to life and the text gets inserted unexpectedly.  Don't know
+! 	     * why that happens or how to avoid that :-(. */
+  	    if (time(NULL) > start_time + 2)
+  	    {
+  		timed_out = TRUE;
+***************
+*** 2177,2183 ****
+  	    ui_delay(1L, TRUE);
+  	}
+  
+! 	if (success)
+  	    return;
+  
+  	/* don't do a retry with another type after timing out, otherwise we
+--- 2179,2185 ----
+  	    ui_delay(1L, TRUE);
+  	}
+  
+! 	if (success == TRUE)
+  	    return;
+  
+  	/* don't do a retry with another type after timing out, otherwise we
+*** ../vim-7.2.016/src/version.c	Sun Sep 14 14:41:44 2008
+--- src/version.c	Sun Sep 14 15:55:34 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+  {   /* Add new patch number below this line */
++ /**/
++     17,
+  /**/
+
+-- 
+hundred-and-one symptoms of being an internet addict:
+54. You start tilting your head sideways to smile. :-)
+
+ /// 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    ///