diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-04-26 19:01:44 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-04-26 19:01:44 +0100 |
commit | fbf2071ac9ef08302a1df86c15f3d4ddbe871243 (patch) | |
tree | 386c9967797386ebc3d029f586ddda6f91088db0 | |
parent | 73916bac5ac2a054a0c71adfe8d742691cdfd95c (diff) |
patch 9.0.1491: wrong scrolling with ls=0 and :botright splitv9.0.1491
Problem: Wrong scrolling with ls=0 and :botright split.
Solution: Add statusline before calling frame_new_height(). (closes #12299)
-rw-r--r-- | src/testdir/test_window_cmd.vim | 18 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/window.c | 14 |
3 files changed, 25 insertions, 9 deletions
diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim index 3d29266505..a3889de26a 100644 --- a/src/testdir/test_window_cmd.vim +++ b/src/testdir/test_window_cmd.vim @@ -19,6 +19,24 @@ func Test_window_cmd_ls0_with_split() set ls&vim endfunc +func Test_window_cmd_ls0_split_scrolling() + CheckRunVimInTerminal + + let lines =<< trim END + set laststatus=0 + call setline(1, range(1, 100)) + normal! G + END + call writefile(lines, 'XTestLs0SplitScrolling', 'D') + let buf = RunVimInTerminal('-S XTestLs0SplitScrolling', #{rows: 10}) + + call term_sendkeys(buf, ":botright split\<CR>") + call WaitForAssert({-> assert_match('Bot$', term_getline(buf, 5))}) + call assert_equal('100', term_getline(buf, 4)) + + call StopVimInTerminal(buf) +endfunc + func Test_window_cmd_cmdwin_with_vsp() let efmt = 'Expected 0 but got %d (in ls=%d, %s window)' for v in range(0, 2) diff --git a/src/version.c b/src/version.c index e5a6ada0c2..1ae97f646e 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1491, +/**/ 1490, /**/ 1489, diff --git a/src/window.c b/src/window.c index 6b86825a44..244ee37d86 100644 --- a/src/window.c +++ b/src/window.c @@ -1307,6 +1307,7 @@ win_split_ins( // "new_size" of the current window goes to the new window, use // one row for the status line win_new_height(wp, new_size); + int old_status_height = oldwin->w_status_height; if (flags & (WSP_TOP | WSP_BOT)) { int new_fr_height = curfrp->fr_height - new_size @@ -1314,6 +1315,8 @@ win_split_ins( if (!((flags & WSP_BOT) && p_ls == 0)) new_fr_height -= STATUS_HEIGHT; + if (flags & WSP_BOT) + frame_add_statusline(curfrp); frame_new_height(curfrp, new_fr_height, flags & WSP_TOP, FALSE); } else @@ -1328,12 +1331,10 @@ win_split_ins( { wp->w_winrow = oldwin->w_winrow + VISIBLE_HEIGHT(oldwin) + STATUS_HEIGHT; - wp->w_status_height = oldwin->w_status_height; + wp->w_status_height = old_status_height; if (!(flags & WSP_BOT)) oldwin->w_status_height = STATUS_HEIGHT; } - if (flags & WSP_BOT) - frame_add_statusline(curfrp); frame_fix_height(wp); frame_fix_height(oldwin); } @@ -3791,12 +3792,7 @@ frame_add_statusline(frame_T *frp) if (frp->fr_layout == FR_LEAF) { wp = frp->fr_win; - if (wp->w_status_height == 0) - { - if (wp->w_height > 0) // don't make it negative - --wp->w_height; - wp->w_status_height = STATUS_HEIGHT; - } + wp->w_status_height = STATUS_HEIGHT; } else if (frp->fr_layout == FR_ROW) { |