1
0
forked from aniani/vim

patch 8.0.0732: when updating a buffer modeless selection is lost

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.
This commit is contained in:
Bram Moolenaar
2017-07-19 12:51:52 +02:00
parent 4fc63505d3
commit 80dd3f9d41
2 changed files with 25 additions and 3 deletions

View File

@@ -112,6 +112,10 @@ static foldinfo_T win_foldinfo; /* info for 'foldcolumn' */
static int compute_foldcolumn(win_T *wp, int col); static int compute_foldcolumn(win_T *wp, int col);
#endif #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). * Buffer for one screen line (characters and attributes).
*/ */
@@ -445,6 +449,8 @@ redraw_asap(int type)
void void
redraw_after_callback(void) redraw_after_callback(void)
{ {
++redrawing_for_callback;
if (State == HITRETURN || State == ASKMORE) if (State == HITRETURN || State == ASKMORE)
; /* do nothing */ ; /* do nothing */
else if (State & CMDLINE) else if (State & CMDLINE)
@@ -479,6 +485,8 @@ redraw_after_callback(void)
gui_mch_flush(); gui_mch_flush();
} }
#endif #endif
--redrawing_for_callback;
} }
/* /*
@@ -9742,8 +9750,14 @@ screen_ins_lines(
* - the screen has to be redrawn completely * - the screen has to be redrawn completely
* - the line count is less than one * - the line count is less than one
* - the line count is more than 'ttyscroll' * - 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; return FAIL;
/* /*
@@ -9959,9 +9973,15 @@ screen_del_lines(
* - the screen has to be redrawn completely * - the screen has to be redrawn completely
* - the line count is less than one * - the line count is less than one
* - the line count is more than 'ttyscroll' * - the line count is more than 'ttyscroll'
* - redrawing for a callback and there is a modeless selection
*/ */
if (!screen_valid(TRUE) || line_count <= 0 || if (!screen_valid(TRUE) || line_count <= 0
(!force && line_count > p_ttyscroll)) || (!force && line_count > p_ttyscroll)
#ifdef FEAT_CLIPBOARD
|| (clip_star.state != SELECT_CLEARED
&& redrawing_for_callback > 0)
#endif
)
return FAIL; return FAIL;
/* /*

View File

@@ -769,6 +769,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
732,
/**/ /**/
731, 731,
/**/ /**/