]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0197: tabpanel: frame width not updated for existing tab pages v9.2.0197
authorHirohito Higashi <h.east.727@gmail.com>
Wed, 18 Mar 2026 21:16:14 +0000 (21:16 +0000)
committerChristian Brabandt <cb@256bit.org>
Wed, 18 Mar 2026 21:16:14 +0000 (21:16 +0000)
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>
src/testdir/test_tabpanel.vim
src/version.c
src/window.c

index 6e401c0fda3df781137a324c40f282bab677803e..556cc3b834ec3f3e1b1e8ee674e437b112a913fa 100644 (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
index 73c466b41e176a8ed881a72376fd6ba786cd407f..9d5bbf02dabffc37c5aec64be5147da54adfa6bf 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    197,
 /**/
     196,
 /**/
index 390c084fa6744a2f1f634b84e3c6280e2cd734e1..b0f4574b37a37779abe2e96a0bbd556cd41894d9 100644 (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);