From: Hirohito Higashi Date: Sun, 6 Jul 2025 08:34:48 +0000 (+0200) Subject: patch 9.1.1513: resizing Vim window causes unexpected internal window width X-Git-Tag: v9.1.1513^0 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=88be7a6c68c9d288914e6973564a86918055b4bd;p=thirdparty%2Fvim.git patch 9.1.1513: resizing Vim window causes unexpected internal window width Problem: resizing Vim window causes unexpected internal window width (chdiza, after v9.1.1465) Solution: move the column calculation around (Hirohito Higashi) fixes: #17657 fixes: #17595 closes: #17668 Signed-off-by: Hirohito Higashi Signed-off-by: Christian Brabandt --- diff --git a/src/term.c b/src/term.c index 720c8a0c6b..c892c6d06b 100644 --- a/src/term.c +++ b/src/term.c @@ -3619,6 +3619,13 @@ win_new_shellsize(void) if (old_Rows != Rows || old_Columns != COLUMNS_WITHOUT_TPL() || old_coloff != TPL_LCOL()) ui_new_shellsize(); + if (old_Columns != COLUMNS_WITHOUT_TPL() || old_coloff != TPL_LCOL()) + { + old_Columns = COLUMNS_WITHOUT_TPL(); + old_coloff = TPL_LCOL(); + + shell_new_columns(); + } if (old_Rows != Rows) { // If 'window' uses the whole screen, keep it using that. @@ -3629,13 +3636,6 @@ win_new_shellsize(void) old_Rows = Rows; shell_new_rows(); // update window sizes } - if (old_Columns != COLUMNS_WITHOUT_TPL() || old_coloff != TPL_LCOL()) - { - old_Columns = COLUMNS_WITHOUT_TPL(); - old_coloff = TPL_LCOL(); - - shell_new_columns(); - } } /* diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 3dc4960268..4d001c2169 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -5479,4 +5479,29 @@ func Test_eventignore_subtract() %bw! endfunc +func Test_VimResized_and_window_width_not_equalized() + CheckRunVimInTerminal + + let lines =<< trim END + let g:vim_resized = 0 + autocmd VimResized * let g:vim_resized = 1 + 10vsplit + END + call writefile(lines, 'XTest_VimResize', 'D') + let buf = RunVimInTerminal('-S XTest_VimResize', {'rows': 10, 'cols': 30}) + + " redraw now to avoid a redraw after the :echo command + call term_sendkeys(buf, ":redraw!\") + call TermWait(buf) + + call term_sendkeys(buf, ":set columns=40\") + call term_sendkeys(buf, ":echo 'VimResized:' g:vim_resized\") + call WaitForAssert({-> assert_match('^VimResized: 1$', term_getline(buf, 10))}, 1000) + call term_sendkeys(buf, ":let window_width = getwininfo(win_getid())[0].width\") + call term_sendkeys(buf, ":echo 'window_width:' window_width\") + call WaitForAssert({-> assert_match('^window_width: 10$', term_getline(buf, 10))}, 1000) + + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index f06c222f4b..fdf1eb3000 100644 --- a/src/version.c +++ b/src/version.c @@ -719,6 +719,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1513, /**/ 1512, /**/ diff --git a/src/window.c b/src/window.c index 3d2528fa6d..484fdf8e10 100644 --- a/src/window.c +++ b/src/window.c @@ -3461,9 +3461,9 @@ win_close_othertab(win_T *win, int free_buf, tabpage_T *tp) } free_tp = TRUE; redraw_tabline = TRUE; + shell_new_columns(); if (h != tabline_height()) shell_new_rows(); - shell_new_columns(); } // Free the memory used for the window. @@ -6160,6 +6160,8 @@ win_free_lsize(win_T *wp) /* * Called from win_new_shellsize() after Rows changed. * This only does the current tab page, others must be done when made active. + * Note: When called together with shell_new_columns(), call shell_new_columns() + * first to avoid this function updating firstwin->w_wincol first. */ void shell_new_rows(void) @@ -6204,8 +6206,10 @@ shell_new_columns(void) if (firstwin == NULL) // not initialized yet return; +#if defined(FEAT_TABPANEL) int save_wincol = firstwin->w_wincol; int save_fr_width = topframe->fr_width; +#endif int w = COLUMNS_WITHOUT_TPL(); // First try setting the widths of windows with 'winfixwidth'. If that @@ -6216,9 +6220,13 @@ shell_new_columns(void) win_comp_pos(); // recompute w_winrow and w_wincol - if (p_ea && (firstwin->w_wincol != save_wincol - || topframe->fr_width != save_fr_width)) +#if defined(FEAT_TABPANEL) + if (p_ea && firstwin->w_wincol + topframe->fr_width + == save_wincol + save_fr_width && + (firstwin->w_wincol != save_wincol || + topframe->fr_width != save_fr_width)) win_equal(curwin, FALSE, 0); +#endif if (!skip_win_fix_scroll) win_fix_scroll(TRUE);