diff options
author | luukvbaal <luukvbaal@gmail.com> | 2025-03-17 21:52:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-17 21:52:45 +0100 |
commit | 063b69bab4ab64b614e31ab0c93279fdbebb40b7 (patch) | |
tree | ede33c995366832fe3a7dab1c3d2b8a298c5b638 /src/nvim/drawscreen.c | |
parent | 5440e59247b690e990244be793b1ffd1cb5b8e80 (diff) | |
download | rneovim-063b69bab4ab64b614e31ab0c93279fdbebb40b7.tar.gz rneovim-063b69bab4ab64b614e31ab0c93279fdbebb40b7.tar.bz2 rneovim-063b69bab4ab64b614e31ab0c93279fdbebb40b7.zip |
fix(column): unnecessary redraws with resized 'statuscolumn' (#32944)
Problem: Since 3cb1e825, all windows with 'statuscolumn' set, and a
resized 'signcolumn' for a particular buffer are marked
to be fully redrawn when the first window is encountered.
The "resized" variable is only unset after all windows have
been drawn, so this results in windows that have just been
draw to be marked for redraw again, even though the
signcolumn did not change size again.
Solution: Replace the `resized` variable with a `last_max` variable that
is changed when the first window into buf is encountered.
Diffstat (limited to 'src/nvim/drawscreen.c')
-rw-r--r-- | src/nvim/drawscreen.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/src/nvim/drawscreen.c b/src/nvim/drawscreen.c index 35dcbf295b..4c1b756ea1 100644 --- a/src/nvim/drawscreen.c +++ b/src/nvim/drawscreen.c @@ -671,11 +671,10 @@ int update_screen(void) win_check_ns_hl(NULL); - // Reset b_mod_set and b_signcols.resized flags. Going through all windows is - // probably faster than going through all buffers (there could be many buffers). + // Reset b_mod_set. Going through all windows is probably faster than going + // through all buffers (there could be many buffers). FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { wp->w_buffer->b_mod_set = false; - wp->w_buffer->b_signcols.resized = false; } updating_screen = false; @@ -1242,12 +1241,11 @@ static bool win_redraw_signcols(win_T *wp) } while (buf->b_signcols.max > 0 && buf->b_signcols.count[buf->b_signcols.max - 1] == 0) { - buf->b_signcols.resized = true; buf->b_signcols.max--; } int width = MIN(wp->w_maxscwidth, buf->b_signcols.max); - bool rebuild_stc = buf->b_signcols.resized && *wp->w_p_stc != NUL; + bool rebuild_stc = buf->b_signcols.max != buf->b_signcols.last_max && *wp->w_p_stc != NUL; if (rebuild_stc) { wp->w_nrwidth_line_count = 0; @@ -1536,11 +1534,11 @@ static void win_update(win_T *wp) FOR_ALL_WINDOWS_IN_TAB(win, curtab) { if (win->w_buffer == wp->w_buffer && win_redraw_signcols(win)) { - win->w_lines_valid = 0; changed_line_abv_curs_win(win); redraw_later(win, UPD_NOT_VALID); } } + buf->b_signcols.last_max = buf->b_signcols.max; init_search_hl(wp, &screen_search_hl); |