diff options
author | Famiu Haque <famiuhaque@protonmail.com> | 2022-07-20 13:58:57 +0600 |
---|---|---|
committer | Famiu Haque <famiuhaque@protonmail.com> | 2022-07-20 20:32:22 +0600 |
commit | 9879fd5d087cc3939f91f4714b0f95f03a78c011 (patch) | |
tree | bd2f505d1965f10868fa85882ab5168900bb65e3 | |
parent | 5ccdf6a88d5790382ad3da6bb908c606765754e0 (diff) | |
download | rneovim-9879fd5d087cc3939f91f4714b0f95f03a78c011.tar.gz rneovim-9879fd5d087cc3939f91f4714b0f95f03a78c011.tar.bz2 rneovim-9879fd5d087cc3939f91f4714b0f95f03a78c011.zip |
fix: local winbar with tabs
Closes #19396
-rw-r--r-- | src/nvim/option.c | 3 | ||||
-rw-r--r-- | src/nvim/window.c | 69 | ||||
-rw-r--r-- | test/functional/ui/winbar_spec.lua | 45 |
3 files changed, 89 insertions, 28 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c index 821c7208e3..571d47e38e 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -3021,7 +3021,7 @@ ambw_end: } // add / remove window bars for 'winbar' if (gvarp == (char_u **)&p_wbr) { - set_winbar(); + set_winbar(true); } } else if (gvarp == &p_cpt) { // check if it is a valid value for 'complete' -- Acevedo @@ -6455,6 +6455,7 @@ void didset_window_options(win_T *wp) set_chars_option(wp, &wp->w_p_lcs, true); parse_winhl_opt(wp); // sets w_hl_needs_update also for w_p_winbl check_blending(wp); + set_winbar_win(wp, false); wp->w_grid_alloc.blending = wp->w_p_winbl > 0; } diff --git a/src/nvim/window.c b/src/nvim/window.c index 06231150d5..909b02083e 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -4111,7 +4111,6 @@ int win_new_tabpage(int after, char_u *filename) newtp->tp_topframe = topframe; last_status(false); - set_winbar(); redraw_all_later(NOT_VALID); @@ -6740,34 +6739,50 @@ static void last_status_rec(frame_T *fr, bool statusline, bool is_stl_global) } } -// Add or remove window bars from windows depending on the value of 'winbar'. -void set_winbar(void) -{ - FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { - // Require the local value to be set in order to show winbar on a floating window. - int winbar_height = wp->w_floating ? ((*wp->w_p_wbr != NUL) ? 1 : 0) - : ((*p_wbr != NUL || *wp->w_p_wbr != NUL) ? 1 : 0); - - if (wp->w_winbar_height != winbar_height) { - if (winbar_height == 1 && wp->w_height_inner <= 1) { - if (wp->w_floating) { - emsg(_(e_noroom)); - continue; - } else if (!resize_frame_for_winbar(wp->w_frame)) { - return; - } +/// Add or remove window bar from window "wp". +/// +/// @param make_room Whether to resize frames to make room for winbar. +/// +/// @return Success status. +int set_winbar_win(win_T *wp, bool make_room) +{ + // Require the local value to be set in order to show winbar on a floating window. + int winbar_height = wp->w_floating ? ((*wp->w_p_wbr != NUL) ? 1 : 0) + : ((*p_wbr != NUL || *wp->w_p_wbr != NUL) ? 1 : 0); + + if (wp->w_winbar_height != winbar_height) { + if (winbar_height == 1 && wp->w_height_inner <= 1) { + if (wp->w_floating) { + emsg(_(e_noroom)); + return NOTDONE; + } else if (!make_room || !resize_frame_for_winbar(wp->w_frame)) { + return FAIL; } - wp->w_winbar_height = winbar_height; - win_set_inner_size(wp); - wp->w_redr_status = wp->w_redr_status || winbar_height; + } + wp->w_winbar_height = winbar_height; + win_set_inner_size(wp); + wp->w_redr_status = wp->w_redr_status || winbar_height; - if (winbar_height == 0) { - // When removing winbar, deallocate the w_winbar_click_defs array - stl_clear_click_defs(wp->w_winbar_click_defs, wp->w_winbar_click_defs_size); - xfree(wp->w_winbar_click_defs); - wp->w_winbar_click_defs_size = 0; - wp->w_winbar_click_defs = NULL; - } + if (winbar_height == 0) { + // When removing winbar, deallocate the w_winbar_click_defs array + stl_clear_click_defs(wp->w_winbar_click_defs, wp->w_winbar_click_defs_size); + xfree(wp->w_winbar_click_defs); + wp->w_winbar_click_defs_size = 0; + wp->w_winbar_click_defs = NULL; + } + } + + return OK; +} + +/// Add or remove window bars from all windows in tab depending on the value of 'winbar'. +/// +/// @param make_room Whether to resize frames to make room for winbar. +void set_winbar(bool make_room) +{ + FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { + if (set_winbar_win(wp, make_room) == FAIL) { + break; } } } diff --git a/test/functional/ui/winbar_spec.lua b/test/functional/ui/winbar_spec.lua index 92a6ab2e84..60fa10da87 100644 --- a/test/functional/ui/winbar_spec.lua +++ b/test/functional/ui/winbar_spec.lua @@ -578,3 +578,48 @@ describe('winbar', function() eq('Vim(set):E36: Not enough room', pcall_err(command, 'set winbar=test')) end) end) + +it('local winbar works with tabs', function() + clear() + local screen = Screen.new(60, 13) + screen:attach() + screen:set_default_attr_ids({ + [1] = {bold = true}, + [2] = {reverse = true}, + [3] = {bold = true, foreground = Screen.colors.Blue}, + [4] = {underline = true, background = Screen.colors.LightGray} + }) + meths.set_option_value('winbar', 'foo', { scope = 'local', win = 0 }) + command('tabnew') + screen:expect([[ + {4: [No Name] }{1: [No Name] }{2: }{4:X}| + ^ | + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + | + ]]) + command('tabnext') + screen:expect{grid=[[ + {1: [No Name] }{4: [No Name] }{2: }{4:X}| + {1:foo }| + ^ | + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + {3:~ }| + | + ]]} +end) |