aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/option.c3
-rw-r--r--src/nvim/window.c69
-rw-r--r--test/functional/ui/winbar_spec.lua45
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)