summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.c9
-rw-r--r--src/testdir/test_eval.in17
-rw-r--r--src/testdir/test_eval.okbin11010 -> 11538 bytes
-rw-r--r--src/ui.c43
-rw-r--r--src/version.c2
5 files changed, 45 insertions, 26 deletions
diff --git a/src/main.c b/src/main.c
index 181438519..ec83d8f14 100644
--- a/src/main.c
+++ b/src/main.c
@@ -959,17 +959,8 @@ vim_main2(int argc UNUSED, char **argv UNUSED)
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
diff --git a/src/testdir/test_eval.in b/src/testdir/test_eval.in
index cd605af56..b9f68f75c 100644
--- 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)')
diff --git a/src/testdir/test_eval.ok b/src/testdir/test_eval.ok
index 59112d028..5e8d2cc4f 100644
--- a/src/testdir/test_eval.ok
+++ b/src/testdir/test_eval.ok
Binary files differ
diff --git a/src/ui.c b/src/ui.c
index 59794829d..a2d83458d 100644
--- 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))
- return;
- else if (cbd == &clip_star && (clip_unnamed_saved & CLIP_UNNAMED))
+ if ((cbd == &clip_plus && (clip_unnamed_saved & CLIP_UNNAMED_PLUS))
+ || (cbd == &clip_star && (clip_unnamed_saved & CLIP_UNNAMED)))
+ {
+ clipboard_needs_update = TRUE;
return;
+ }
}
#ifdef FEAT_XCLIPBOARD
# ifdef FEAT_GUI
diff --git a/src/version.c b/src/version.c
index f0107fabf..35a716058 100644
--- 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,