mirror of
https://github.com/vim/vim.git
synced 2025-08-31 20:53:42 -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 end = 0;
|
||||
linenr_T added = 0;
|
||||
int save_updating_screen = updating_screen;
|
||||
static int recursive = FALSE;
|
||||
|
||||
if (buf->b_recorded_changes == NULL // nothing changed
|
||||
|| buf->b_listener == NULL) // no listeners
|
||||
|| buf->b_listener == NULL // no listeners
|
||||
|| recursive) // already busy
|
||||
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].vval.v_number = buf->b_fnum; // a:bufnr
|
||||
@ -418,6 +426,12 @@ invoke_listeners(buf_T *buf)
|
||||
--textlock;
|
||||
list_unref(buf->b_recorded_changes);
|
||||
buf->b_recorded_changes = NULL;
|
||||
|
||||
if (save_updating_screen)
|
||||
updating_screen = TRUE;
|
||||
else
|
||||
after_updating_screen(TRUE);
|
||||
recursive = FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -10,7 +10,7 @@ void redraw_buf_and_status_later(buf_T *buf, int type);
|
||||
int redraw_asap(int type);
|
||||
void redraw_after_callback(int call_update_screen);
|
||||
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);
|
||||
int update_screen(int type_arg);
|
||||
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 updateWindow(win_T *wp);
|
||||
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 status_redraw_all(void);
|
||||
void status_redraw_curbuf(void);
|
||||
|
10
src/screen.c
10
src/screen.c
@ -506,8 +506,12 @@ redrawWinline(
|
||||
redraw_win_later(wp, VALID);
|
||||
}
|
||||
|
||||
/*
|
||||
* To be called when "updating_screen" was set before and now the postponed
|
||||
* side effects may take place.
|
||||
*/
|
||||
void
|
||||
reset_updating_screen(int may_resize_shell UNUSED)
|
||||
after_updating_screen(int may_resize_shell UNUSED)
|
||||
{
|
||||
updating_screen = FALSE;
|
||||
#ifdef FEAT_GUI
|
||||
@ -803,7 +807,7 @@ update_screen(int type_arg)
|
||||
FOR_ALL_WINDOWS(wp)
|
||||
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
|
||||
* mess up the command line. */
|
||||
@ -886,7 +890,7 @@ update_finish(void)
|
||||
end_search_hl();
|
||||
# endif
|
||||
|
||||
reset_updating_screen(TRUE);
|
||||
after_updating_screen(TRUE);
|
||||
|
||||
# ifdef FEAT_GUI
|
||||
/* 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)
|
||||
updating_screen = TRUE;
|
||||
else
|
||||
reset_updating_screen(FALSE);
|
||||
after_updating_screen(FALSE);
|
||||
|
||||
recursive = FALSE;
|
||||
}
|
||||
|
@ -767,6 +767,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1419,
|
||||
/**/
|
||||
1418,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user