fix(mouse): fix mouse drag position with winbar

This commit is contained in:
zeertzjq 2022-05-19 19:11:11 +08:00
parent d200ba654a
commit 0997884ae2
3 changed files with 341 additions and 15 deletions

View File

@ -159,16 +159,16 @@ retnomove:
fdc = win_fdccol_count(wp);
dragwin = NULL;
if (row == -1 + wp->w_winbar_height) {
on_winbar = !!wp->w_winbar_height;
if (row == -1) {
on_winbar = wp->w_winbar_height != 0;
return IN_OTHER_WIN | (on_winbar ? MOUSE_WINBAR : 0);
}
on_winbar = false;
// winpos and height may change in win_enter()!
if (grid == DEFAULT_GRID_HANDLE && row >= wp->w_height) {
if (grid == DEFAULT_GRID_HANDLE && row + wp->w_winbar_height >= wp->w_height) {
// In (or below) status line
on_status_line = row - wp->w_height + 1;
on_status_line = row + wp->w_winbar_height - wp->w_height + 1;
dragwin = wp;
} else {
on_status_line = 0;
@ -406,9 +406,6 @@ bool mouse_comp_pos(win_T *win, int *rowp, int *colp, linenr_T *lnump)
if (win->w_p_rl) {
col = win->w_width_inner - 1 - col;
}
if (win->w_winbar_height) {
row -= win->w_winbar_height;
}
lnum = win->w_topline;
@ -509,7 +506,7 @@ win_T *mouse_find_win(int *gridp, int *rowp, int *colp)
// exist.
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
if (wp == fp->fr_win) {
*rowp -= wp->w_winrow_off - wp->w_winbar_height;
*rowp -= wp->w_winbar_height;
return wp;
}
}

View File

@ -1915,7 +1915,7 @@ describe('ext_multigrid', function()
{1:~ }|
]]}
meths.input_mouse('left', 'press', '', 1,6, 20)
meths.input_mouse('left', 'press', '', 1, 6, 20)
-- TODO(bfredl): "batching" input_mouse is formally not supported yet.
-- Normally it should work fine in async context when nvim is not blocked,
-- but add a poke_eventloop be sure.
@ -2092,7 +2092,6 @@ describe('ext_multigrid', function()
{1:~ }|
{1:~ }|
]]}
end)
it('has viewport information', function()
@ -2409,4 +2408,183 @@ describe('ext_multigrid', function()
[4] = {win = {id = 1001}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1};
}}
end)
it('with winbar dragging statusline with mouse works correctly', function()
meths.set_option('winbar', 'Set Up The Bars')
command('split')
screen:expect([[
## grid 1
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
{11:[No Name] }|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
{12:[No Name] }|
[3:-----------------------------------------------------]|
## grid 2
{7:Set Up The Bars }|
|
{1:~ }|
{1:~ }|
{1:~ }|
## grid 3
|
## grid 4
{7:Set Up The Bars }|
^ |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
]])
meths.input_mouse('left', 'press', '', 1, 6, 20)
poke_eventloop()
meths.input_mouse('left', 'drag', '', 1, 7, 20)
screen:expect([[
## grid 1
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
{11:[No Name] }|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
{12:[No Name] }|
[3:-----------------------------------------------------]|
## grid 2
{7:Set Up The Bars }|
|
{1:~ }|
{1:~ }|
## grid 3
|
## grid 4
{7:Set Up The Bars }|
^ |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
]])
meths.input_mouse('left', 'drag', '', 1, 4, 20)
screen:expect([[
## grid 1
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
{11:[No Name] }|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
{12:[No Name] }|
[3:-----------------------------------------------------]|
## grid 2
{7:Set Up The Bars }|
|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
## grid 3
|
## grid 4
{7:Set Up The Bars }|
^ |
{1:~ }|
{1:~ }|
]])
meths.input_mouse('left', 'press', '', 1, 12, 10)
poke_eventloop()
meths.input_mouse('left', 'drag', '', 1, 10, 10)
screen:expect([[
## grid 1
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
{11:[No Name] }|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
{12:[No Name] }|
[3:-----------------------------------------------------]|
[3:-----------------------------------------------------]|
[3:-----------------------------------------------------]|
## grid 2
{7:Set Up The Bars }|
|
{1:~ }|
{1:~ }|
{1:~ }|
## grid 3
|
|
|
## grid 4
{7:Set Up The Bars }|
^ |
{1:~ }|
{1:~ }|
]])
eq(3, meths.get_option('cmdheight'))
meths.input_mouse('left', 'drag', '', 1, 12, 10)
screen:expect([[
## grid 1
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
{11:[No Name] }|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
[2:-----------------------------------------------------]|
{12:[No Name] }|
[3:-----------------------------------------------------]|
## grid 2
{7:Set Up The Bars }|
|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
## grid 3
|
## grid 4
{7:Set Up The Bars }|
^ |
{1:~ }|
{1:~ }|
]])
eq(1, meths.get_option('cmdheight'))
end)
end)

View File

@ -5,6 +5,7 @@ local command = helpers.command
local insert = helpers.insert
local meths = helpers.meths
local eq = helpers.eq
local poke_eventloop = helpers.poke_eventloop
describe('winbar', function()
local screen
@ -20,8 +21,9 @@ describe('winbar', function()
[4] = {bold = true, reverse = true},
[5] = {bold = true, foreground = Screen.colors.Red},
[6] = {foreground = Screen.colors.Blue},
[7] = {background = Screen.colors.LightGrey},
})
command('set winbar=Set\\ Up\\ The\\ Bars')
meths.set_option('winbar', 'Set Up The Bars')
end)
it('works', function()
screen:expect([[
@ -180,8 +182,9 @@ describe('winbar', function()
|
]])
end)
it('sets correct position on mouse click', function()
insert[[
it('mouse click and drag work correctly in buffer', function()
insert([[
line 1
line 2
line 3
@ -189,9 +192,157 @@ describe('winbar', function()
line -42
line i
line sin(theta)
line 8
]]
line 8]])
meths.input_mouse('left', 'press', '', 0, 5, 1)
screen:expect([[
{1:Set Up The Bars }|
line 1 |
line 2 |
line 3 |
line 4 |
l^ine -42 |
line i |
line sin(theta) |
line 8 |
{3:~ }|
{3:~ }|
{3:~ }|
|
]])
eq({5, 1}, meths.win_get_cursor(0))
meths.input_mouse('left', 'drag', '', 0, 6, 2)
screen:expect([[
{1:Set Up The Bars }|
line 1 |
line 2 |
line 3 |
line 4 |
l{7:ine -42} |
{7:li}^ne i |
line sin(theta) |
line 8 |
{3:~ }|
{3:~ }|
{3:~ }|
{1:-- VISUAL --} |
]])
eq({6, 2}, meths.win_get_cursor(0))
meths.input_mouse('left', 'drag', '', 0, 1, 2)
screen:expect([[
{1:Set Up The Bars }|
li^n{7:e 1} |
{7:line 2} |
{7:line 3} |
{7:line 4} |
{7:li}ne -42 |
line i |
line sin(theta) |
line 8 |
{3:~ }|
{3:~ }|
{3:~ }|
{1:-- VISUAL --} |
]])
eq({1, 2}, meths.win_get_cursor(0))
meths.input_mouse('left', 'drag', '', 0, 0, 2)
screen:expect_unchanged()
eq({1, 2}, meths.win_get_cursor(0))
end)
it('dragging statusline with mouse works correctly', function()
command('split')
screen:expect([[
{1:Set Up The Bars }|
^ |
{3:~ }|
{3:~ }|
{3:~ }|
{4:[No Name] }|
{1:Set Up The Bars }|
|
{3:~ }|
{3:~ }|
{3:~ }|
{2:[No Name] }|
|
]])
meths.input_mouse('left', 'press', '', 1, 5, 10)
poke_eventloop()
meths.input_mouse('left', 'drag', '', 1, 6, 10)
screen:expect([[
{1:Set Up The Bars }|
^ |
{3:~ }|
{3:~ }|
{3:~ }|
{3:~ }|
{4:[No Name] }|
{1:Set Up The Bars }|
|
{3:~ }|
{3:~ }|
{2:[No Name] }|
|
]])
meths.input_mouse('left', 'drag', '', 1, 4, 10)
screen:expect([[
{1:Set Up The Bars }|
^ |
{3:~ }|
{3:~ }|
{4:[No Name] }|
{1:Set Up The Bars }|
|
{3:~ }|
{3:~ }|
{3:~ }|
{3:~ }|
{2:[No Name] }|
|
]])
meths.input_mouse('left', 'press', '', 1, 11, 10)
poke_eventloop()
meths.input_mouse('left', 'drag', '', 1, 9, 10)
screen:expect([[
{1:Set Up The Bars }|
^ |
{3:~ }|
{3:~ }|
{4:[No Name] }|
{1:Set Up The Bars }|
|
{3:~ }|
{3:~ }|
{2:[No Name] }|
|
|
|
]])
eq(3, meths.get_option('cmdheight'))
meths.input_mouse('left', 'drag', '', 1, 11, 10)
screen:expect([[
{1:Set Up The Bars }|
^ |
{3:~ }|
{3:~ }|
{4:[No Name] }|
{1:Set Up The Bars }|
|
{3:~ }|
{3:~ }|
{3:~ }|
{3:~ }|
{2:[No Name] }|
|
]])
eq(1, meths.get_option('cmdheight'))
end)
end)