patch 9.2.0197: tabpanel: frame width not updated for existing tab pages

Problem:  When 'showtabpanel' is set before any window exists (e.g. via
          --cmd) and multiple tab pages are opened with -p, the tabpanel
          appears when the second tab page is created.  At that point
          shell_new_columns() only updates the current (new) tab page's
          frame width; existing tab pages retain the wrong width.
Solution: After calling shell_new_columns() in win_new_tabpage(), iterate
          all other tab pages and update their frame widths with
          frame_new_width() (Hirohito Higashi).

related: #19730
closes:  #19734

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Hirohito Higashi <h.east.727@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Hirohito Higashi
2026-03-18 21:16:14 +00:00
committed by Christian Brabandt
parent 39ee7d17b9
commit a4cf812462
3 changed files with 39 additions and 0 deletions
+23
View File
@@ -849,4 +849,27 @@ function Test_tabpanel_with_cmdline_no_pum()
call StopVimInTerminal(buf)
endfunc
" When showtabpanel=1 and a second tab is opened, all existing tab pages must
" have their frame width updated, not just the newly created one.
function Test_tabpanel_showtabpanel_via_cmd_arg()
let tpl_width = 20 " default tpl_columns
set showtabpanel=1 noruler
" With one tab the tabpanel is hidden; no width reduction yet.
tabfirst
call assert_equal(&columns, winwidth(0))
" Opening a second tab makes the tabpanel visible; the first tab page must
" also get its frame width reduced.
tabnew
tabfirst
call assert_equal(&columns - tpl_width, winwidth(0),
\ 'first tab width after tabnew')
call assert_equal(tpl_width + 1, win_screenpos(0)[1],
\ 'first tab wincol after tabnew')
tabonly
set showtabpanel& noruler&
endfunc
" vim: shiftwidth=2 sts=2 expandtab
+2
View File
@@ -734,6 +734,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
197,
/**/
196,
/**/
+14
View File
@@ -4884,7 +4884,21 @@ win_new_tabpage(int after)
#endif
#if defined(FEAT_TABPANEL)
if (prev_columns != COLUMNS_WITHOUT_TPL())
{
tabpage_T *tp2;
int w = COLUMNS_WITHOUT_TPL();
shell_new_columns();
// shell_new_columns() only updates the current tab page; fix up
// all others.
FOR_ALL_TABPAGES(tp2)
if (tp2 != curtab)
{
frame_new_width(tp2->tp_topframe, w, FALSE, TRUE);
if (!frame_check_width(tp2->tp_topframe, w))
frame_new_width(tp2->tp_topframe, w, FALSE, FALSE);
}
}
#endif
redraw_all_later(UPD_NOT_VALID);
apply_autocmds(EVENT_WINNEW, NULL, NULL, FALSE, curbuf);