diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-06-29 20:22:32 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-06-29 20:22:32 +0200 |
commit | ea042677ab5cab736540f3164909cac2c685de74 (patch) | |
tree | 623524f72d11b847df5de0043c42e466290e2e8b | |
parent | 4067bd3604215b48e4b4201e28f9e401b08418e4 (diff) | |
download | vim-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.c | 15 | ||||
-rw-r--r-- | src/normal.c | 8 | ||||
-rw-r--r-- | src/proto/screen.pro | 2 | ||||
-rw-r--r-- | src/screen.c | 14 | ||||
-rw-r--r-- | src/testdir/dumps/Test_popupwin_atcursor_pos.dump | 8 | ||||
-rw-r--r-- | src/testdir/test_popupwin.vim | 7 | ||||
-rw-r--r-- | src/ui.c | 2 | ||||
-rw-r--r-- | src/version.c | 2 |
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}) @@ -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, |