aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/drawline.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-03-17 17:54:18 +0800
committerGitHub <noreply@github.com>2024-03-17 17:54:18 +0800
commit091eb4c8c7208569379daf094503abd2eeec32c6 (patch)
tree2c7619379fa092dc770157f3cfa9069c42d085ea /src/nvim/drawline.c
parent54db75e995f82a11f5d2a223d816d2ea0bd0467e (diff)
downloadrneovim-091eb4c8c7208569379daf094503abd2eeec32c6.tar.gz
rneovim-091eb4c8c7208569379daf094503abd2eeec32c6.tar.bz2
rneovim-091eb4c8c7208569379daf094503abd2eeec32c6.zip
fix(mouse): click after eol with conceal and virtual text (#27897)
Problem: Wrong cursor position when clicking after end of line with 'virtualedit', conceal and virtual text. Solution: Always fill linebuf_vcol[] for the columns to clear.
Diffstat (limited to 'src/nvim/drawline.c')
-rw-r--r--src/nvim/drawline.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c
index a6f3f0c4b3..cbe586d103 100644
--- a/src/nvim/drawline.c
+++ b/src/nvim/drawline.c
@@ -300,7 +300,6 @@ static void draw_virt_text(win_T *wp, buf_T *buf, int col_off, int *end_col, int
if (vt->pos == kVPosEndOfLine && do_eol) {
state->eol_col = col + 1;
}
- // TODO(zeertzjq): set values in linebuf_vcol[]
*end_col = MAX(*end_col, col);
}
if (!vt || !(vt->flags & kVTRepeatLinebreak)) {
@@ -2571,6 +2570,10 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
decor_redraw_eol(wp, &decor_state, &wlv.line_attr, wlv.col + eol_skip);
}
+ for (int i = wlv.col; i < grid->cols; i++) {
+ linebuf_vcol[wlv.off + (i - wlv.col)] = wlv.vcol + (i - wlv.col);
+ }
+
if (((wp->w_p_cuc
&& wp->w_virtcol >= vcol_hlc(wlv) - eol_hl_off
&& wp->w_virtcol < grid->cols * (ptrdiff_t)(wlv.row - startrow + 1) + start_col
@@ -2596,8 +2599,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
while (wlv.col < grid->cols) {
linebuf_char[wlv.off] = schar_from_ascii(' ');
- linebuf_vcol[wlv.off] = wlv.vcol;
- wlv.col++;
+
advance_color_col(&wlv, vcol_hlc(wlv));
int col_attr = base_attr;
@@ -2616,7 +2618,9 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
col_attr = hl_combine_attr(col_attr, wlv.line_attr);
linebuf_attr[wlv.off] = col_attr;
+ // linebuf_vcol[] already filled by the for loop above
wlv.off++;
+ wlv.col++;
if (vcol_hlc(wlv) >= rightmost_vcol) {
break;
@@ -2857,13 +2861,17 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
int draw_col = wlv.col - wlv.boguscols;
+ for (int i = draw_col; i < grid->cols; i++) {
+ linebuf_vcol[wlv.off + (i - draw_col)] = wlv.vcol - 1;
+ }
+
// Apply 'cursorline' highlight.
if (wlv.boguscols != 0 && (wlv.line_attr_lowprio != 0 || wlv.line_attr != 0)) {
int attr = hl_combine_attr(wlv.line_attr_lowprio, wlv.line_attr);
while (draw_col < grid->cols) {
linebuf_char[wlv.off] = schar_from_char(' ');
linebuf_attr[wlv.off] = attr;
- linebuf_vcol[wlv.off] = wlv.vcol - 1;
+ // linebuf_vcol[] already filled by the for loop above
wlv.off++;
draw_col++;
}