aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/window.c
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2020-12-26 18:15:20 -0500
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2020-12-26 18:22:04 -0500
commit0aa2c7e2ec2ee683a22fef68c229408708f7cd5d (patch)
treed513b7e9051c9993c9469a7d0ba58d45eceea6d4 /src/nvim/window.c
parenta51248ea173a8602e440316f654668aaa2e27805 (diff)
downloadrneovim-0aa2c7e2ec2ee683a22fef68c229408708f7cd5d.tar.gz
rneovim-0aa2c7e2ec2ee683a22fef68c229408708f7cd5d.tar.bz2
rneovim-0aa2c7e2ec2ee683a22fef68c229408708f7cd5d.zip
vim-patch:8.1.2227: layout wrong if 'lines' changes while cmdline window is open
Problem: Layout wrong if 'lines' changes while cmdline window is open. Solution: Do not restore the window layout if 'lines' changed. (closes vim/vim#5130) https://github.com/vim/vim/commit/1c329c04be2e95a3589a53f2978926e91b450cca
Diffstat (limited to 'src/nvim/window.c')
-rw-r--r--src/nvim/window.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 6ecfd9ab64..2dcce2d8cb 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -5013,7 +5013,10 @@ void win_size_save(garray_T *gap)
{
ga_init(gap, (int)sizeof(int), 1);
- ga_grow(gap, win_count() * 2);
+ ga_grow(gap, win_count() * 2 + 1);
+ // first entry is value of 'lines'
+ ((int *)gap->ga_data)[gap->ga_len++] = Rows;
+
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
((int *)gap->ga_data)[gap->ga_len++] =
wp->w_width + wp->w_vsep_width;
@@ -5021,18 +5024,18 @@ void win_size_save(garray_T *gap)
}
}
-/*
- * Restore window sizes, but only if the number of windows is still the same.
- * Does not free the growarray.
- */
+// Restore window sizes, but only if the number of windows is still the same
+// and 'lines' didn't change.
+// Does not free the growarray.
void win_size_restore(garray_T *gap)
+ FUNC_ATTR_NONNULL_ALL
{
- if (win_count() * 2 == gap->ga_len) {
- /* The order matters, because frames contain other frames, but it's
- * difficult to get right. The easy way out is to do it twice. */
- for (int j = 0; j < 2; ++j)
- {
- int i = 0;
+ if (win_count() * 2 + 1 == gap->ga_len
+ && ((int *)gap->ga_data)[0] == Rows) {
+ // The order matters, because frames contain other frames, but it's
+ // difficult to get right. The easy way out is to do it twice.
+ for (int j = 0; j < 2; j++) {
+ int i = 1;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
int width = ((int *)gap->ga_data)[i++];
int height = ((int *)gap->ga_data)[i++];