]> granicus.if.org Git - vim/commitdiff
patch 9.0.0194: cursor displayed in wrong position after removing text prop v9.0.0194
authorBram Moolenaar <Bram@vim.org>
Fri, 12 Aug 2022 12:05:49 +0000 (13:05 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 12 Aug 2022 12:05:49 +0000 (13:05 +0100)
Problem:    Cursor displayed in wrong position after removing text prop. (Ben
            Jackson)
Solution:   Invalidate the cursor position. (closes #10898)

src/change.c
src/move.c
src/proto/move.pro
src/testdir/dumps/Test_prop_with_text_cursormoved_1.dump [new file with mode: 0644]
src/testdir/dumps/Test_prop_with_text_cursormoved_2.dump [new file with mode: 0644]
src/testdir/test_textprop.vim
src/textprop.c
src/version.c

index a9a9e731f1e0c2e9237cf2d3d8cac7fd6461fc8e..42d4550172bf317a4ddae4f9913118bdf20d06fe 100644 (file)
@@ -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(
index b061a753cd9acd8e3bebec43fe442ea9a5e6bfee..5bf2592269eb375c3fd101144dc01d9739603da1 100644 (file)
@@ -593,6 +593,22 @@ changed_line_abv_curs_win(win_T *wp)
                                                |VALID_CHEIGHT|VALID_TOPLINE);
 }
 
+/*
+ * 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.
  */
index 3dd6ec1a11b315cc0504126a9392066b605ceee0..f9787d6a6fefe1871ae3f48cf00fbbb3a8272b09 100644 (file)
@@ -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 (file)
index 0000000..6a3c9e4
--- /dev/null
@@ -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 (file)
index 0000000..c1b5f0c
--- /dev/null
@@ -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| 
index 1e5ecc6aebca43c17f2c08634cd7b9b68c2940ee..f5ac9c1758624f855e63ee960b50f56d567c9cff 100644 (file)
@@ -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
 
index f33edc2117ad8f2df201230ed3c97c77061d6b75..7d594da161fead8e4496d27748c2311b8ac78d20 100644 (file)
@@ -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);
     }
index b163be2402d65f97623f29db2cd57b68fdb61cb2..4c4fcb657f24e8910a111b8ddb08e60ae0646c16 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    194,
 /**/
     193,
 /**/