patch 9.1.1458: tabpanel: tabs not properly updated with 'stpl'

Problem:  tabpanel: tabs not properly updated with 'stpl'
Solution: remember the Column offset per tabpage
          (Hirohito Higashi)

fixes: #17519
closes: #17544

Signed-off-by: Hirohito Higashi <h.east.727@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/structs.h b/src/structs.h
index 55181eb..250dc2f 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -3654,6 +3654,7 @@
     long	    tp_old_Rows;    // Rows when Tab page was left
     long	    tp_old_Columns; // Columns when Tab page was left, -1 when
 				    // calling shell_new_columns() postponed
+    int		    tp_old_coloff;  // Column offset when Tab page was left
     long	    tp_ch_used;	    // value of 'cmdheight' when frame size
 				    // was set
 #ifdef FEAT_GUI
diff --git a/src/tabpanel.c b/src/tabpanel.c
index 260768a..d0f2d15 100644
--- a/src/tabpanel.c
+++ b/src/tabpanel.c
@@ -106,7 +106,6 @@
     tpl_is_vert = new_is_vert;
 
     shell_new_columns();
-    redraw_tabpanel = TRUE;
 
     if (do_equal)
 	win_equal(curwin, FALSE, 0);
diff --git a/src/term.c b/src/term.c
index 6f7983b..c7ac8ab 100644
--- a/src/term.c
+++ b/src/term.c
@@ -3614,8 +3614,10 @@
 {
     static int	old_Rows = 0;
     static int	old_Columns = 0;
+    static int	old_coloff = 0;
 
-    if (old_Rows != Rows || old_Columns != Columns)
+    if (old_Rows != Rows || old_Columns != COLUMNS_WITHOUT_TPL()
+	    || old_coloff != TPL_LCOL(NULL))
 	ui_new_shellsize();
     if (old_Rows != Rows)
     {
@@ -3627,20 +3629,12 @@
 	old_Rows = Rows;
 	shell_new_rows();	// update window sizes
     }
-    if (old_Columns != Columns)
+    if (old_Columns != COLUMNS_WITHOUT_TPL() || old_coloff != TPL_LCOL(NULL))
     {
-	old_Columns = Columns;
+	old_Columns = COLUMNS_WITHOUT_TPL();
+	old_coloff = TPL_LCOL(NULL);
 
-	tabpage_T *save_curtab = curtab;
-	tabpage_T *tp;
-	FOR_ALL_TABPAGES(tp)
-	{
-	    unuse_tabpage(curtab);
-	    use_tabpage(tp);
-	    shell_new_columns();
-	}
-	unuse_tabpage(curtab);
-	use_tabpage(save_curtab);
+	shell_new_columns();
     }
 }
 
diff --git a/src/testdir/dumps/Test_tabpanel_stpl_eq_0_0.dump b/src/testdir/dumps/Test_tabpanel_stpl_eq_0_0.dump
new file mode 100644
index 0000000..8a25711
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_stpl_eq_0_0.dump
@@ -0,0 +1,10 @@
+| +8#0000001#e0e0e08|+| |[|N|o| |N|a|m|e|]| | +2#0000000#ffffff0|0@3| | +1&&@57|X+8#0000001#e0e0e08
+> +0#0000000#ffffff0@77
+|~+0#4040ff13&| @76
+|~| @76
+|~| @76
+|~| @76
+|~| @76
+|~| @76
+|~| @76
+| +0#0000000&@77
diff --git a/src/testdir/dumps/Test_tabpanel_stpl_eq_0_1.dump b/src/testdir/dumps/Test_tabpanel_stpl_eq_0_1.dump
new file mode 100644
index 0000000..2ed5307
--- /dev/null
+++ b/src/testdir/dumps/Test_tabpanel_stpl_eq_0_1.dump
@@ -0,0 +1,10 @@
+| +2&#ffffff0|+| |[|N|o| |N|a|m|e|]| | +8#0000001#e0e0e08|0@3| | +1#0000000#ffffff0@57|X+8#0000001#e0e0e08
+>a+0#0000000#ffffff0@2| @74
+|b@2| @74
+|c@2| @74
+|d@2| @74
+|~+0#4040ff13&| @76
+|~| @76
+|~| @76
+|~| @76
+| +0#0000000&@77
diff --git a/src/testdir/test_tabpanel.vim b/src/testdir/test_tabpanel.vim
index 959734f..0d79650 100644
--- a/src/testdir/test_tabpanel.vim
+++ b/src/testdir/test_tabpanel.vim
@@ -10,6 +10,25 @@
   set showtabpanel&
 endfunc
 
+function Test_tabpanel_showtabpanel_eq_0()
+  CheckScreendump
+
+  let lines =<< trim END
+    set showtabpanel=2
+    set noruler
+    call setbufline(bufnr(), 1, ['aaa','bbb','ccc','ddd'])
+    tabnew 0000
+  END
+  call writefile(lines, 'XTest_tabpanel_stpl_eq_0', 'D')
+
+  let buf = RunVimInTerminal('-S XTest_tabpanel_stpl_eq_0', {'rows': 10, 'cols': 78})
+  call term_sendkeys(buf, ":set showtabpanel=0\<CR>\<C-L>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_stpl_eq_0_0', {})
+  call term_sendkeys(buf, ":tabnext\<CR>\<C-L>")
+  call VerifyScreenDump(buf, 'Test_tabpanel_stpl_eq_0_1', {})
+  call StopVimInTerminal(buf)
+endfunc
+
 function Test_tabpanel_showtabpanel_eq_1()
   CheckScreendump
 
diff --git a/src/version.c b/src/version.c
index a9e7385..570a088 100644
--- a/src/version.c
+++ b/src/version.c
@@ -710,6 +710,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1458,
+/**/
     1457,
 /**/
     1456,
diff --git a/src/window.c b/src/window.c
index f3b23e8..52f4b1a 100644
--- a/src/window.c
+++ b/src/window.c
@@ -3463,9 +3463,6 @@
 	redraw_tabline = TRUE;
 	if (h != tabline_height())
 	    shell_new_rows();
-#if defined(FEAT_TABPANEL)
-	redraw_tabpanel = TRUE;
-#endif
 	shell_new_columns();
     }
 
@@ -4767,19 +4764,7 @@
 #endif
 #if defined(FEAT_TABPANEL)
 	if (prev_columns != COLUMNS_WITHOUT_TPL())
-	{
-	    tabpage_T *save_curtab = curtab;
-
-	    unuse_tabpage(curtab);
-	    use_tabpage(prev_tp);
-	    shell_new_rows();
 	    shell_new_columns();
-
-	    unuse_tabpage(curtab);
-	    use_tabpage(save_curtab);
-	    shell_new_rows();
-	    shell_new_columns();
-	}
 #endif
 	redraw_all_later(UPD_NOT_VALID);
 	apply_autocmds(EVENT_WINNEW, NULL, NULL, FALSE, curbuf);
@@ -4988,7 +4973,10 @@
     tp->tp_lastwin = lastwin;
     tp->tp_old_Rows = Rows;
     if (tp->tp_old_Columns != -1)
+    {
 	tp->tp_old_Columns = topframe->fr_width;
+	tp->tp_old_coloff = firstwin->w_wincol;
+    }
     firstwin = NULL;
     lastwin = NULL;
     return OK;
@@ -5051,12 +5039,14 @@
 #endif
 		))
 	shell_new_rows();
-    if (curtab->tp_old_Columns != topframe->fr_width)
+    if (curtab->tp_old_Columns != COLUMNS_WITHOUT_TPL()
+	    || curtab->tp_old_coloff != TPL_LCOL(NULL))
     {
 	if (starting == 0)
 	{
 	    shell_new_columns();	// update window widths
 	    curtab->tp_old_Columns = topframe->fr_width;
+	    curtab->tp_old_coloff = firstwin->w_wincol;
 	}
 	else
 	    curtab->tp_old_Columns = -1;  // update window widths later