Mercurial > vim
view src/testdir/test_window_id.vim @ 34379:37b4c89ba420 v9.1.0116
patch 9.1.0116: win_split_ins may not check available room
Commit: https://github.com/vim/vim/commit/0fd44a5ad81ade342cb54d8984965bdedd2272c8
Author: Sean Dewar <6256228+seandewar@users.noreply.github.com>
Date: Tue Feb 20 20:28:15 2024 +0100
patch 9.1.0116: win_split_ins may not check available room
Problem: win_split_ins has no check for E36 when moving an existing
window
Solution: check for room and fix the issues in f_win_splitmove()
(Sean Dewar)
win_split_ins has no check for E36 when moving an existing window,
allowing for layouts with many overlapping zero-sized windows to be
created (which may also cause drawing issues with tablines and such).
f_win_splitmove also has some bugs.
So check for room and fix the issues in f_win_splitmove. Handle failure
in the two relevant win_split_ins callers by restoring the original
layout, and factor the common logic into win_splitmove.
Don't check for room when opening an autocommand window, as it's a
temporary window that's rarely interacted with or drawn anyhow, and is
rather important for some autocommands.
Issues fixed in f_win_splitmove:
- Error if splitting is disallowed.
- Fix heap-use-after-frees if autocommands fired from switching to "targetwin"
close "wp" or "oldwin".
- Fix splitting the wrong window if autocommands fired from switching to
"targetwin" switch to a different window.
- Ensure -1 is returned for all errors.
Also handle allocation failure a bit earlier in make_snapshot (callers,
except win_splitmove, don't really care if a snapshot can't be made, so
just ignore the return value).
Note: Test_smoothscroll_in_zero_width_window failed after these changes with
E36, as it was using the previous behaviour to create a zero-width window.
I've fixed the test such that it fails with UBSAN as expected when v9.0.1367 is
reverted (and simplified it too).
related: #14042
Signed-off-by: Sean Dewar <6256228+seandewar@users.noreply.github.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 20 Feb 2024 22:30:04 +0100 |
parents | 08940efa6b4e |
children |
line wrap: on
line source
" Test using the window ID. source check.vim func Test_win_getid() edit one let id1 = win_getid() let w:one = 'one' split two let id2 = win_getid() let bufnr2 = bufnr('%') let w:two = 'two' split three let id3 = win_getid() let w:three = 'three' tabnew edit four let id4 = win_getid() let w:four = 'four' split five let id5 = win_getid() let bufnr5 = bufnr('%') let w:five = 'five' tabnext wincmd w call assert_equal("two", expand("%")) call assert_equal(id2, win_getid()) let nr2 = winnr() wincmd w call assert_equal("one", expand("%")) call assert_equal(id1, win_getid()) let nr1 = winnr() wincmd w call assert_equal("three", expand("%")) call assert_equal(id3, win_getid()) let nr3 = winnr() call assert_equal('one', getwinvar(id1, 'one')) call assert_equal('two', getwinvar(id2, 'two')) call assert_equal('three', getwinvar(id3, 'three')) tabnext call assert_equal("five", expand("%")) call assert_equal(id5, win_getid()) let nr5 = winnr() wincmd w call assert_equal("four", expand("%")) call assert_equal(id4, win_getid()) let nr4 = winnr() call assert_equal('four', getwinvar(id4, 'four')) call assert_equal('five', getwinvar(id5, 'five')) call settabwinvar(1, id2, 'two', '2') call setwinvar(id4, 'four', '4') tabnext call assert_equal('4', gettabwinvar(2, id4, 'four')) call assert_equal('five', gettabwinvar(2, id5, 'five')) call assert_equal('2', getwinvar(id2, 'two')) exe nr1 . "wincmd w" call assert_equal(id1, win_getid()) exe nr2 . "wincmd w" call assert_equal(id2, win_getid()) exe nr3 . "wincmd w" call assert_equal(id3, win_getid()) tabnext exe nr4 . "wincmd w" call assert_equal(id4, win_getid()) exe nr5 . "wincmd w" call assert_equal(id5, win_getid()) call win_gotoid(id2) call assert_equal("two", expand("%")) eval id4->win_gotoid() call assert_equal("four", expand("%")) call win_gotoid(id1) call assert_equal("one", expand("%")) call win_gotoid(id5) call assert_equal("five", expand("%")) call assert_equal(0, win_id2win(9999)) call assert_equal(nr5, id5->win_id2win()) call assert_equal(0, win_id2win(id1)) tabnext call assert_equal(nr1, win_id2win(id1)) call assert_equal([0, 0], win_id2tabwin(9999)) call assert_equal([1, nr2], id2->win_id2tabwin()) call assert_equal([2, nr4], win_id2tabwin(id4)) call assert_equal([], win_findbuf(9999)) call assert_equal([id2], bufnr2->win_findbuf()) call win_gotoid(id5) split call assert_equal(sort([id5, win_getid()]), sort(win_findbuf(bufnr5))) call assert_fails('let w = win_getid([])', 'E745:') call assert_equal(0, win_getid(-1)) call assert_equal(-1, win_getid(1, -1)) only! endfunc func Test_win_getid_curtab() CheckFeature quickfix tabedit X tabfirst copen only call assert_equal(win_getid(1), 1->win_getid( 1)) tabclose! endfunc func Test_winlayout() let w1 = win_getid() call assert_equal(['leaf', w1], winlayout()) split let w2 = win_getid() call assert_equal(['col', [['leaf', w2], ['leaf', w1]]], winlayout()) split let w3 = win_getid() call assert_equal(['col', [['leaf', w3], ['leaf', w2], ['leaf', w1]]], winlayout()) 2wincmd w vsplit let w4 = win_getid() call assert_equal(['col', [['leaf', w3], ['row', [['leaf', w4], ['leaf', w2]]], ['leaf', w1]]], winlayout()) only! let w1 = win_getid() call assert_equal(['leaf', w1], winlayout(1)) tabnew let w2 = win_getid() call assert_equal(['leaf', w2], 2->winlayout()) tabclose call assert_equal([], winlayout(-1)) endfunc " vim: shiftwidth=2 sts=2 expandtab