summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-08-12 13:05:49 +0100
committerBram Moolenaar <Bram@vim.org>2022-08-12 13:05:49 +0100
commit326c5d36e7cb8526330565109c17b4a13ff790ae (patch)
tree58ae0580aa13a128387b13ac06e24d52b4d073fa /src
parente38fc86180fd3f6b372648eea6adc3f623fea302 (diff)
patch 9.0.0194: cursor displayed in wrong position after removing text propv9.0.0194
Problem: Cursor displayed in wrong position after removing text prop. (Ben Jackson) Solution: Invalidate the cursor position. (closes #10898)
Diffstat (limited to 'src')
-rw-r--r--src/change.c1
-rw-r--r--src/move.c16
-rw-r--r--src/proto/move.pro1
-rw-r--r--src/testdir/dumps/Test_prop_with_text_cursormoved_1.dump8
-rw-r--r--src/testdir/dumps/Test_prop_with_text_cursormoved_2.dump8
-rw-r--r--src/testdir/test_textprop.vim39
-rw-r--r--src/textprop.c2
-rw-r--r--src/version.c2
8 files changed, 77 insertions, 0 deletions
diff --git a/src/change.c b/src/change.c
index a9a9e731f1..42d4550172 100644
--- a/src/change.c
+++ b/src/change.c
@@ -801,6 +801,7 @@ deleted_lines_mark(linenr_T lnum, long count)
/*
* Marks the area to be redrawn after a change.
+ * Consider also calling changed_line_display_buf().
*/
void
changed_lines_buf(
diff --git a/src/move.c b/src/move.c
index b061a753cd..5bf2592269 100644
--- a/src/move.c
+++ b/src/move.c
@@ -594,6 +594,22 @@ changed_line_abv_curs_win(win_T *wp)
}
/*
+ * Display of line has changed for "buf", invalidate cursor position and
+ * w_botline.
+ */
+ void
+changed_line_display_buf(buf_T *buf)
+{
+ win_T *wp;
+
+ FOR_ALL_WINDOWS(wp)
+ if (wp->w_buffer == buf)
+ wp->w_valid &= ~(VALID_WROW|VALID_WCOL|VALID_VIRTCOL
+ |VALID_CROW|VALID_CHEIGHT
+ |VALID_TOPLINE|VALID_BOTLINE|VALID_BOTLINE_AP);
+}
+
+/*
* Make sure the value of curwin->w_botline is valid.
*/
void
diff --git a/src/proto/move.pro b/src/proto/move.pro
index 3dd6ec1a11..f9787d6a6f 100644
--- a/src/proto/move.pro
+++ b/src/proto/move.pro
@@ -11,6 +11,7 @@ void changed_cline_bef_curs(void);
void changed_cline_bef_curs_win(win_T *wp);
void changed_line_abv_curs(void);
void changed_line_abv_curs_win(win_T *wp);
+void changed_line_display_buf(buf_T *buf);
void validate_botline(void);
void validate_botline_win(win_T *wp);
void invalidate_botline(void);
diff --git a/src/testdir/dumps/Test_prop_with_text_cursormoved_1.dump b/src/testdir/dumps/Test_prop_with_text_cursormoved_1.dump
new file mode 100644
index 0000000000..6a3c9e48bd
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_with_text_cursormoved_1.dump
@@ -0,0 +1,8 @@
+|t+0&#ffffff0|h|i|s| >i|s| |l|i|n|e| |o|n|e|x+0#ffffff16#ff404010@43
+@60
+@16| +0#0000000#ffffff0@43
+|t|h|i|s| |i|s| |l|i|n|e| |t|w|o| @43
+|t|h|r|e@1| @54
+|f|o|u|r| @55
+|f|i|v|e| @55
+@42|1|,|6| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_prop_with_text_cursormoved_2.dump b/src/testdir/dumps/Test_prop_with_text_cursormoved_2.dump
new file mode 100644
index 0000000000..c1b5f0c6c6
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_with_text_cursormoved_2.dump
@@ -0,0 +1,8 @@
+|t+0&#ffffff0|h|i|s| |i|s| |l|i|n|e| |o|n|e| @43
+|t|h|i|s| >i|s| |l|i|n|e| |t|w|o| @43
+|t|h|r|e@1| @54
+|f|o|u|r| @55
+|f|i|v|e| @55
+|~+0#4040ff13&| @58
+|~| @58
+| +0#0000000&@41|2|,|6| @10|A|l@1|
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index 1e5ecc6aeb..f5ac9c1758 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -2775,6 +2775,45 @@ func Test_props_with_text_below_nowrap()
call delete('XscriptPropsBelowNowrap')
endfunc
+func Test_props_with_text_CursorMoved()
+ CheckRunVimInTerminal
+
+ let lines =<< trim END
+ call setline(1, ['this is line one', 'this is line two', 'three', 'four', 'five'])
+
+ call prop_type_add('prop', #{highlight: 'Error'})
+ let g:long_text = repeat('x', &columns * 2)
+
+ let g:prop_id = v:null
+ func! Update()
+ if line('.') == 1
+ if g:prop_id == v:null
+ let g:prop_id = prop_add(1, 0, #{type: 'prop', text_wrap: 'wrap', text: g:long_text})
+ endif
+ elseif g:prop_id != v:null
+ call prop_remove(#{id: g:prop_id})
+ let g:prop_id = v:null
+ endif
+ endfunc
+
+ autocmd CursorMoved * call Update()
+ END
+ call writefile(lines, 'XscriptPropsCursorMovec')
+ let buf = RunVimInTerminal('-S XscriptPropsCursorMovec', #{rows: 8, cols: 60})
+ call term_sendkeys(buf, "gg0w")
+ call VerifyScreenDump(buf, 'Test_prop_with_text_cursormoved_1', {})
+
+ call term_sendkeys(buf, "j")
+ call VerifyScreenDump(buf, 'Test_prop_with_text_cursormoved_2', {})
+
+ " back to the first state
+ call term_sendkeys(buf, "k")
+ call VerifyScreenDump(buf, 'Test_prop_with_text_cursormoved_1', {})
+
+ call StopVimInTerminal(buf)
+ call delete('XscriptPropsCursorMovec')
+endfunc
+
func Test_props_with_text_after_split_join()
CheckRunVimInTerminal
diff --git a/src/textprop.c b/src/textprop.c
index f33edc2117..7d594da161 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -310,6 +310,7 @@ prop_add_one(
buf->b_ml.ml_flags |= ML_LINE_DIRTY;
}
+ changed_line_display_buf(buf);
changed_lines_buf(buf, start_lnum, end_lnum + 1, 0);
res = OK;
@@ -1507,6 +1508,7 @@ f_prop_remove(typval_T *argvars, typval_T *rettv)
if (first_changed > 0)
{
+ changed_line_display_buf(buf);
changed_lines_buf(buf, first_changed, last_changed + 1, 0);
redraw_buf_later(buf, VALID);
}
diff --git a/src/version.c b/src/version.c
index b163be2402..4c4fcb657f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 194,
+/**/
193,
/**/
192,