Patch 8.2.3074
Problem: popup_atcursor() uses wrong position with concealing.
Solution: Keep w_wcol in conceal_check_cursor_line(). (closes #8476)
Files: src/screen.c, src/proto/screen.pro, src/normal.c, src/edit.c,
src/ui.c, src/testdir/test_popupwin.vim,
src/testdir/dumps/Test_popupwin_atcursor_pos.dump
*** ../vim-8.2.3073/src/screen.c 2021-06-02 13:28:11.435120452 +0200
--- src/screen.c 2021-06-29 20:08:30.172761283 +0200
***************
*** 83,98 ****
/*
* Check if the cursor line needs to be redrawn because of 'concealcursor'.
*/
void
! conceal_check_cursor_line(void)
{
! if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin))
{
need_cursor_line_redraw = TRUE;
// Need to recompute cursor column, e.g., when starting Visual mode
// without concealing.
curs_columns(TRUE);
}
}
#endif
--- 83,108 ----
/*
* 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(int was_concealed)
{
! 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
*** ../vim-8.2.3073/src/proto/screen.pro 2021-03-03 13:25:59.535913158
+0100
--- src/proto/screen.pro 2021-06-29 20:01:14.061335774 +0200
***************
*** 1,6 ****
/* screen.c */
int conceal_cursor_line(win_T *wp);
! void conceal_check_cursor_line(void);
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);
--- 1,6 ----
/* screen.c */
int conceal_cursor_line(win_T *wp);
! 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);
*** ../vim-8.2.3073/src/normal.c 2021-06-27 22:03:28.645707721 +0200
--- src/normal.c 2021-06-29 20:05:23.181027939 +0200
***************
*** 5747,5754 ****
n_start_visual_mode(int c)
{
#ifdef FEAT_CONCEAL
! // Check for redraw before changing the state.
! conceal_check_cursor_line();
#endif
VIsual_mode = c;
--- 5747,5754 ----
n_start_visual_mode(int c)
{
#ifdef FEAT_CONCEAL
! int cursor_line_was_concealed = curwin->w_p_cole > 0
! && conceal_cursor_line(curwin);
#endif
VIsual_mode = c;
***************
*** 5770,5777 ****
setmouse();
#ifdef FEAT_CONCEAL
! // Check for redraw after changing the state.
! conceal_check_cursor_line();
#endif
if (p_smd && msg_silent == 0)
--- 5770,5777 ----
setmouse();
#ifdef FEAT_CONCEAL
! // Check if redraw is needed after changing the state.
! conceal_check_cursor_line(cursor_line_was_concealed);
#endif
if (p_smd && msg_silent == 0)
*** ../vim-8.2.3073/src/edit.c 2021-01-28 11:07:40.881497383 +0100
--- src/edit.c 2021-06-29 20:03:48.913152012 +0200
***************
*** 147,152 ****
--- 147,155 ----
#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,230 ****
}
#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();
#endif
/*
--- 225,233 ----
}
#ifdef FEAT_CONCEAL
! // 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,288 ****
--- 286,297 ----
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.
*** ../vim-8.2.3073/src/ui.c 2021-06-07 22:04:48.406620074 +0200
--- src/ui.c 2021-06-29 20:06:21.872946894 +0200
***************
*** 1082,1088 ****
# endif
# ifdef FEAT_CONCEAL
! conceal_check_cursor_line();
# endif
}
--- 1082,1088 ----
# endif
# ifdef FEAT_CONCEAL
! conceal_check_cursor_line(FALSE);
# endif
}
*** ../vim-8.2.3073/src/testdir/test_popupwin.vim 2021-06-22
19:52:23.901800877 +0200
--- src/testdir/test_popupwin.vim 2021-06-29 20:20:00.391645121 +0200
***************
*** 1462,1467 ****
--- 1462,1474 ----
\ 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})
*** ../vim-8.2.3073/src/testdir/dumps/Test_popupwin_atcursor_pos.dump
2019-11-09 15:24:42.000000000 +0100
--- src/testdir/dumps/Test_popupwin_atcursor_pos.dump 2021-06-29
20:20:05.535636369 +0200
***************
*** 1,12 ****
|-+0&#ffffff0@59| @14
|-@59| @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
|-@59| @14
|-@59| @14
! @57|3|,|4|5| @9|T|o|p|
--- 1,12 ----
|-+0&#ffffff0@59| @14
|-@59| @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@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|9|,|3|8| @9|T|o|p|
*** ../vim-8.2.3073/src/version.c 2021-06-29 18:54:32.288672327 +0200
--- src/version.c 2021-06-29 20:21:44.843466618 +0200
***************
*** 757,758 ****
--- 757,760 ----
{ /* Add new patch number below this line */
+ /**/
+ 3074,
/**/
--
There is a difference between "should work" and "does work",
it's called testing.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/202106291823.15TINWrm1229350%40masaka.moolenaar.net.