summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-06-29 20:22:32 +0200
committerBram Moolenaar <Bram@vim.org>2021-06-29 20:22:32 +0200
commitea042677ab5cab736540f3164909cac2c685de74 (patch)
tree623524f72d11b847df5de0043c42e466290e2e8b
parent4067bd3604215b48e4b4201e28f9e401b08418e4 (diff)
downloadvim-git-ea042677ab5cab736540f3164909cac2c685de74.tar.gz
patch 8.2.3074: popup_atcursor() uses wrong position with concealingv8.2.3074
Problem: popup_atcursor() uses wrong position with concealing. Solution: Keep w_wcol in conceal_check_cursor_line(). (closes #8476)
-rw-r--r--src/edit.c15
-rw-r--r--src/normal.c8
-rw-r--r--src/proto/screen.pro2
-rw-r--r--src/screen.c14
-rw-r--r--src/testdir/dumps/Test_popupwin_atcursor_pos.dump8
-rw-r--r--src/testdir/test_popupwin.vim7
-rw-r--r--src/ui.c2
-rw-r--r--src/version.c2
8 files changed, 43 insertions, 15 deletions
diff --git a/src/edit.c b/src/edit.c
index 9162fe629..d94408030 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -147,6 +147,9 @@ edit(
#ifdef FEAT_JOB_CHANNEL
int cmdchar_todo = cmdchar;
#endif
+#ifdef FEAT_CONCEAL
+ int cursor_line_was_concealed;
+#endif
// Remember whether editing was restarted after CTRL-O.
did_restart_edit = restart_edit;
@@ -222,9 +225,9 @@ edit(
}
#ifdef FEAT_CONCEAL
- // Check if the cursor line needs redrawing before changing State. If
- // 'concealcursor' is "n" it needs to be redrawn without concealing.
- conceal_check_cursor_line();
+ // Check if the cursor line was concealed before changing State.
+ cursor_line_was_concealed = curwin->w_p_cole > 0
+ && conceal_cursor_line(curwin);
#endif
/*
@@ -283,6 +286,12 @@ edit(
stop_insert_mode = FALSE;
+#ifdef FEAT_CONCEAL
+ // Check if the cursor line needs redrawing after changing State. If
+ // 'concealcursor' is "n" it needs to be redrawn without concealing.
+ conceal_check_cursor_line(cursor_line_was_concealed);
+#endif
+
/*
* Need to recompute the cursor position, it might move when the cursor is
* on a TAB or special character.
diff --git a/src/normal.c b/src/normal.c
index 18f14ec4e..56f89f518 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -5747,8 +5747,8 @@ may_start_select(int c)
n_start_visual_mode(int c)
{
#ifdef FEAT_CONCEAL
- // Check for redraw before changing the state.
- conceal_check_cursor_line();
+ int cursor_line_was_concealed = curwin->w_p_cole > 0
+ && conceal_cursor_line(curwin);
#endif
VIsual_mode = c;
@@ -5770,8 +5770,8 @@ n_start_visual_mode(int c)
setmouse();
#ifdef FEAT_CONCEAL
- // Check for redraw after changing the state.
- conceal_check_cursor_line();
+ // Check if redraw is needed after changing the state.
+ conceal_check_cursor_line(cursor_line_was_concealed);
#endif
if (p_smd && msg_silent == 0)
diff --git a/src/proto/screen.pro b/src/proto/screen.pro
index fc45fa15f..6d1993d2b 100644
--- a/src/proto/screen.pro
+++ b/src/proto/screen.pro
@@ -1,6 +1,6 @@
/* screen.c */
int conceal_cursor_line(win_T *wp);
-void conceal_check_cursor_line(void);
+void conceal_check_cursor_line(int was_concealed);
int get_wcr_attr(win_T *wp);
void win_draw_end(win_T *wp, int c1, int c2, int draw_margin, int row, int endrow, hlf_T hl);
int compute_foldcolumn(win_T *wp, int col);
diff --git a/src/screen.c b/src/screen.c
index 7c27e2ca4..bfb6bf7ba 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -83,16 +83,26 @@ conceal_cursor_line(win_T *wp)
/*
* Check if the cursor line needs to be redrawn because of 'concealcursor'.
+ * To be called after changing the state, "was_concealed" is the value of
+ * "conceal_cursor_line()" before the change.
+ * "
*/
void
-conceal_check_cursor_line(void)
+conceal_check_cursor_line(int was_concealed)
{
- if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin))
+ if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin) != was_concealed)
{
+ int wcol = curwin->w_wcol;
+
need_cursor_line_redraw = TRUE;
// Need to recompute cursor column, e.g., when starting Visual mode
// without concealing.
curs_columns(TRUE);
+
+ // When concealing now w_wcol will be computed wrong, keep the previous
+ // value, it will be updated in win_line().
+ if (!was_concealed)
+ curwin->w_wcol = wcol;
}
}
#endif
diff --git a/src/testdir/dumps/Test_popupwin_atcursor_pos.dump b/src/testdir/dumps/Test_popupwin_atcursor_pos.dump
index a42b6e6ff..3a4f0c2c7 100644
--- a/src/testdir/dumps/Test_popupwin_atcursor_pos.dump
+++ b/src/testdir/dumps/Test_popupwin_atcursor_pos.dump
@@ -1,12 +1,12 @@
|-+0&#ffffff0@59| @14
|-@59| @14
-|-@25|%|-@16>@|-@14| @14
+|-@25|%|-@16|@|-@14| @14
|-@25|f+0#0000001#ffd7ff255|i|R|S|t| |-+0#0000000#ffffff0@6|F+0#0000001#ffd7ff255|i|r|s|t| |-+0#0000000#ffffff0@14| @14
|-@25|s+0#0000001#ffd7ff255|e|C|O|n|d|-+0#0000000#ffffff0@6|S+0#0000001#ffd7ff255|e|c|o|n|D|-+0#0000000#ffffff0@14| @14
|-@59| @14
|-@1|f+0#0000001#ffd7ff255|i|r|s|t| |-+0#0000000#ffffff0@6|F+0#0000001#ffd7ff255|I|r|s|T| |-+0#0000000#ffffff0@38| @14
-|-@1|s+0#0000001#ffd7ff255|e|c|o|n|d|-+0#0000000#ffffff0@6|S+0#0000001#ffd7ff255|E|c|o|N|D|-+0#0000000#ffffff0@38| @14
-|-@1|#|-@16|&|-@38| @14
+|-@1|s+0#0000001#ffd7ff255|e|c|o|n|d|-+0#0000000#ffffff0@6|S+0#0000001#ffd7ff255|E|c|o|N|D|-+0#0000000#ffffff0@6|m+0#0000001#ffd7ff255|a|r|k|-+0#0000000#ffffff0@27| @14
+|-@1|#|-@16|&|-@4| @1>X|-@21| @23
|-@59| @14
|-@59| @14
-@57|3|,|4|5| @9|T|o|p|
+@57|9|,|3|8| @9|T|o|p|
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index 68d7db87e..cdfa3a987 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -1462,6 +1462,13 @@ func Test_popup_atcursor_pos()
\ moved: range(3),
\ mousemoved: range(3),
\ })
+
+ normal 9G27|Rconcealed X
+ syn match Hidden /concealed/ conceal
+ set conceallevel=2 concealcursor=n
+ redraw
+ normal 0fX
+ call popup_atcursor('mark', {})
END
call writefile(lines, 'XtestPopupAtcursorPos')
let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
diff --git a/src/ui.c b/src/ui.c
index 65ac626d2..b3d125cd5 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -1082,7 +1082,7 @@ ui_cursor_shape_forced(int forced)
# endif
# ifdef FEAT_CONCEAL
- conceal_check_cursor_line();
+ conceal_check_cursor_line(FALSE);
# endif
}
diff --git a/src/version.c b/src/version.c
index 125325176..f60abafe1 100644
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3074,
+/**/
3073,
/**/
3072,