floating-window.c: fix crash when using inccommand

This commit is contained in:
Jit Yao Yap 2019-03-22 00:10:57 +08:00 committed by Björn Linse
parent b3b8910c48
commit 31fa064c68
2 changed files with 193 additions and 3 deletions

View File

@ -2462,7 +2462,7 @@ int win_close(win_T *win, bool free_buf)
}
if (!was_floating) {
if (p_ea && (*p_ead == 'b' || *p_ead == dir)) {
if (!curwin->w_floating && p_ea && (*p_ead == 'b' || *p_ead == dir)) {
// If the frame of the closed window contains the new current window,
// only resize that frame. Otherwise resize all windows.
win_equal(curwin, curwin->w_frame->fr_parent == win_frame, dir);
@ -4656,7 +4656,11 @@ void win_size_restore(garray_T *gap)
{
int i = 0;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
frame_setwidth(wp->w_frame, ((int *)gap->ga_data)[i++]);
if (wp->w_floating) {
win_setwidth_win(((int *)gap->ga_data)[i++], wp);
} else {
frame_setwidth(wp->w_frame, ((int *)gap->ga_data)[i++]);
}
win_setheight_win(((int *)gap->ga_data)[i++], wp);
}
}

View File

@ -5,6 +5,7 @@ local clear, feed = helpers.clear, helpers.feed
local command, feed_command = helpers.command, helpers.feed_command
local eval = helpers.eval
local eq = helpers.eq
local insert = helpers.insert
local meths = helpers.meths
local curbufmeths = helpers.curbufmeths
local funcs = helpers.funcs
@ -33,6 +34,7 @@ describe('floating windows', function()
[14] = {foreground = Screen.colors.Brown},
[15] = {background = Screen.colors.Grey20},
[16] = {background = Screen.colors.Grey20, bold = true, foreground = Screen.colors.Blue1},
[17] = {background = Screen.colors.Yellow},
}
local function with_ext_multigrid(multigrid)
@ -1106,6 +1108,191 @@ describe('floating windows', function()
end
end)
it('does not crash with inccommand #9379', function()
screen:try_resize(30,15)
local expected_pos = {
[3]={{id=1001}, 'NW', 1, 2, 0, true},
}
command("set inccommand=split")
command("set laststatus=2")
local buf = meths.create_buf(false,false)
meths.open_win(buf, true, {relative='editor', width=30, height=3, row=2, col=0})
insert([[
foo
bar
]])
if multigrid then
screen:expect{grid=[[
## grid 1
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
{5:[No Name] }|
|
## grid 2
|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
## grid 3
{1:foo }|
{1:bar }|
{1:^ }|
]], float_pos=expected_pos}
else
screen:expect([[
|
{0:~ }|
{1:foo }|
{1:bar }|
{1:^ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{5:[No Name] }|
|
]])
end
feed(':%s/.')
if multigrid then
screen:expect{grid=[[
## grid 1
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
{5:[Preview] }|
:%s/.^ |
## grid 2
|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
## grid 3
{17:f}{1:oo }|
{17:b}{1:ar }|
{1: }|
]], float_pos=expected_pos}
else
screen:expect([[
|
{0:~ }|
{17:f}{1:oo }|
{17:b}{1:ar }|
{1: }|
{5:[No Name] }|
|1| {17:f}oo |
|2| {17:b}ar |
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{5:[Preview] }|
:%s/.^ |
]])
end
feed('<Esc>')
if multigrid then
screen:expect{grid=[[
## grid 1
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
[2:------------------------------]|
{5:[No Name] }|
|
## grid 2
|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
## grid 3
{1:foo }|
{1:bar }|
{1:^ }|
]], float_pos=expected_pos}
else
screen:expect([[
|
{0:~ }|
{1:foo }|
{1:bar }|
{1:^ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{5:[No Name] }|
|
]])
end
end)
it('does not crash when set cmdheight #9680', function()
local buf = meths.create_buf(false,false)
meths.open_win(buf, false, {relative='editor', width=20, height=2, row=2, col=5})
@ -3456,6 +3643,5 @@ describe('floating windows', function()
describe('without ext_multigrid', function()
with_ext_multigrid(false)
end)
end)