1
0
forked from aniani/vim

patch 8.2.3074: popup_atcursor() uses wrong position with concealing

Problem:    popup_atcursor() uses wrong position with concealing.
Solution:   Keep w_wcol in conceal_check_cursor_line(). (closes #8476)
This commit is contained in:
Bram Moolenaar
2021-06-29 20:22:32 +02:00
parent 4067bd3604
commit ea042677ab
8 changed files with 43 additions and 15 deletions

View File

@@ -147,6 +147,9 @@ edit(
#ifdef FEAT_JOB_CHANNEL #ifdef FEAT_JOB_CHANNEL
int cmdchar_todo = cmdchar; int cmdchar_todo = cmdchar;
#endif #endif
#ifdef FEAT_CONCEAL
int cursor_line_was_concealed;
#endif
// Remember whether editing was restarted after CTRL-O. // Remember whether editing was restarted after CTRL-O.
did_restart_edit = restart_edit; did_restart_edit = restart_edit;
@@ -222,9 +225,9 @@ edit(
} }
#ifdef FEAT_CONCEAL #ifdef FEAT_CONCEAL
// Check if the cursor line needs redrawing before changing State. If // Check if the cursor line was concealed before changing State.
// 'concealcursor' is "n" it needs to be redrawn without concealing. cursor_line_was_concealed = curwin->w_p_cole > 0
conceal_check_cursor_line(); && conceal_cursor_line(curwin);
#endif #endif
/* /*
@@ -283,6 +286,12 @@ edit(
stop_insert_mode = FALSE; 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 * Need to recompute the cursor position, it might move when the cursor is
* on a TAB or special character. * on a TAB or special character.

View File

@@ -5747,8 +5747,8 @@ may_start_select(int c)
n_start_visual_mode(int c) n_start_visual_mode(int c)
{ {
#ifdef FEAT_CONCEAL #ifdef FEAT_CONCEAL
// Check for redraw before changing the state. int cursor_line_was_concealed = curwin->w_p_cole > 0
conceal_check_cursor_line(); && conceal_cursor_line(curwin);
#endif #endif
VIsual_mode = c; VIsual_mode = c;
@@ -5770,8 +5770,8 @@ n_start_visual_mode(int c)
setmouse(); setmouse();
#ifdef FEAT_CONCEAL #ifdef FEAT_CONCEAL
// Check for redraw after changing the state. // Check if redraw is needed after changing the state.
conceal_check_cursor_line(); conceal_check_cursor_line(cursor_line_was_concealed);
#endif #endif
if (p_smd && msg_silent == 0) if (p_smd && msg_silent == 0)

View File

@@ -1,6 +1,6 @@
/* screen.c */ /* screen.c */
int conceal_cursor_line(win_T *wp); 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); 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); 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); int compute_foldcolumn(win_T *wp, int col);

View File

@@ -83,16 +83,26 @@ conceal_cursor_line(win_T *wp)
/* /*
* Check if the cursor line needs to be redrawn because of 'concealcursor'. * 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 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_cursor_line_redraw = TRUE;
// Need to recompute cursor column, e.g., when starting Visual mode // Need to recompute cursor column, e.g., when starting Visual mode
// without concealing. // without concealing.
curs_columns(TRUE); 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 #endif

View File

@@ -1,12 +1,12 @@
|-+0&#ffffff0@59| @14 |-+0&#ffffff0@59| @14
|-@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|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 |-@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 |-@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|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|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|&|-@38| @14 |-@1|#|-@16|&|-@4| @1>X|-@21| @23
|-@59| @14 |-@59| @14
|-@59| @14 |-@59| @14
@57|3|,|4|5| @9|T|o|p| @57|9|,|3|8| @9|T|o|p|

View File

@@ -1462,6 +1462,13 @@ func Test_popup_atcursor_pos()
\ moved: range(3), \ moved: range(3),
\ mousemoved: 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 END
call writefile(lines, 'XtestPopupAtcursorPos') call writefile(lines, 'XtestPopupAtcursorPos')
let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12}) let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})

View File

@@ -1082,7 +1082,7 @@ ui_cursor_shape_forced(int forced)
# endif # endif
# ifdef FEAT_CONCEAL # ifdef FEAT_CONCEAL
conceal_check_cursor_line(); conceal_check_cursor_line(FALSE);
# endif # endif
} }

View File

@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3074,
/**/ /**/
3073, 3073,
/**/ /**/