fix(mouse): handle folded lines with virt_lines attached to line above (#23912)

This commit is contained in:
zeertzjq 2023-06-05 17:11:58 +08:00 committed by GitHub
parent 16561dac39
commit a3fba5cafc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 162 additions and 9 deletions

View File

@ -1310,14 +1310,13 @@ retnomove:
} }
first = false; first = false;
if (curwin->w_topfill > 0) {
curwin->w_topfill--;
} else {
if (hasFolding(curwin->w_topline, NULL, &curwin->w_topline) if (hasFolding(curwin->w_topline, NULL, &curwin->w_topline)
&& curwin->w_topline == curbuf->b_ml.ml_line_count) { && curwin->w_topline == curbuf->b_ml.ml_line_count) {
break; break;
} }
if (curwin->w_topfill > 0) {
curwin->w_topfill--;
} else {
curwin->w_topline++; curwin->w_topline++;
curwin->w_topfill = win_get_fill(curwin, curwin->w_topline); curwin->w_topfill = win_get_fill(curwin, curwin->w_topline);
} }
@ -1403,8 +1402,7 @@ bool mouse_comp_pos(win_T *win, int *rowp, int *colp, linenr_T *lnump)
while (row > 0) { while (row > 0) {
// Don't include filler lines in "count" // Don't include filler lines in "count"
if (win_may_fill(win) if (win_may_fill(win)) {
&& !hasFoldingWin(win, lnum, NULL, NULL, true, NULL)) {
if (lnum == win->w_topline) { if (lnum == win->w_topline) {
row -= win->w_topfill; row -= win->w_topfill;
} else { } else {

View File

@ -136,8 +136,7 @@ int plines_win_nofold(win_T *wp, linenr_T lnum)
/// used from the start of the line to the given column number. /// used from the start of the line to the given column number.
int plines_win_col(win_T *wp, linenr_T lnum, long column) int plines_win_col(win_T *wp, linenr_T lnum, long column)
{ {
// Check for filler lines above this buffer line. When folded the result // Check for filler lines above this buffer line.
// is one line anyway.
int lines = win_get_fill(wp, lnum); int lines = win_get_fill(wp, lnum);
if (!wp->w_p_wrap) { if (!wp->w_p_wrap) {

View File

@ -45,6 +45,7 @@ describe("folded lines", function()
[13] = {foreground = Screen.colors.Red, background = Screen.colors.LightGrey}, [13] = {foreground = Screen.colors.Red, background = Screen.colors.LightGrey},
[14] = {background = Screen.colors.Red}, [14] = {background = Screen.colors.Red},
[15] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.Red}, [15] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.Red},
[16] = {background = Screen.colors.LightGrey},
}) })
end) end)
@ -2029,6 +2030,17 @@ describe("folded lines", function()
]]) ]])
end end
meths.input_mouse('left', 'press', '', multigrid and 2 or 0, 4, 0)
eq({
column = 1,
line = 3,
screencol = 1,
screenrow = 5,
wincol = 1,
winid = 1000,
winrow = 5,
}, funcs.getmousepos())
meths.buf_set_extmark(0, ns, 1, 0, { virt_lines = {{{"more virt_line below line 2", ""}}} }) meths.buf_set_extmark(0, ns, 1, 0, { virt_lines = {{{"more virt_line below line 2", ""}}} })
feed('G<C-E>') feed('G<C-E>')
if multigrid then if multigrid then
@ -2245,6 +2257,150 @@ describe("folded lines", function()
| |
]]) ]])
end end
feed('3<C-Y>')
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[3:---------------------------------------------]|
## grid 2
virt_line below line 2 |
more virt_line below line 2 |
{5:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|
{1:~ }|
{1:~ }|
## grid 3
|
]])
else
screen:expect([[
virt_line below line 2 |
more virt_line below line 2 |
{5:+-- 2 lines: line 3·························}|
^line 5 |
{1:~ }|
{1:~ }|
{1:~ }|
|
]])
end
meths.input_mouse('left', 'press', '3', multigrid and 2 or 0, 3, 0)
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[3:---------------------------------------------]|
## grid 2
virt_line below line 2 |
more virt_line below line 2 |
{5:+-- 2 lines: line 3·························}|
^l{16:ine 5} |
{1:~ }|
{1:~ }|
{1:~ }|
## grid 3
{11:-- VISUAL LINE --} |
]])
else
screen:expect([[
virt_line below line 2 |
more virt_line below line 2 |
{5:+-- 2 lines: line 3·························}|
^l{16:ine 5} |
{1:~ }|
{1:~ }|
{1:~ }|
{11:-- VISUAL LINE --} |
]])
end
meths.input_mouse('left', 'drag', '3', multigrid and 2 or 0, 7, 0)
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[3:---------------------------------------------]|
## grid 2
more virt_line below line 2 |
{5:+-- 2 lines: line 3·························}|
^l{16:ine 5} |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
## grid 3
{11:-- VISUAL LINE --} |
]])
else
screen:expect([[
more virt_line below line 2 |
{5:+-- 2 lines: line 3·························}|
^l{16:ine 5} |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{11:-- VISUAL LINE --} |
]])
end
meths.input_mouse('left', 'drag', '3', multigrid and 2 or 0, 7, 5)
if multigrid then
screen:expect([[
## grid 1
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[2:---------------------------------------------]|
[3:---------------------------------------------]|
## grid 2
{5:+-- 2 lines: line 3·························}|
{16:line }^5 |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
## grid 3
{11:-- VISUAL LINE --} |
]])
else
screen:expect([[
{5:+-- 2 lines: line 3·························}|
{16:line }^5 |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{11:-- VISUAL LINE --} |
]])
end
end) end)
it('Folded and Visual highlights are combined #19691', function() it('Folded and Visual highlights are combined #19691', function()