changeset 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 f52b5c1d7bb0
children 930ad67c0414
files src/main.c src/testdir/test_eval.in src/testdir/test_eval.ok src/ui.c src/version.c
diffstat 5 files changed, 45 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/src/main.c
+++ b/src/main.c
@@ -959,17 +959,8 @@ vim_main2(int argc UNUSED, char **argv U
     if (p_im)
 	need_start_insertmode = TRUE;
 
-#ifdef FEAT_CLIPBOARD
-    if (clip_unnamed)
-       /* do not overwrite system clipboard while starting up */
-       clip_did_set_selection = -1;
-#endif
 #ifdef FEAT_AUTOCMD
     apply_autocmds(EVENT_VIMENTER, NULL, NULL, FALSE, curbuf);
-# ifdef FEAT_CLIPBOARD
-    if (clip_did_set_selection < 0)
-       clip_did_set_selection = TRUE;
-# endif
     TIME_MSG("VimEnter autocommands");
 #endif
 
--- a/src/testdir/test_eval.in
+++ b/src/testdir/test_eval.in
@@ -1,7 +1,6 @@
 Test for various eval features.   vim: set ft=vim :
 
-Note: system clipboard support is not tested. I do not think anybody will thank 
-me for messing with clipboard.
+Note: system clipboard is saved, changed and restored.
 
 STARTTEST
 :so small.vim
@@ -122,7 +121,19 @@ call SetReg('/', ['abc/'])
 call SetReg('/', ["abc/\n"])
 call SetReg('=', ['"abc/"'])
 call SetReg('=', ["\"abc/\n\""])
-
+$put ='{{{1 System clipboard'
+" Save and restore system clipboard.
+" If no connection to X-Server is possible, test should succeed.
+:let _clipreg = ['+', getreg('+'), getregtype('+')]
+:let _clipopt = &cb
+:let &cb='unnamedplus'
+:1y
+:AR +
+:tabdo :windo :echo "hi"
+:3y
+:AR +
+:let &cb=_clipopt
+:call call('setreg', _clipreg)
 $put ='{{{1 Errors'
 call ErrExe('call setreg()')
 call ErrExe('call setreg(1)')
index 59112d028e72a937287ae2d2b7e60a0a03bd4493..5e8d2cc4f6f0caa2b4386ceec8b3addb70c419a2
GIT binary patch
literal 11538
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
QkneXzkIpo`xbNM60S}6Z!T<mO
--- 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
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    598,
+/**/
     597,
 /**/
     596,