diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-07-19 12:51:52 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-07-19 12:51:52 +0200 |
commit | 80dd3f9d41ce2ff6ab3544cdb266627bbdfc34a6 (patch) | |
tree | 02513e2e063d58be83febf2d0a7260291e990467 | |
parent | 4fc63505d393451ad3780dc0390cb48587597aaf (diff) | |
download | vim-git-80dd3f9d41ce2ff6ab3544cdb266627bbdfc34a6.tar.gz |
patch 8.0.0732: when updating a buffer modeless selection is lostv8.0.0732
Problem: When updating a buffer for a callback the modeless selection is
lost.
Solution: Do not insert or delete screen lines when redrawing for a callback
and there is a modeless selection.
-rw-r--r-- | src/screen.c | 26 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 25 insertions, 3 deletions
diff --git a/src/screen.c b/src/screen.c index 0ec9ea281..447eb1e49 100644 --- a/src/screen.c +++ b/src/screen.c @@ -112,6 +112,10 @@ static foldinfo_T win_foldinfo; /* info for 'foldcolumn' */ static int compute_foldcolumn(win_T *wp, int col); #endif +/* Flag that is set when drawing for a callback, not from the main command + * loop. */ +static int redrawing_for_callback = 0; + /* * Buffer for one screen line (characters and attributes). */ @@ -445,6 +449,8 @@ redraw_asap(int type) void redraw_after_callback(void) { + ++redrawing_for_callback; + if (State == HITRETURN || State == ASKMORE) ; /* do nothing */ else if (State & CMDLINE) @@ -479,6 +485,8 @@ redraw_after_callback(void) gui_mch_flush(); } #endif + + --redrawing_for_callback; } /* @@ -9742,8 +9750,14 @@ screen_ins_lines( * - the screen has to be redrawn completely * - the line count is less than one * - the line count is more than 'ttyscroll' + * - redrawing for a callback and there is a modeless selection */ - if (!screen_valid(TRUE) || line_count <= 0 || line_count > p_ttyscroll) + if (!screen_valid(TRUE) || line_count <= 0 || line_count > p_ttyscroll +#ifdef FEAT_CLIPBOARD + || (clip_star.state != SELECT_CLEARED + && redrawing_for_callback > 0) +#endif + ) return FAIL; /* @@ -9959,9 +9973,15 @@ screen_del_lines( * - the screen has to be redrawn completely * - the line count is less than one * - the line count is more than 'ttyscroll' + * - redrawing for a callback and there is a modeless selection */ - if (!screen_valid(TRUE) || line_count <= 0 || - (!force && line_count > p_ttyscroll)) + if (!screen_valid(TRUE) || line_count <= 0 + || (!force && line_count > p_ttyscroll) +#ifdef FEAT_CLIPBOARD + || (clip_star.state != SELECT_CLEARED + && redrawing_for_callback > 0) +#endif + ) return FAIL; /* diff --git a/src/version.c b/src/version.c index 9c94fe8f8..8c4923cc0 100644 --- a/src/version.c +++ b/src/version.c @@ -770,6 +770,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 732, +/**/ 731, /**/ 730, |