aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Hinz <mh.codebro@gmail.com>2019-04-11 20:20:17 +0200
committerGitHub <noreply@github.com>2019-04-11 20:20:17 +0200
commitae88e4656305f1f760b4aa2a0f29bfc11d6d80b6 (patch)
treee1ea7deebeae5849c72a13a5d418259f523d2270
parentb358054694765b595ff3ef64a5b0bba98628c218 (diff)
downloadrneovim-ae88e4656305f1f760b4aa2a0f29bfc11d6d80b6.tar.gz
rneovim-ae88e4656305f1f760b4aa2a0f29bfc11d6d80b6.tar.bz2
rneovim-ae88e4656305f1f760b4aa2a0f29bfc11d6d80b6.zip
float: always change to valid windows (#9878)
Using `:wincmd j` and friends doesn't make much sense to a floating window. For convenience though, any direction will simply change to the previous window. Make sure the previous window is valid, not the current window, and not another floating window. Change to the first window (which is never a floating window) otherwise.
-rw-r--r--src/nvim/window.c4
-rw-r--r--test/functional/ui/float_spec.lua14
2 files changed, 16 insertions, 2 deletions
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 237338f974..9555c88138 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -4037,7 +4037,7 @@ win_T *win_vert_neighbor(tabpage_T *tp, win_T *wp, bool up, long count)
foundfr = wp->w_frame;
if (wp->w_floating) {
- return prevwin;
+ return win_valid(prevwin) && !prevwin->w_floating ? prevwin : firstwin;
}
while (count--) {
@@ -4118,7 +4118,7 @@ win_T *win_horz_neighbor(tabpage_T *tp, win_T *wp, bool left, long count)
foundfr = wp->w_frame;
if (wp->w_floating) {
- return prevwin;
+ return win_valid(prevwin) && !prevwin->w_floating ? prevwin : firstwin;
}
while (count--) {
diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua
index b248bd8f6f..aa304c11bb 100644
--- a/test/functional/ui/float_spec.lua
+++ b/test/functional/ui/float_spec.lua
@@ -37,6 +37,20 @@ describe('floating windows', function()
[17] = {background = Screen.colors.Yellow},
}
+ it('behavior', function()
+ -- Create three windows and test that ":wincmd <direction>" changes to the
+ -- first window, if the previous window is invalid.
+ command('split')
+ meths.open_win(0, true, {width=10, height=10, relative='editor', row=0, col=0})
+ eq(1002, funcs.win_getid())
+ eq('editor', meths.win_get_config(1002).relative)
+ command([[
+ call nvim_win_close(1001, v:false)
+ wincmd j
+ ]])
+ eq(1000, funcs.win_getid())
+ end)
+
local function with_ext_multigrid(multigrid)
local screen
before_each(function()