mirror of
https://github.com/vim/vim.git
synced 2025-09-04 21:33:48 -04:00
patch 8.1.1419: listener callbacks may be called recursively
Problem: Listener callbacks may be called recursively. Solution: Set "updating_screen" while listener callbacks are invoked.
This commit is contained in:
parent
868b7b6712
commit
68a4b04a8d
16
src/change.c
16
src/change.c
@ -376,10 +376,18 @@ invoke_listeners(buf_T *buf)
|
|||||||
linenr_T start = MAXLNUM;
|
linenr_T start = MAXLNUM;
|
||||||
linenr_T end = 0;
|
linenr_T end = 0;
|
||||||
linenr_T added = 0;
|
linenr_T added = 0;
|
||||||
|
int save_updating_screen = updating_screen;
|
||||||
|
static int recursive = FALSE;
|
||||||
|
|
||||||
if (buf->b_recorded_changes == NULL // nothing changed
|
if (buf->b_recorded_changes == NULL // nothing changed
|
||||||
|| buf->b_listener == NULL) // no listeners
|
|| buf->b_listener == NULL // no listeners
|
||||||
|
|| recursive) // already busy
|
||||||
return;
|
return;
|
||||||
|
recursive = TRUE;
|
||||||
|
|
||||||
|
// Block messages on channels from being handled, so that they don't make
|
||||||
|
// text changes here.
|
||||||
|
++updating_screen;
|
||||||
|
|
||||||
argv[0].v_type = VAR_NUMBER;
|
argv[0].v_type = VAR_NUMBER;
|
||||||
argv[0].vval.v_number = buf->b_fnum; // a:bufnr
|
argv[0].vval.v_number = buf->b_fnum; // a:bufnr
|
||||||
@ -418,6 +426,12 @@ invoke_listeners(buf_T *buf)
|
|||||||
--textlock;
|
--textlock;
|
||||||
list_unref(buf->b_recorded_changes);
|
list_unref(buf->b_recorded_changes);
|
||||||
buf->b_recorded_changes = NULL;
|
buf->b_recorded_changes = NULL;
|
||||||
|
|
||||||
|
if (save_updating_screen)
|
||||||
|
updating_screen = TRUE;
|
||||||
|
else
|
||||||
|
after_updating_screen(TRUE);
|
||||||
|
recursive = FALSE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ void redraw_buf_and_status_later(buf_T *buf, int type);
|
|||||||
int redraw_asap(int type);
|
int redraw_asap(int type);
|
||||||
void redraw_after_callback(int call_update_screen);
|
void redraw_after_callback(int call_update_screen);
|
||||||
void redrawWinline(win_T *wp, linenr_T lnum);
|
void redrawWinline(win_T *wp, linenr_T lnum);
|
||||||
void reset_updating_screen(int may_resize_shell);
|
void after_updating_screen(int may_resize_shell);
|
||||||
void update_curbuf(int type);
|
void update_curbuf(int type);
|
||||||
int update_screen(int type_arg);
|
int update_screen(int type_arg);
|
||||||
int conceal_cursor_line(win_T *wp);
|
int conceal_cursor_line(win_T *wp);
|
||||||
@ -18,7 +18,7 @@ void conceal_check_cursor_line(void);
|
|||||||
void update_debug_sign(buf_T *buf, linenr_T lnum);
|
void update_debug_sign(buf_T *buf, linenr_T lnum);
|
||||||
void updateWindow(win_T *wp);
|
void updateWindow(win_T *wp);
|
||||||
int screen_get_current_line_off(void);
|
int screen_get_current_line_off(void);
|
||||||
void screen_line(int row, int coloff, int endcol, int clear_width, int rlflag);
|
void screen_line(int row, int coloff, int endcol, int clear_width, int flags);
|
||||||
void rl_mirror(char_u *str);
|
void rl_mirror(char_u *str);
|
||||||
void status_redraw_all(void);
|
void status_redraw_all(void);
|
||||||
void status_redraw_curbuf(void);
|
void status_redraw_curbuf(void);
|
||||||
|
10
src/screen.c
10
src/screen.c
@ -506,8 +506,12 @@ redrawWinline(
|
|||||||
redraw_win_later(wp, VALID);
|
redraw_win_later(wp, VALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To be called when "updating_screen" was set before and now the postponed
|
||||||
|
* side effects may take place.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
reset_updating_screen(int may_resize_shell UNUSED)
|
after_updating_screen(int may_resize_shell UNUSED)
|
||||||
{
|
{
|
||||||
updating_screen = FALSE;
|
updating_screen = FALSE;
|
||||||
#ifdef FEAT_GUI
|
#ifdef FEAT_GUI
|
||||||
@ -803,7 +807,7 @@ update_screen(int type_arg)
|
|||||||
FOR_ALL_WINDOWS(wp)
|
FOR_ALL_WINDOWS(wp)
|
||||||
wp->w_buffer->b_mod_set = FALSE;
|
wp->w_buffer->b_mod_set = FALSE;
|
||||||
|
|
||||||
reset_updating_screen(TRUE);
|
after_updating_screen(TRUE);
|
||||||
|
|
||||||
/* Clear or redraw the command line. Done last, because scrolling may
|
/* Clear or redraw the command line. Done last, because scrolling may
|
||||||
* mess up the command line. */
|
* mess up the command line. */
|
||||||
@ -886,7 +890,7 @@ update_finish(void)
|
|||||||
end_search_hl();
|
end_search_hl();
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
reset_updating_screen(TRUE);
|
after_updating_screen(TRUE);
|
||||||
|
|
||||||
# ifdef FEAT_GUI
|
# ifdef FEAT_GUI
|
||||||
/* Redraw the cursor and update the scrollbars when all screen updating is
|
/* Redraw the cursor and update the scrollbars when all screen updating is
|
||||||
|
2
src/ui.c
2
src/ui.c
@ -691,7 +691,7 @@ ui_breakcheck_force(int force)
|
|||||||
if (save_updating_screen)
|
if (save_updating_screen)
|
||||||
updating_screen = TRUE;
|
updating_screen = TRUE;
|
||||||
else
|
else
|
||||||
reset_updating_screen(FALSE);
|
after_updating_screen(FALSE);
|
||||||
|
|
||||||
recursive = FALSE;
|
recursive = FALSE;
|
||||||
}
|
}
|
||||||
|
@ -767,6 +767,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 */
|
||||||
|
/**/
|
||||||
|
1419,
|
||||||
/**/
|
/**/
|
||||||
1418,
|
1418,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user