summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLuuk van Baal <luukvbaal@gmail.com>2023-08-20 20:44:59 +0200
committerChristian Brabandt <cb@256bit.org>2023-08-20 20:44:59 +0200
commit16af913eeefb288ce968fb87e09a597413861900 (patch)
tree4184b8e4c195d1f2f79ae48320fc68583e3c13ab /src
parent478668013f060a75b8cd8cc6ca2cf2abb3bcc4a5 (diff)
patch 9.0.1772: Cursor may be adjusted in 'splitkeep'ed windowsv9.0.1772
Problem: Cursor is adjusted in window that did not change in size by 'splitkeep'. Solution: Only check that cursor position is valid in a window that has changed in size. closes: #12509 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Luuk van Baal <luukvbaal@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/structs.h1
-rw-r--r--src/testdir/dumps/Test_splitkeep_cursor_1.dump8
-rw-r--r--src/testdir/dumps/Test_splitkeep_cursor_2.dump8
-rw-r--r--src/testdir/dumps/Test_splitkeep_cursor_3.dump8
-rw-r--r--src/testdir/test_window_cmd.vim27
-rw-r--r--src/version.c2
-rw-r--r--src/window.c14
7 files changed, 65 insertions, 3 deletions
diff --git a/src/structs.h b/src/structs.h
index eefc8f2186..eb8d30b23e 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -3778,6 +3778,7 @@ struct window_S
int w_vsep_width; // Number of separator columns (0 or 1).
pos_save_T w_save_cursor; // backup of cursor pos and topline
+ int w_do_win_fix_cursor;// if TRUE cursor may be invalid
#ifdef FEAT_PROP_POPUP
int w_popup_flags; // POPF_ values
diff --git a/src/testdir/dumps/Test_splitkeep_cursor_1.dump b/src/testdir/dumps/Test_splitkeep_cursor_1.dump
new file mode 100644
index 0000000000..3b30e826fe
--- /dev/null
+++ b/src/testdir/dumps/Test_splitkeep_cursor_1.dump
@@ -0,0 +1,8 @@
+|9+0&#ffffff0@1| @72
+>1|0@1| @71
+|1|0|1| @71
+|[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|0@1|,|1| @9|4|9|%
+|5+0&&| @73
+|6| @73
+|[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|5|,|1| @12|2|%
+| +0&&@74
diff --git a/src/testdir/dumps/Test_splitkeep_cursor_2.dump b/src/testdir/dumps/Test_splitkeep_cursor_2.dump
new file mode 100644
index 0000000000..bff6940196
--- /dev/null
+++ b/src/testdir/dumps/Test_splitkeep_cursor_2.dump
@@ -0,0 +1,8 @@
+|1+0&#ffffff0|0@1| @71
+>1|0|1| @71
+|1|0|2| @71
+|[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|0|1|,|1| @9|5|0|%
+|5+0&&| @73
+|6| @73
+|[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|5|,|1| @12|2|%
+| +0&&@74
diff --git a/src/testdir/dumps/Test_splitkeep_cursor_3.dump b/src/testdir/dumps/Test_splitkeep_cursor_3.dump
new file mode 100644
index 0000000000..979cd00cd8
--- /dev/null
+++ b/src/testdir/dumps/Test_splitkeep_cursor_3.dump
@@ -0,0 +1,8 @@
+|1+0&#ffffff0|9|8| @71
+|1|9@1| @71
+>2|0@1| @71
+|[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|2|0@1|,|1| @9|B|o|t
+|5+0&&| @73
+|6| @73
+|[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|5|,|1| @12|2|%
+|:+0&&|s|e|t| |s|c|r|o|l@1|o|f@1|=|0| @58
diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim
index 03c51e845a..818fef0394 100644
--- a/src/testdir/test_window_cmd.vim
+++ b/src/testdir/test_window_cmd.vim
@@ -1861,6 +1861,33 @@ func Test_splitkeep_misc()
set splitkeep&
endfunc
+func Test_splitkeep_cursor()
+ CheckScreendump
+ let lines =<< trim END
+ set splitkeep=screen
+ autocmd CursorMoved * wincmd p | wincmd p
+ call setline(1, range(1, 200))
+ func CursorEqualize()
+ call cursor(100, 1)
+ wincmd =
+ endfunc
+ wincmd s
+ call CursorEqualize()
+ END
+ call writefile(lines, 'XTestSplitkeepCallback', 'D')
+ let buf = RunVimInTerminal('-S XTestSplitkeepCallback', #{rows: 8})
+
+ call VerifyScreenDump(buf, 'Test_splitkeep_cursor_1', {})
+
+ call term_sendkeys(buf, "j")
+ call VerifyScreenDump(buf, 'Test_splitkeep_cursor_2', {})
+
+ call term_sendkeys(buf, ":set scrolloff=0\<CR>G")
+ call VerifyScreenDump(buf, 'Test_splitkeep_cursor_3', {})
+
+ call StopVimInTerminal(buf)
+endfunc
+
func Test_splitkeep_callback()
CheckScreendump
let lines =<< trim END
diff --git a/src/version.c b/src/version.c
index cda23f7925..13d27f4afd 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1772,
+/**/
1771,
/**/
1770,
diff --git a/src/window.c b/src/window.c
index 833ee56140..152365e7d9 100644
--- a/src/window.c
+++ b/src/window.c
@@ -6789,6 +6789,10 @@ win_fix_scroll(int resize)
// Skip when window height has not changed.
if (wp->w_height != wp->w_prev_height)
{
+ // Cursor position in this window may now be invalid. It is kept
+ // potentially invalid until the window is made the current window.
+ wp->w_do_win_fix_cursor = TRUE;
+
// If window has moved update botline to keep the same screenlines.
if (*p_spk == 's' && wp->w_winrow != wp->w_prev_winrow
&& wp->w_botline - 1 <= wp->w_buffer->b_ml.ml_line_count)
@@ -6813,6 +6817,7 @@ win_fix_scroll(int resize)
}
else if (wp == curwin)
wp->w_valid &= ~VALID_CROW;
+
invalidate_botline_win(wp);
validate_botline_win(wp);
}
@@ -6830,7 +6835,7 @@ win_fix_scroll(int resize)
/*
* Make sure the cursor position is valid for 'splitkeep'.
* If it is not, put the cursor position in the jumplist and move it.
- * If we are not in normal mode ("normal" is zero), make it valid by scrolling
+ * If we are not in normal mode ("normal" is FALSE), make it valid by scrolling
* instead.
*/
static void
@@ -6838,9 +6843,12 @@ win_fix_cursor(int normal)
{
win_T *wp = curwin;
- if (skip_win_fix_cursor || wp->w_buffer->b_ml.ml_line_count < wp->w_height)
+ if (skip_win_fix_cursor
+ || !wp->w_do_win_fix_cursor
+ || wp->w_buffer->b_ml.ml_line_count < wp->w_height)
return;
+ wp->w_do_win_fix_cursor = FALSE;
// Determine valid cursor range.
long so = MIN(wp->w_height / 2, get_scrolloff_value());
linenr_T lnum = wp->w_cursor.lnum;
@@ -6873,7 +6881,7 @@ win_fix_cursor(int normal)
{
wp->w_fraction = (nlnum == bot) ? FRACTION_MULT : 0;
scroll_to_fraction(wp, wp->w_prev_height);
- validate_botline_win(curwin);
+ validate_botline();
}
}
}