diff options
Diffstat (limited to 'data/vim/patches/8.1.1419')
-rw-r--r-- | data/vim/patches/8.1.1419 | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1419 b/data/vim/patches/8.1.1419 new file mode 100644 index 000000000..bd0b97b78 --- /dev/null +++ b/data/vim/patches/8.1.1419 @@ -0,0 +1,195 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1419 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.1419 +Problem: Listener callbacks may be called recursively. +Solution: Set "updating_screen" while listener callbacks are invoked. +Files: src/change.c, src/screen.c, src/proto/screen.pro, src/ui.c + + +*** ../vim-8.1.1418/src/change.c 2019-05-28 23:08:12.052648779 +0200 +--- src/change.c 2019-05-29 22:28:20.083214648 +0200 +*************** +*** 376,385 **** + linenr_T start = MAXLNUM; + linenr_T end = 0; + linenr_T added = 0; + + if (buf->b_recorded_changes == NULL // nothing changed +! || buf->b_listener == NULL) // no listeners + return; + + argv[0].v_type = VAR_NUMBER; + argv[0].vval.v_number = buf->b_fnum; // a:bufnr +--- 376,393 ---- + 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 +! || 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,423 **** +--- 426,437 ---- + --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 + +*** ../vim-8.1.1418/src/screen.c 2019-05-28 23:08:12.076648654 +0200 +--- src/screen.c 2019-05-29 22:19:41.157935812 +0200 +*************** +*** 506,513 **** + redraw_win_later(wp, VALID); + } + + void +! reset_updating_screen(int may_resize_shell UNUSED) + { + updating_screen = FALSE; + #ifdef FEAT_GUI +--- 506,517 ---- + redraw_win_later(wp, VALID); + } + ++ /* ++ * To be called when "updating_screen" was set before and now the postponed ++ * side effects may take place. ++ */ + void +! after_updating_screen(int may_resize_shell UNUSED) + { + updating_screen = FALSE; + #ifdef FEAT_GUI +*************** +*** 803,809 **** + FOR_ALL_WINDOWS(wp) + wp->w_buffer->b_mod_set = FALSE; + +! reset_updating_screen(TRUE); + + /* Clear or redraw the command line. Done last, because scrolling may + * mess up the command line. */ +--- 807,813 ---- + FOR_ALL_WINDOWS(wp) + wp->w_buffer->b_mod_set = FALSE; + +! after_updating_screen(TRUE); + + /* Clear or redraw the command line. Done last, because scrolling may + * mess up the command line. */ +*************** +*** 886,892 **** + end_search_hl(); + # endif + +! reset_updating_screen(TRUE); + + # ifdef FEAT_GUI + /* Redraw the cursor and update the scrollbars when all screen updating is +--- 890,896 ---- + end_search_hl(); + # endif + +! after_updating_screen(TRUE); + + # ifdef FEAT_GUI + /* Redraw the cursor and update the scrollbars when all screen updating is +*** ../vim-8.1.1418/src/proto/screen.pro 2019-01-25 22:29:54.139821894 +0100 +--- src/proto/screen.pro 2019-05-29 22:19:19.390049606 +0200 +*************** +*** 10,16 **** + 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 update_curbuf(int type); + int update_screen(int type_arg); + int conceal_cursor_line(win_T *wp); +--- 10,16 ---- + int redraw_asap(int type); + void redraw_after_callback(int call_update_screen); + void redrawWinline(win_T *wp, linenr_T lnum); +! 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,24 **** + 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 rl_mirror(char_u *str); + void status_redraw_all(void); + void status_redraw_curbuf(void); +--- 18,24 ---- + 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 flags); + void rl_mirror(char_u *str); + void status_redraw_all(void); + void status_redraw_curbuf(void); +*** ../vim-8.1.1418/src/ui.c 2019-05-28 23:08:12.080648632 +0200 +--- src/ui.c 2019-05-29 22:17:59.906464725 +0200 +*************** +*** 691,697 **** + if (save_updating_screen) + updating_screen = TRUE; + else +! reset_updating_screen(FALSE); + + recursive = FALSE; + } +--- 691,697 ---- + if (save_updating_screen) + updating_screen = TRUE; + else +! after_updating_screen(FALSE); + + recursive = FALSE; + } +*** ../vim-8.1.1418/src/version.c 2019-05-29 21:44:30.764788713 +0200 +--- src/version.c 2019-05-29 22:23:54.116611053 +0200 +*************** +*** 769,770 **** +--- 769,772 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1419, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +47. You are so familiar with the WWW that you find the search engines useless. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |