diff options
author | luukvbaal <luukvbaal@gmail.com> | 2023-04-24 16:22:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-24 15:22:11 +0100 |
commit | bab4bcdefbdad7f175f7f31c230de3d066963542 (patch) | |
tree | e9776ab11d47ffeae39d0109d5837a2f787ccec8 | |
parent | c1331a65dd12dd1128db5fb136a77218ef7376f1 (diff) | |
download | rneovim-bab4bcdefbdad7f175f7f31c230de3d066963542.tar.gz rneovim-bab4bcdefbdad7f175f7f31c230de3d066963542.tar.bz2 rneovim-bab4bcdefbdad7f175f7f31c230de3d066963542.zip |
fix(column): don't reset 'statuscolumn' width after it has been drawn
Problem: 'statuscolumn' width may be reset after it has been drawn
when multiple windows contain the same buffer. This results
in an offset for the drawn cursor position.
Solution: Loop over all windows (twice) prior to drawing them to
reset the 'statuscolumn' width and validate the sign
column when necessary.
-rw-r--r-- | src/nvim/drawscreen.c | 14 | ||||
-rw-r--r-- | src/nvim/option.c | 23 |
2 files changed, 21 insertions, 16 deletions
diff --git a/src/nvim/drawscreen.c b/src/nvim/drawscreen.c index 71dbbdabfc..aa819c01a3 100644 --- a/src/nvim/drawscreen.c +++ b/src/nvim/drawscreen.c @@ -574,9 +574,9 @@ int update_screen(void) draw_tabline(); } - // Correct stored syntax highlighting info for changes in each displayed - // buffer. Each buffer must only be done once. FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { + // Correct stored syntax highlighting info for changes in each displayed + // buffer. Each buffer must only be done once. update_window_hl(wp, type >= UPD_NOT_VALID || hl_changed); buf_T *buf = wp->w_buffer; @@ -592,6 +592,11 @@ int update_screen(void) buf->b_mod_tick_decor = display_tick; } } + + // Reset 'statuscolumn' if there is no dedicated signcolumn but it is invalid. + if (*wp->w_p_stc != NUL && !wp->w_buffer->b_signcols.valid && win_no_signcol(wp)) { + wp->w_nrwidth_line_count = 0; + } } // Go from top to bottom through the windows, redrawing the ones that need it. @@ -599,6 +604,11 @@ int update_screen(void) screen_search_hl.rm.regprog = NULL; FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { + // Validate b_signcols if there is no dedicated signcolumn but 'statuscolumn' is set. + if (*wp->w_p_stc != NUL && win_no_signcol(wp)) { + buf_signcols(wp->w_buffer, 0); + } + if (wp->w_redr_type == UPD_CLEAR && wp->w_floating && wp->w_grid_alloc.chars) { grid_invalidate(&wp->w_grid_alloc); wp->w_redr_type = UPD_NOT_VALID; diff --git a/src/nvim/option.c b/src/nvim/option.c index 69e7bb4b21..0ad11fb3cb 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -5947,6 +5947,14 @@ int win_signcol_count(win_T *wp) return win_signcol_configured(wp, NULL); } +/// Return true when window "wp" has no sign column. +bool win_no_signcol(win_T *wp) +{ + const char *scl = wp->w_p_scl; + return (*scl == 'n' && (*(scl + 1) == 'o' || (*(scl + 1) == 'u' + && (wp->w_p_nu || wp->w_p_rnu)))); +} + /// Return the number of requested sign columns, based on user / configuration. int win_signcol_configured(win_T *wp, int *is_fixed) { @@ -5956,20 +5964,7 @@ int win_signcol_configured(win_T *wp, int *is_fixed) *is_fixed = 1; } - // Note: It checks "no" or "number" in 'signcolumn' option - if (*scl == 'n' - && (*(scl + 1) == 'o' || (*(scl + 1) == 'u' - && (wp->w_p_nu || wp->w_p_rnu)))) { - if (!wp->w_buffer->b_signcols.valid) { - FOR_ALL_WINDOWS_IN_TAB(win, curtab) { - if (*win->w_p_stc != NUL) { - win->w_nrwidth_line_count = 0; - } - } - } - if (*wp->w_p_stc != NUL) { - buf_signcols(wp->w_buffer, 0); - } + if (win_no_signcol(wp)) { return 0; } |