patch 9.1.0100: Redrawing can be improved with undo and 'spell' Commit: https://github.com/vim/vim/commit/f2d90a351159fd6843f450850f52004f42e00183 Author: zeertzjq <zeert...@outlook.com> Date: Mon Feb 12 20:28:01 2024 +0100
patch 9.1.0100: Redrawing can be improved with undo and 'spell' Problem: When undoing with 'spell', redrawWinline() is called after changed_lines(), while later win_update() sets redraw type to UPD_NOT_VALID, even though w_redraw_top and w_redraw_bot are still valid. Solution: Only set redraw type to UPD_NOT_VALID when inserting/deleting lines after parts of window has pending redraw, i.e., when changed_lines() is called after redrawWinline(). (zeertzjq) closes: #14019 Signed-off-by: zeertzjq <zeert...@outlook.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/src/change.c b/src/change.c index 0ea424f98..42e6f7939 100644 --- a/src/change.c +++ b/src/change.c @@ -559,6 +559,12 @@ changed_common( if (!redraw_not_allowed && wp->w_redr_type < UPD_VALID) wp->w_redr_type = UPD_VALID; + // When inserting/deleting lines and the window has specific lines + // to be redrawn, w_redraw_top and w_redraw_bot may now be invalid, + // so just redraw everything. + if (xtra != 0 && wp->w_redraw_top != 0) + redraw_win_later(wp, UPD_NOT_VALID); + // Reset "w_skipcol" if the topline length has become smaller to // such a degree that nothing will be visible anymore, accounting // for 'smoothscroll' <<< or 'listchars' "precedes" marker. diff --git a/src/drawscreen.c b/src/drawscreen.c index d1773701d..852d33182 100644 --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -1408,7 +1408,7 @@ fold_line( * - if wp->w_buffer->b_mod_set set, update lines between * b_mod_top and b_mod_bot. * - if wp->w_redraw_top non-zero, redraw lines between - * wp->w_redraw_top and wp->w_redr_bot. + * wp->w_redraw_top and wp->w_redraw_bot. * - continue redrawing when syntax status is invalid. * 4. if scrolled up, update lines at the bottom. * This results in three areas that may need updating: @@ -1567,14 +1567,6 @@ win_update(win_T *wp) else #endif - if (buf->b_mod_set && buf->b_mod_xlines != 0 && wp->w_redraw_top != 0) - { - // When there are both inserted/deleted lines and specific lines to be - // redrawn, w_redraw_top and w_redraw_bot may be invalid, just redraw - // everything (only happens when redrawing is off for while). - type = UPD_NOT_VALID; - } - else { // Set mod_top to the first line that needs displaying because of // changes. Set mod_bot to the first line after the changes. diff --git a/src/popupwin.c b/src/popupwin.c index 64bb0b5be..bdf4ac7cf 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -3899,8 +3899,8 @@ may_update_popup_mask(int type) // The screen position "line" / "col" needs to be // redrawn. Figure out what window that is and update - // w_redraw_top and w_redr_bot. Only needs to be done - // once for each window line. + // w_redraw_top and w_redraw_bot. Only needs to be + // done once for each window line. wp = mouse_find_win(&line_cp, &col_cp, IGNORE_POPUP); if (wp != NULL) { diff --git a/src/version.c b/src/version.c index 7a9172a66..602a2f96a 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 100, /**/ 99, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/E1rZcEf-00BFWV-Vp%40256bit.org.