diff src/ui.c @ 6543:b01ca71f93b2 v7.4.598

updated for version 7.4.598 Problem: ":tabdo windo echo 'hi'" causes "* register not to be changed. (Salman Halim) Solution: Change how clip_did_set_selection is used and add clipboard_needs_update and global_change_count. (Christian Brabandt)
author Bram Moolenaar <bram@vim.org>
date Tue, 27 Jan 2015 14:09:37 +0100
parents 8cfbc34ae4aa
children 52b89a52ffd4
line wrap: on
line diff
--- a/src/ui.c
+++ b/src/ui.c
@@ -73,6 +73,8 @@ ui_write(s, len)
 static char_u *ta_str = NULL;
 static int ta_off;	/* offset for next char to use when ta_str != NULL */
 static int ta_len;	/* length of ta_str when it's not NULL*/
+static int clipboard_needs_update; /* clipboard needs to be updated */
+static int global_change_count = 0; /* if set, inside a start_global_changes */
 
     void
 ui_inchar_undo(s, len)
@@ -569,9 +571,12 @@ clip_copy_selection(clip)
     void
 start_global_changes()
 {
+    if (++global_change_count > 1)
+	return;
     clip_unnamed_saved = clip_unnamed;
+    clipboard_needs_update = FALSE;
 
-    if (clip_did_set_selection > 0)
+    if (clip_did_set_selection)
     {
 	clip_unnamed = FALSE;
 	clip_did_set_selection = FALSE;
@@ -584,22 +589,30 @@ start_global_changes()
     void
 end_global_changes()
 {
-    if (clip_did_set_selection == FALSE)  /* not when -1 */
+    if (--global_change_count > 0)
+	/* recursive */
+	return;
+    if (!clip_did_set_selection)
     {
 	clip_did_set_selection = TRUE;
 	clip_unnamed = clip_unnamed_saved;
-	if (clip_unnamed & CLIP_UNNAMED)
+	clip_unnamed_saved = FALSE;
+	if (clipboard_needs_update)
 	{
-	    clip_own_selection(&clip_star);
-	    clip_gen_set_selection(&clip_star);
-	}
-	if (clip_unnamed & CLIP_UNNAMED_PLUS)
-	{
-	    clip_own_selection(&clip_plus);
-	    clip_gen_set_selection(&clip_plus);
+	    /* only store something in the clipboard,
+	     * if we have yanked anything to it */
+	    if (clip_unnamed & CLIP_UNNAMED)
+	    {
+		clip_own_selection(&clip_star);
+		clip_gen_set_selection(&clip_star);
+	    }
+	    if (clip_unnamed & CLIP_UNNAMED_PLUS)
+	    {
+		clip_own_selection(&clip_plus);
+		clip_gen_set_selection(&clip_plus);
+	    }
 	}
     }
-    clip_unnamed_saved = FALSE;
 }
 
 /*
@@ -1477,10 +1490,12 @@ clip_gen_set_selection(cbd)
     {
 	/* Updating postponed, so that accessing the system clipboard won't
 	 * hang Vim when accessing it many times (e.g. on a :g comand). */
-	if (cbd == &clip_plus && (clip_unnamed_saved & CLIP_UNNAMED_PLUS))
+	if ((cbd == &clip_plus && (clip_unnamed_saved & CLIP_UNNAMED_PLUS))
+		|| (cbd == &clip_star && (clip_unnamed_saved & CLIP_UNNAMED)))
+	{
+	    clipboard_needs_update = TRUE;
 	    return;
-	else if (cbd == &clip_star && (clip_unnamed_saved & CLIP_UNNAMED))
-	    return;
+	}
     }
 #ifdef FEAT_XCLIPBOARD
 # ifdef FEAT_GUI