# HG changeset patch # User Bram Moolenaar # Date 1684588505 -7200 # Node ID 87f59a64efab7e1a722d253b993ca1c2904b7139 # Parent 8117806f2947fdea32e93a2f309492f28562a781 patch 9.0.1571: RedrawingDisabled not used consistently Commit: https://github.com/vim/vim/commit/79cdf026f1b8a16298ee73be497c4bd5f3458cde Author: Bram Moolenaar Date: Sat May 20 14:07:00 2023 +0100 patch 9.0.1571: RedrawingDisabled not used consistently Problem: RedrawingDisabled not used consistently. Solution: Avoid RedrawingDisabled going negative. Set RedrawingDisabled in win_split_ins(). (closes #11961) diff --git a/src/autocmd.c b/src/autocmd.c --- a/src/autocmd.c +++ b/src/autocmd.c @@ -1602,10 +1602,7 @@ aucmd_prepbuf( p_acd = FALSE; #endif - // no redrawing and don't set the window title - ++RedrawingDisabled; (void)win_split_ins(0, WSP_TOP, auc_win, 0); - --RedrawingDisabled; (void)win_comp_pos(); // recompute window positions p_ea = save_ea; #ifdef FEAT_AUTOCHDIR @@ -2334,7 +2331,8 @@ apply_autocmds_group( active_apc_list = patcmd.next; } - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; autocmd_busy = save_autocmd_busy; filechangeshell_busy = FALSE; autocmd_nested = save_autocmd_nested; diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -2506,11 +2506,10 @@ buflist_getfile( } ++RedrawingDisabled; + int retval = FAIL; if (GETFILE_SUCCESS(getfile(buf->b_fnum, NULL, NULL, (options & GETF_SETMARK), lnum, forceit))) { - --RedrawingDisabled; - // cursor is at to BOL and w_cursor.lnum is checked due to getfile() if (!p_sol && col != 0) { @@ -2519,10 +2518,12 @@ buflist_getfile( curwin->w_cursor.coladd = 0; curwin->w_set_curswant = TRUE; } - return OK; + retval = OK; } - --RedrawingDisabled; - return FAIL; + + if (RedrawingDisabled > 0) + --RedrawingDisabled; + return retval; } /* diff --git a/src/cmdexpand.c b/src/cmdexpand.c --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -3937,14 +3937,12 @@ wildmenu_process_key(cmdline_info_T *ccl wildmenu_cleanup(cmdline_info_T *cclp UNUSED) { int skt = KeyTyped; -#ifdef FEAT_EVAL - int old_RedrawingDisabled = RedrawingDisabled; -#endif if (!p_wmnu || wild_menu_showing == 0) return; #ifdef FEAT_EVAL + int save_RedrawingDisabled = RedrawingDisabled; if (cclp->input_fn) RedrawingDisabled = 0; #endif @@ -3974,7 +3972,7 @@ wildmenu_cleanup(cmdline_info_T *cclp UN wild_menu_showing = 0; #ifdef FEAT_EVAL if (cclp->input_fn) - RedrawingDisabled = old_RedrawingDisabled; + RedrawingDisabled = save_RedrawingDisabled; #endif } diff --git a/src/debugger.c b/src/debugger.c --- a/src/debugger.c +++ b/src/debugger.c @@ -287,7 +287,8 @@ do_debug(char_u *cmd) } vim_free(cmdline); - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; --no_wait_return; redraw_all_later(UPD_NOT_VALID); need_wait_return = FALSE; diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -3613,7 +3613,8 @@ ins_esc( temp = curwin->w_cursor.col; if (disabled_redraw) { - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; disabled_redraw = FALSE; } if (!arrow_used) diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -3219,7 +3219,8 @@ do_ecmd( (void)keymap_init(); #endif - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; did_inc_redrawing_disabled = FALSE; if (!skip_redraw) { @@ -3263,7 +3264,7 @@ do_ecmd( #endif theend: - if (did_inc_redrawing_disabled) + if (did_inc_redrawing_disabled && RedrawingDisabled > 0) --RedrawingDisabled; #if defined(FEAT_EVAL) if (did_set_swapcommand) @@ -3735,7 +3736,6 @@ ex_substitute(exarg_T *eap) int sublen; int got_quit = FALSE; int got_match = FALSE; - int temp; int which_pat; char_u *cmd; int save_State; @@ -4316,7 +4316,7 @@ ex_substitute(exarg_T *eap) #endif // Invert the matched string. // Remove the inversion afterwards. - temp = RedrawingDisabled; + int save_RedrawingDisabled = RedrawingDisabled; RedrawingDisabled = 0; // avoid calling update_screen() in vgetorpeek() @@ -4386,7 +4386,7 @@ ex_substitute(exarg_T *eap) msg_scroll = i; showruler(TRUE); windgoto(msg_row, msg_col); - RedrawingDisabled = temp; + RedrawingDisabled = save_RedrawingDisabled; #ifdef USE_ON_FLY_SCROLL dont_scroll = FALSE; // allow scrolling here diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -550,7 +550,8 @@ do_exmode( #ifdef FEAT_GUI --hold_gui_events; #endif - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; --no_wait_return; update_screen(UPD_CLEAR); need_wait_return = FALSE; @@ -631,7 +632,7 @@ do_cmdline( static int recursive = 0; // recursive depth int msg_didout_before_start = 0; int count = 0; // line number count - int did_inc = FALSE; // incremented RedrawingDisabled + int did_inc_RedrawingDisabled = FALSE; int retval = OK; #ifdef FEAT_EVAL cstack_T cstack; // conditional stack @@ -977,7 +978,7 @@ do_cmdline( msg_scroll = TRUE; // put messages below each other ++no_wait_return; // don't wait for return until finished ++RedrawingDisabled; - did_inc = TRUE; + did_inc_RedrawingDisabled = TRUE; } } @@ -1336,9 +1337,10 @@ do_cmdline( * hit return before redrawing the screen. With the ":global" command we do * this only once after the command is finished. */ - if (did_inc) - { - --RedrawingDisabled; + if (did_inc_RedrawingDisabled) + { + if (RedrawingDisabled > 0) + --RedrawingDisabled; --no_wait_return; msg_scroll = FALSE; @@ -7170,7 +7172,7 @@ do_exedit( if (exmode_was != EXMODE_VIM) settmode(TMODE_RAW); - int save_rd = RedrawingDisabled; + int save_RedrawingDisabled = RedrawingDisabled; RedrawingDisabled = 0; int save_nwr = no_wait_return; no_wait_return = 0; @@ -7187,7 +7189,7 @@ do_exedit( main_loop(FALSE, TRUE); pending_exmode_active = FALSE; - RedrawingDisabled = save_rd; + RedrawingDisabled = save_RedrawingDisabled; no_wait_return = save_nwr; msg_scroll = save_ms; #ifdef FEAT_GUI @@ -8438,11 +8440,12 @@ ex_redraw(exarg_T *eap) void redraw_cmd(int clear) { - int r = RedrawingDisabled; - int p = p_lz; - + int save_RedrawingDisabled = RedrawingDisabled; RedrawingDisabled = 0; + + int save_p_lz = p_lz; p_lz = FALSE; + validate_cursor(); update_topline(); update_screen(clear ? UPD_CLEAR : VIsual_active ? UPD_INVERTED : 0); @@ -8454,8 +8457,8 @@ redraw_cmd(int clear) # endif resize_console_buf(); #endif - RedrawingDisabled = r; - p_lz = p; + RedrawingDisabled = save_RedrawingDisabled; + p_lz = save_p_lz; // After drawing the statusline screen_attr may still be set. screen_stop_highlight(); @@ -8480,9 +8483,6 @@ redraw_cmd(int clear) static void ex_redrawstatus(exarg_T *eap UNUSED) { - int r = RedrawingDisabled; - int p = p_lz; - if (eap->forceit) status_redraw_all(); else @@ -8490,14 +8490,18 @@ ex_redrawstatus(exarg_T *eap UNUSED) if (msg_scrolled && (State & MODE_CMDLINE)) return; // redraw later + int save_RedrawingDisabled = RedrawingDisabled; RedrawingDisabled = 0; + + int save_p_lz = p_lz; p_lz = FALSE; + if (State & MODE_CMDLINE) redraw_statuslines(); else update_screen(VIsual_active ? UPD_INVERTED : 0); - RedrawingDisabled = r; - p_lz = p; + RedrawingDisabled = save_RedrawingDisabled; + p_lz = save_p_lz; out_flush(); } @@ -8507,16 +8511,16 @@ ex_redrawstatus(exarg_T *eap UNUSED) static void ex_redrawtabline(exarg_T *eap UNUSED) { - int r = RedrawingDisabled; - int p = p_lz; - + int save_RedrawingDisabled = RedrawingDisabled; RedrawingDisabled = 0; + + int save_p_lz = p_lz; p_lz = FALSE; draw_tabline(); - RedrawingDisabled = r; - p_lz = p; + RedrawingDisabled = save_RedrawingDisabled; + p_lz = save_p_lz; out_flush(); } diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -4545,7 +4545,7 @@ open_cmdwin(void) if (restart_edit != 0) // autocmd with ":startinsert" stuffcharReadbuff(K_NOP); - i = RedrawingDisabled; + int save_RedrawingDisabled = RedrawingDisabled; RedrawingDisabled = 0; /* @@ -4553,7 +4553,7 @@ open_cmdwin(void) */ main_loop(TRUE, FALSE); - RedrawingDisabled = i; + RedrawingDisabled = save_RedrawingDisabled; # ifdef FEAT_FOLDING save_KeyTyped = KeyTyped; diff --git a/src/insexpand.c b/src/insexpand.c --- a/src/insexpand.c +++ b/src/insexpand.c @@ -2969,12 +2969,13 @@ f_complete_add(typval_T *argvars, typval void f_complete_check(typval_T *argvars UNUSED, typval_T *rettv) { - int saved = RedrawingDisabled; - + int save_RedrawingDisabled = RedrawingDisabled; RedrawingDisabled = 0; + ins_compl_check_keys(0, TRUE); rettv->vval.v_number = ins_compl_interrupted(); - RedrawingDisabled = saved; + + RedrawingDisabled = save_RedrawingDisabled; } /* @@ -5079,8 +5080,7 @@ ins_complete(int c, int enable_pum) show_pum(int prev_w_wrow, int prev_w_leftcol) { // RedrawingDisabled may be set when invoked through complete(). - int n = RedrawingDisabled; - + int save_RedrawingDisabled = RedrawingDisabled; RedrawingDisabled = 0; // If the cursor moved or the display scrolled we need to remove the pum @@ -5091,7 +5091,8 @@ show_pum(int prev_w_wrow, int prev_w_lef ins_compl_show_pum(); setcursor(); - RedrawingDisabled = n; + + RedrawingDisabled = save_RedrawingDisabled; } /* diff --git a/src/os_unix.c b/src/os_unix.c --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4594,7 +4594,7 @@ mch_call_shell_terminal( // Only require pressing Enter when redrawing, to avoid that system() gets // the hit-enter prompt even though it didn't output anything. - if (!RedrawingDisabled) + if (RedrawingDisabled == 0) wait_return(TRUE); do_buffer(DOBUF_WIPE, DOBUF_FIRST, FORWARD, buf->b_fnum, TRUE); diff --git a/src/popupmenu.c b/src/popupmenu.c --- a/src/popupmenu.c +++ b/src/popupmenu.c @@ -865,7 +865,8 @@ pum_set_selected(int n, int repeat UNUSE ++no_u_sync; resized = prepare_tagpreview(FALSE, FALSE, use_popup); --no_u_sync; - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; g_do_tagpreview = 0; if (curwin->w_p_pvw diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -2696,7 +2696,8 @@ give_up: #endif entered = FALSE; - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; /* * Do not apply autocommands more than 3 times to avoid an endless loop @@ -4496,7 +4497,7 @@ redrawing(void) return 0; else #endif - return ((!RedrawingDisabled + return ((RedrawingDisabled == 0 #ifdef FEAT_EVAL || ignore_redraw_flag_for_testing #endif diff --git a/src/tag.c b/src/tag.c --- a/src/tag.c +++ b/src/tag.c @@ -3829,7 +3829,8 @@ jumpto_tag( if (win_split(postponed_split > 0 ? postponed_split : 0, postponed_split_flags) == FAIL) { - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; goto erret; } RESET_BINDING(curwin); @@ -4032,11 +4033,13 @@ jumpto_tag( } #endif - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; } else { - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; got_int = FALSE; // don't want entering window to fail if (postponed_split) // close the window diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -3048,7 +3048,8 @@ call_user_func( // Invoke functions added with ":defer". handle_defer_one(current_funccal); - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; // when the function was aborted because of an error, return -1 if ((did_emsg && (fp->uf_flags & FC_ABORT)) || rettv->v_type == VAR_UNKNOWN) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1571, +/**/ 1570, /**/ 1569, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -950,6 +950,10 @@ win_split_ins( int minheight; int wmh1; int did_set_fraction = FALSE; + int retval = FAIL; + + // Do not redraw here, curwin->w_buffer may be invalid. + ++RedrawingDisabled; if (flags & WSP_TOP) oldwin = firstwin; @@ -964,7 +968,7 @@ win_split_ins( if (VISIBLE_HEIGHT(oldwin) <= p_wmh && new_wp == NULL) { emsg(_(e_not_enough_room)); - return FAIL; + goto theend; } need_status = STATUS_HEIGHT; } @@ -1022,7 +1026,7 @@ win_split_ins( if (available < needed && new_wp == NULL) { emsg(_(e_not_enough_room)); - return FAIL; + goto theend; } if (new_size == 0) new_size = oldwin->w_width / 2; @@ -1105,7 +1109,7 @@ win_split_ins( if (available < needed && new_wp == NULL) { emsg(_(e_not_enough_room)); - return FAIL; + goto theend; } oldwin_height = oldwin->w_height; if (need_status) @@ -1188,13 +1192,13 @@ win_split_ins( if (new_wp == NULL) { if (wp == NULL) - return FAIL; + goto theend; new_frame(wp); if (wp->w_frame == NULL) { win_free(wp, NULL); - return FAIL; + goto theend; } // make the contents of the new window the same as the current one @@ -1435,8 +1439,12 @@ win_split_ins( p_wiw = i; else p_wh = i; - - return OK; + retval = OK; + +theend: + if (RedrawingDisabled > 0) + --RedrawingDisabled; + return retval; } @@ -2460,7 +2468,8 @@ close_windows( } } - --RedrawingDisabled; + if (RedrawingDisabled > 0) + --RedrawingDisabled; if (count != tabpage_index(NULL)) apply_autocmds(EVENT_TABCLOSED, NULL, NULL, FALSE, curbuf);