]> granicus.if.org Git - vim/commitdiff
patch 8.2.0580: window size wrong if 'ea' is off and 'splitright' is on v8.2.0580
authorBram Moolenaar <Bram@vim.org>
Wed, 15 Apr 2020 18:05:47 +0000 (20:05 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 15 Apr 2020 18:05:47 +0000 (20:05 +0200)
Problem:    Window size wrong if 'ea' is off and 'splitright' is on and
            splitting then closing a window.
Solution:   Put abandoned window space in the right place. (Mark Waggoner)

src/testdir/test_winbuf_close.vim
src/version.c
src/window.c

index 7f5b80e8d32c8c9b9148c7a656f5faecbfdd7d53..f4878c23973ffdfc568202f4040fa69b95af29c2 100644 (file)
@@ -194,3 +194,22 @@ func Test_tabwin_close()
   call assert_true(v:true)
   %bwipe!
 endfunc
+
+" Test when closing a split window (above/below) restores space to the window
+" below when 'noequalalways' and 'splitright' are set.
+func Test_window_close_splitright_noequalalways()
+  set noequalalways
+  set splitright
+  new
+  let w1 = win_getid()
+  new
+  let w2 = win_getid()
+  execute "normal \<c-w>b"
+  let h = winheight(0)
+  let w = win_getid()
+  new 
+  q
+  call assert_equal(h, winheight(0), "Window height does not match eight before opening and closing another window")
+  call assert_equal(w, win_getid(), "Did not return to original window after opening and closing a window")
+endfunc
+
index 58827f2f45a3d8872f38fd271408c265d19f6041..0f0ee6d0a5fbc74638b85a62c751cff1bc26148f 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    580,
 /**/
     579,
 /**/
index 7efe7b164a6d69c86642a37ab305b3720eb04ca0..7c18c06a7f9a2316ebe146077d835521f0026fda 100644 (file)
@@ -2967,9 +2967,22 @@ win_altframe(
     if (frp->fr_next == NULL)
        return frp->fr_prev;
 
+    // By default the next window will get the space that was abandoned by this
+    // window
     target_fr = frp->fr_next;
     other_fr  = frp->fr_prev;
-    if (p_spr || p_sb)
+
+    // If this is part of a column of windows and 'splitbelow' is true then the
+    // previous window will get the space.
+    if (frp->fr_parent != NULL && frp->fr_parent->fr_layout == FR_COL && p_sb)
+    {
+       target_fr = frp->fr_prev;
+       other_fr  = frp->fr_next;
+    }
+
+    // If this is part of a row of windows, and 'splitright' is true then the
+    // previous window will get the space.
+    if (frp->fr_parent != NULL && frp->fr_parent->fr_layout == FR_ROW && p_spr)
     {
        target_fr = frp->fr_prev;
        other_fr  = frp->fr_next;