mirror of
https://github.com/neovim/neovim.git
synced 2024-12-19 10:45:16 -07:00
fix(mouse): click on empty line with 'foldcolumn'
This commit is contained in:
parent
acc32f20be
commit
e25cf47ad3
@ -1861,44 +1861,47 @@ static void mouse_check_grid(colnr_T *vcolp, int *flagsp)
|
||||
int start_row = 0;
|
||||
int start_col = 0;
|
||||
grid_adjust(&gp, &start_row, &start_col);
|
||||
if (gp->handle != click_grid) {
|
||||
if (gp->handle != click_grid || gp->chars == NULL) {
|
||||
return;
|
||||
}
|
||||
click_row += start_row;
|
||||
click_col += start_col;
|
||||
if (click_row < 0 || click_row >= gp->rows
|
||||
|| click_col < 0 || click_col >= gp->cols) {
|
||||
return;
|
||||
}
|
||||
|
||||
colnr_T col_from_screen = -1;
|
||||
const size_t off = gp->line_offset[click_row] + (size_t)click_col;
|
||||
colnr_T col_from_screen = gp->vcols[off];
|
||||
|
||||
if (gp->chars != NULL
|
||||
&& click_row >= 0 && click_row < gp->rows
|
||||
&& click_col >= 0 && click_col < gp->cols) {
|
||||
const size_t off = gp->line_offset[click_row] + (size_t)click_col;
|
||||
col_from_screen = gp->vcols[off];
|
||||
|
||||
if (col_from_screen == MAXCOL) {
|
||||
// When clicking after end of line, still need to set correct curswant
|
||||
size_t off_l = gp->line_offset[click_row] + (size_t)start_col;
|
||||
if (gp->vcols[off_l] < MAXCOL) {
|
||||
// Binary search to find last char in line
|
||||
size_t off_r = off;
|
||||
while (off_l < off_r) {
|
||||
size_t off_m = (off_l + off_r + 1) / 2;
|
||||
if (gp->vcols[off_m] < MAXCOL) {
|
||||
off_l = off_m;
|
||||
} else {
|
||||
off_r = off_m - 1;
|
||||
}
|
||||
if (col_from_screen == MAXCOL) {
|
||||
// When clicking after end of line, still need to set correct curswant
|
||||
size_t off_l = gp->line_offset[click_row] + (size_t)start_col;
|
||||
if (gp->vcols[off_l] < MAXCOL) {
|
||||
// Binary search to find last char in line
|
||||
size_t off_r = off;
|
||||
while (off_l < off_r) {
|
||||
size_t off_m = (off_l + off_r + 1) / 2;
|
||||
if (gp->vcols[off_m] < MAXCOL) {
|
||||
off_l = off_m;
|
||||
} else {
|
||||
off_r = off_m - 1;
|
||||
}
|
||||
*vcolp = gp->vcols[off_r] + (int)(off - off_r);
|
||||
} else {
|
||||
// Clicking on an empty line
|
||||
*vcolp = click_col - start_col;
|
||||
}
|
||||
} else if (col_from_screen >= 0) {
|
||||
// Use the virtual column from vcols[], it is accurate also after
|
||||
// concealed characters.
|
||||
*vcolp = col_from_screen;
|
||||
colnr_T eol_vcol = gp->vcols[off_r];
|
||||
assert(eol_vcol < MAXCOL);
|
||||
// This may be -2 or -3 with 'foldcolumn' and empty line.
|
||||
// In that case set it to -1 as it's just before start of line.
|
||||
eol_vcol = MAX(eol_vcol, -1);
|
||||
*vcolp = eol_vcol + (int)(off - off_r);
|
||||
} else {
|
||||
// Clicking on an empty line
|
||||
*vcolp = click_col - start_col;
|
||||
}
|
||||
} else if (col_from_screen >= 0) {
|
||||
// Use the virtual column from vcols[], it is accurate also after
|
||||
// concealed characters.
|
||||
*vcolp = col_from_screen;
|
||||
}
|
||||
|
||||
if (col_from_screen == -2) {
|
||||
|
@ -8831,6 +8831,117 @@ describe('float window', function()
|
||||
meths.input_mouse('left', 'press', '', 0, 3, 15)
|
||||
end
|
||||
eq({0, 3, 1, 0, 10}, funcs.getcurpos())
|
||||
|
||||
command('setlocal foldcolumn=1')
|
||||
feed('zfkgg')
|
||||
if multigrid then
|
||||
screen:expect{grid=[[
|
||||
## grid 1
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[3:----------------------------------------]|
|
||||
## grid 2
|
||||
|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
## grid 3
|
||||
|
|
||||
## grid 4
|
||||
{5:┌────────────────────┐}|
|
||||
{5:│}{19: }{1:^ }{5:│}|
|
||||
{5:│}{19:+}{28:+-- 2 lines: ·····}{5:│}|
|
||||
{5:│}{2:~ }{5:│}|
|
||||
{5:└────────────────────┘}|
|
||||
]], float_pos={
|
||||
[4] = {{id = 1001}, "NW", 1, 0, 5, true, 50};
|
||||
}, win_viewport={
|
||||
[2] = {win = {id = 1000}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
|
||||
[4] = {win = {id = 1001}, topline = 0, botline = 4, curline = 0, curcol = 0, linecount = 3, sum_scroll_delta = 0};
|
||||
}}
|
||||
else
|
||||
screen:expect{grid=[[
|
||||
{5:┌────────────────────┐} |
|
||||
{0:~ }{5:│}{19: }{1:^ }{5:│}{0: }|
|
||||
{0:~ }{5:│}{19:+}{28:+-- 2 lines: ·····}{5:│}{0: }|
|
||||
{0:~ }{5:│}{2:~ }{5:│}{0: }|
|
||||
{0:~ }{5:└────────────────────┘}{0: }|
|
||||
{0:~ }|
|
||||
|
|
||||
]]}
|
||||
end
|
||||
|
||||
if multigrid then
|
||||
meths.input_mouse('left', 'press', '', 4, 2, 1)
|
||||
screen:expect{grid=[[
|
||||
## grid 1
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[3:----------------------------------------]|
|
||||
## grid 2
|
||||
|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
## grid 3
|
||||
|
|
||||
## grid 4
|
||||
{5:┌────────────────────┐}|
|
||||
{5:│}{19: }{1:^ }{5:│}|
|
||||
{5:│}{19:-}{1: }{5:│}|
|
||||
{5:│}{19:│}{1: }{5:│}|
|
||||
{5:└────────────────────┘}|
|
||||
]], float_pos={
|
||||
[4] = {{id = 1001}, "NW", 1, 0, 5, true, 50};
|
||||
}, win_viewport={
|
||||
[2] = {win = {id = 1000}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
|
||||
[4] = {win = {id = 1001}, topline = 0, botline = 3, curline = 0, curcol = 0, linecount = 3, sum_scroll_delta = 0};
|
||||
}}
|
||||
else
|
||||
meths.input_mouse('left', 'press', '', 0, 2, 6)
|
||||
screen:expect{grid=[[
|
||||
{5:┌────────────────────┐} |
|
||||
{0:~ }{5:│}{19: }{1:^ }{5:│}{0: }|
|
||||
{0:~ }{5:│}{19:-}{1: }{5:│}{0: }|
|
||||
{0:~ }{5:│}{19:│}{1: }{5:│}{0: }|
|
||||
{0:~ }{5:└────────────────────┘}{0: }|
|
||||
{0:~ }|
|
||||
|
|
||||
]]}
|
||||
end
|
||||
|
||||
if multigrid then
|
||||
meths.input_mouse('left', 'press', '', 4, 2, 2)
|
||||
else
|
||||
meths.input_mouse('left', 'press', '', 0, 2, 7)
|
||||
end
|
||||
eq({0, 2, 1, 0, 1}, funcs.getcurpos())
|
||||
|
||||
if multigrid then
|
||||
meths.input_mouse('left', 'press', '', 4, 2, 3)
|
||||
else
|
||||
meths.input_mouse('left', 'press', '', 0, 2, 8)
|
||||
end
|
||||
eq({0, 2, 1, 0, 2}, funcs.getcurpos())
|
||||
|
||||
if multigrid then
|
||||
meths.input_mouse('left', 'press', '', 4, 2, 11)
|
||||
else
|
||||
meths.input_mouse('left', 'press', '', 0, 2, 16)
|
||||
end
|
||||
eq({0, 2, 1, 0, 10}, funcs.getcurpos())
|
||||
end)
|
||||
|
||||
it("'winblend' option", function()
|
||||
|
Loading…
Reference in New Issue
Block a user