Skip to content

Commit

Permalink
fix(mouse): 'statuscolumn' fold and popopmenu handling
Browse files Browse the repository at this point in the history
Problem:  A right-click on the 'statuscolumn' does not open the
          popupmenu, even if a cell without a clickdef is clicked.
          Clicking the %C fold item does not open/close the fold.
Solution: Open the popupmenu when there is no clickdef like right-clicking
          the sign/numbercolumn does. Fill "linebuf_vcol" when drawing the
          'statuscolumn' to handle foldcolumn item clicks.
  • Loading branch information
luukvbaal committed Jan 23, 2025
1 parent a450fda commit 2cd7225
Show file tree
Hide file tree
Showing 5 changed files with 189 additions and 126 deletions.
25 changes: 15 additions & 10 deletions src/nvim/drawline.c
Original file line number Diff line number Diff line change
Expand Up @@ -368,22 +368,22 @@ static int draw_virt_text_item(buf_T *buf, int col, VirtText vt, HlMode hl_mode,

// TODO(bfredl): integrate with grid.c linebuf code? madness?
static void draw_col_buf(win_T *wp, winlinevars_T *wlv, const char *text, size_t len, int attr,
bool vcol)
const colnr_T *fold_vcol, bool inc_vcol)
{
const char *ptr = text;
while (ptr < text + len && wlv->off < wp->w_grid.cols) {
int cells = line_putchar(wp->w_buffer, &ptr, &linebuf_char[wlv->off],
wp->w_grid.cols - wlv->off, wlv->off);
int myattr = attr;
if (vcol) {
if (inc_vcol) {
advance_color_col(wlv, wlv->vcol);
if (wlv->color_cols && wlv->vcol == *wlv->color_cols) {
myattr = hl_combine_attr(win_hl_attr(wp, HLF_MC), myattr);
}
}
for (int c = 0; c < cells; c++) {
linebuf_attr[wlv->off] = myattr;
linebuf_vcol[wlv->off] = vcol ? wlv->vcol++ : -1;
linebuf_vcol[wlv->off] = inc_vcol ? wlv->vcol++ : fold_vcol ? *(fold_vcol++) : -1;
wlv->off++;
}
}
Expand Down Expand Up @@ -412,7 +412,7 @@ static void draw_foldcolumn(win_T *wp, winlinevars_T *wlv)
int fdc = compute_foldcolumn(wp, 0);
if (fdc > 0) {
int attr = win_hl_attr(wp, use_cursor_line_highlight(wp, wlv->lnum) ? HLF_CLF : HLF_FC);
fill_foldcolumn(wp, wlv->foldinfo, wlv->lnum, attr, fdc, &wlv->off, NULL);
fill_foldcolumn(wp, wlv->foldinfo, wlv->lnum, attr, fdc, &wlv->off, NULL, NULL);
}
}

Expand All @@ -421,8 +421,9 @@ static void draw_foldcolumn(win_T *wp, winlinevars_T *wlv)
/// @param fdc Current width of the foldcolumn
/// @param[out] wlv_off Pointer to linebuf offset, incremented for default column
/// @param[out] out_buffer Char array to fill, only used for 'statuscolumn'
/// @param[out] out_vcol vcol array to fill, only used for 'statuscolumn'
void fill_foldcolumn(win_T *wp, foldinfo_T foldinfo, linenr_T lnum, int attr, int fdc, int *wlv_off,
schar_T *out_buffer)
colnr_T *out_vcol, schar_T *out_buffer)
{
bool closed = foldinfo.fi_level != 0 && foldinfo.fi_lines > 0;
int level = foldinfo.fi_level;
Expand All @@ -448,10 +449,12 @@ void fill_foldcolumn(win_T *wp, foldinfo_T foldinfo, linenr_T lnum, int attr, in
symbol = schar_from_ascii('>');
}

int vcol = i >= level ? -1 : (i == closedcol - 1 && closed) ? -2 : -3;
if (out_buffer) {
out_vcol[i] = vcol;
out_buffer[i] = symbol;
} else {
linebuf_vcol[*wlv_off] = i >= level ? -1 : (i == closedcol - 1 && closed) ? -2 : -3;
linebuf_vcol[*wlv_off] = vcol;
linebuf_attr[*wlv_off] = attr;
linebuf_char[(*wlv_off)++] = symbol;
}
Expand Down Expand Up @@ -577,7 +580,7 @@ static void draw_lnum_col(win_T *wp, winlinevars_T *wlv)
char *num = skipwhite(buf);
rl_mirror_ascii(num, skiptowhite(num));
}
draw_col_buf(wp, wlv, buf, (size_t)width, attr, false);
draw_col_buf(wp, wlv, buf, (size_t)width, attr, NULL, false);
} else {
draw_col_fill(wlv, schar_from_ascii(' '), width, attr);
}
Expand Down Expand Up @@ -632,6 +635,7 @@ static void draw_statuscol(win_T *wp, winlinevars_T *wlv, linenr_T lnum, int vir

char *p = buf;
char transbuf[MAXPATHL];
colnr_T *fold_vcol = NULL;
size_t len = strlen(buf);
int scl_attr = win_hl_attr(wp, use_cursor_line_highlight(wp, wlv->lnum) ? HLF_CLS : HLF_SC);
int num_attr = hl_combine_attr(get_line_number_attr(wp, wlv),
Expand All @@ -643,13 +647,14 @@ static void draw_statuscol(win_T *wp, winlinevars_T *wlv, linenr_T lnum, int vir
ptrdiff_t textlen = sp->start - p;
// Make all characters printable.
size_t translen = transstr_buf(p, textlen, transbuf, MAXPATHL, true);
draw_col_buf(wp, wlv, transbuf, translen, cur_attr, false);
draw_col_buf(wp, wlv, transbuf, translen, cur_attr, fold_vcol, false);
int attr = sp->item == STL_SIGNCOL ? scl_attr : sp->item == STL_FOLDCOL ? 0 : num_attr;
cur_attr = hl_combine_attr(attr, sp->userhl < 0 ? syn_id2attr(-sp->userhl) : 0);
fold_vcol = sp->item == STL_FOLDCOL ? stcp->fold_vcol : NULL;
p = sp->start;
}
size_t translen = transstr_buf(p, buf + len - p, transbuf, MAXPATHL, true);
draw_col_buf(wp, wlv, transbuf, translen, num_attr, false);
draw_col_buf(wp, wlv, transbuf, translen, num_attr, fold_vcol, false);
draw_col_fill(wlv, schar_from_ascii(' '), stcp->width - width, num_attr);
}

Expand Down Expand Up @@ -722,7 +727,7 @@ static void handle_showbreak_and_filler(win_T *wp, winlinevars_T *wlv)
// Combine 'showbreak' with 'cursorline', prioritizing 'showbreak'.
int attr = hl_combine_attr(wlv->cul_attr, win_hl_attr(wp, HLF_AT));
colnr_T vcol_before = wlv->vcol;
draw_col_buf(wp, wlv, sbr, strlen(sbr), attr, true);
draw_col_buf(wp, wlv, sbr, strlen(sbr), attr, NULL, true);
wlv->vcol_sbr = wlv->vcol;

// Correct start of highlighted area for 'showbreak'.
Expand Down
Loading

0 comments on commit 2cd7225

Please sign in to comment.