aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJit Yao Yap <jityao@gmail.com>2019-03-22 00:10:57 +0800
committerBjörn Linse <bjorn.linse@gmail.com>2019-03-23 22:14:03 +0100
commit31fa064c683ae049fd392b8280e24aa14f0f4fa3 (patch)
treeda039731f3c80d12537c29c732ab4af858ffe0cc
parentb3b8910c486966f626d760a4eaec4a5c8bd4cc01 (diff)
downloadrneovim-31fa064c683ae049fd392b8280e24aa14f0f4fa3.tar.gz
rneovim-31fa064c683ae049fd392b8280e24aa14f0f4fa3.tar.bz2
rneovim-31fa064c683ae049fd392b8280e24aa14f0f4fa3.zip
floating-window.c: fix crash when using inccommand
-rw-r--r--src/nvim/window.c8
-rw-r--r--test/functional/ui/float_spec.lua188
2 files changed, 193 insertions, 3 deletions
diff --git a/src/nvim/window.c b/src/nvim/window.c
index c25322c162..e1165e6ee9 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -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);
}
}
diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua
index 79b1da5a48..b1dda2f7a8 100644
--- a/test/functional/ui/float_spec.lua
+++ b/test/functional/ui/float_spec.lua
@@ -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)