mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
ui: multigrid mouse support
This commit is contained in:
@@ -440,16 +440,34 @@ describe('ui/mouse/input', function()
|
||||
|
||||
local test_click = function(name, click_str, click_num, mouse_button,
|
||||
modifiers)
|
||||
it(name .. ' works', function()
|
||||
|
||||
local function doit(do_click)
|
||||
eq(1, funcs.has('tablineat'))
|
||||
feed(click_str .. '<3,0>')
|
||||
do_click(0,3)
|
||||
check_reply({0, click_num, mouse_button, modifiers})
|
||||
feed(click_str .. '<4,0>')
|
||||
do_click(0,4)
|
||||
check_reply({})
|
||||
feed(click_str .. '<6,0>')
|
||||
do_click(0,6)
|
||||
check_reply({5, click_num, mouse_button, modifiers, 2})
|
||||
feed(click_str .. '<13,0>')
|
||||
do_click(0,13)
|
||||
check_reply({5, click_num, mouse_button, modifiers, 2})
|
||||
end
|
||||
|
||||
it(name .. ' works (pseudokey)', function()
|
||||
doit(function (row,col)
|
||||
feed(click_str .. '<' .. col .. ',' .. row .. '>')
|
||||
end)
|
||||
end)
|
||||
|
||||
it(name .. ' works (nvim_input_mouse)', function()
|
||||
doit(function (row,col)
|
||||
local buttons = {l='left',m='middle',r='right'}
|
||||
local modstr = (click_num > 1) and tostring(click_num) or ''
|
||||
for char in string.gmatch(modifiers, '%w') do
|
||||
modstr = modstr .. char .. '-' -- - not needed but should be accepted
|
||||
end
|
||||
meths.input_mouse(buttons[mouse_button], 'press', modstr, 0, row, col)
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
@@ -617,7 +635,7 @@ describe('ui/mouse/input', function()
|
||||
feed('<cr>')
|
||||
end)
|
||||
|
||||
it('mouse whell will target the hovered window', function()
|
||||
local function wheel(use_api)
|
||||
feed('ggdG')
|
||||
insert([[
|
||||
Inserting
|
||||
@@ -647,7 +665,11 @@ describe('ui/mouse/input', function()
|
||||
{4:[No Name] [+] }|
|
||||
:vsp |
|
||||
]])
|
||||
feed('<ScrollWheelDown><0,0>')
|
||||
if use_api then
|
||||
meths.input_mouse('wheel', 'down', '', 0, 0, 0)
|
||||
else
|
||||
feed('<ScrollWheelDown><0,0>')
|
||||
end
|
||||
screen:expect([[
|
||||
mouse scrolling {4:│}lines |
|
||||
^ {4:│}to |
|
||||
@@ -664,7 +686,11 @@ describe('ui/mouse/input', function()
|
||||
{4:[No Name] [+] }|
|
||||
:vsp |
|
||||
]])
|
||||
feed('<ScrollWheelUp><27,0>')
|
||||
if use_api then
|
||||
meths.input_mouse('wheel', 'up', '', 0, 0, 27)
|
||||
else
|
||||
feed('<ScrollWheelUp><27,0>')
|
||||
end
|
||||
screen:expect([[
|
||||
mouse scrolling {4:│}text |
|
||||
^ {4:│}with |
|
||||
@@ -681,7 +707,12 @@ describe('ui/mouse/input', function()
|
||||
{4:[No Name] [+] }|
|
||||
:vsp |
|
||||
]])
|
||||
feed('<ScrollWheelUp><27,7><ScrollWheelUp>')
|
||||
if use_api then
|
||||
meths.input_mouse('wheel', 'up', '', 0, 7, 27)
|
||||
meths.input_mouse('wheel', 'up', '', 0, 7, 27)
|
||||
else
|
||||
feed('<ScrollWheelUp><27,7><ScrollWheelUp>')
|
||||
end
|
||||
screen:expect([[
|
||||
mouse scrolling {4:│}text |
|
||||
^ {4:│}with |
|
||||
@@ -698,9 +729,17 @@ describe('ui/mouse/input', function()
|
||||
{4:[No Name] [+] }|
|
||||
:vsp |
|
||||
]])
|
||||
end
|
||||
|
||||
it('mouse wheel will target the hovered window (pseudokey)', function()
|
||||
wheel(false)
|
||||
end)
|
||||
|
||||
it('horizontal scrolling', function()
|
||||
it('mouse wheel will target the hovered window (nvim_input_mouse)', function()
|
||||
wheel(true)
|
||||
end)
|
||||
|
||||
it('horizontal scrolling (pseudokey)', function()
|
||||
command('set sidescroll=0')
|
||||
feed("<esc>:set nowrap<cr>")
|
||||
|
||||
@@ -732,6 +771,39 @@ describe('ui/mouse/input', function()
|
||||
]])
|
||||
end)
|
||||
|
||||
it('horizontal scrolling (nvim_input_mouse)', function()
|
||||
command('set sidescroll=0')
|
||||
feed("<esc>:set nowrap<cr>")
|
||||
|
||||
feed("a <esc>20Ab<esc>")
|
||||
screen:expect([[
|
||||
|
|
||||
|
|
||||
bbbbbbbbbbbbbbb^b |
|
||||
{0:~ }|
|
||||
|
|
||||
]])
|
||||
|
||||
meths.input_mouse('wheel', 'left', '', 0, 0, 27)
|
||||
screen:expect([[
|
||||
|
|
||||
|
|
||||
n bbbbbbbbbbbbbbbbbbb^b |
|
||||
{0:~ }|
|
||||
|
|
||||
]])
|
||||
|
||||
feed("^")
|
||||
meths.input_mouse('wheel', 'right', '', 0, 0, 0)
|
||||
screen:expect([[
|
||||
g |
|
||||
|
|
||||
^t and selection bbbbbbbbb|
|
||||
{0:~ }|
|
||||
|
|
||||
]])
|
||||
end)
|
||||
|
||||
describe('on concealed text', function()
|
||||
-- Helpful for reading the test expectations:
|
||||
-- :match Error /\^/
|
||||
|
||||
@@ -3,9 +3,11 @@ local Screen = require('test.functional.ui.screen')
|
||||
local clear = helpers.clear
|
||||
local feed, command, insert = helpers.feed, helpers.command, helpers.insert
|
||||
local eq = helpers.eq
|
||||
local meths = helpers.meths
|
||||
local wait = helpers.wait
|
||||
|
||||
|
||||
describe('multigrid screen', function()
|
||||
describe('ext_multigrid', function()
|
||||
local screen
|
||||
|
||||
before_each(function()
|
||||
@@ -1521,4 +1523,337 @@ describe('multigrid screen', function()
|
||||
{1:~ }|
|
||||
]])
|
||||
end)
|
||||
|
||||
it('supports mouse', function()
|
||||
insert('some text\nto be clicked')
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
{11:[No Name] [+] }|
|
||||
|
|
||||
## grid 2
|
||||
some text |
|
||||
to be clicke^d |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
]])
|
||||
|
||||
meths.input_mouse('left', 'press', '', 2, 0, 5)
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
{11:[No Name] [+] }|
|
||||
|
|
||||
## grid 2
|
||||
some ^text |
|
||||
to be clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
]])
|
||||
|
||||
feed(':new<cr>')
|
||||
insert('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmo')
|
||||
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
{11:[No Name] [+] }|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
{12:[No Name] [+] }|
|
||||
|
|
||||
## grid 2
|
||||
some text |
|
||||
to be clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
## grid 3
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing el|
|
||||
it, sed do eiusm^o |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
]])
|
||||
|
||||
meths.input_mouse('left', 'press', '', 2, 1, 6)
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
{12:[No Name] [+] }|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
{11:[No Name] [+] }|
|
||||
|
|
||||
## grid 2
|
||||
some text |
|
||||
to be ^clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
## grid 3
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing el|
|
||||
it, sed do eiusmo |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
]])
|
||||
|
||||
meths.input_mouse('left', 'press', '', 3, 1, 4)
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
{11:[No Name] [+] }|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
{12:[No Name] [+] }|
|
||||
|
|
||||
## grid 2
|
||||
some text |
|
||||
to be clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
## grid 3
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing el|
|
||||
it, ^sed do eiusmo |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
]])
|
||||
|
||||
screen:try_resize_grid(3, 80, 2)
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
{11:[No Name] [+] }|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
{12:[No Name] [+] }|
|
||||
|
|
||||
## grid 2
|
||||
some text |
|
||||
to be clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
## grid 3
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, ^sed do eiusmo |
|
||||
{1:~ }|
|
||||
]])
|
||||
|
||||
meths.input_mouse('left', 'press', '', 3, 0, 64)
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
{11:[No Name] [+] }|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
{12:[No Name] [+] }|
|
||||
|
|
||||
## grid 2
|
||||
some text |
|
||||
to be clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
## grid 3
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do ^eiusmo |
|
||||
{1:~ }|
|
||||
]])
|
||||
|
||||
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 wait be sure.
|
||||
wait()
|
||||
meths.input_mouse('left', 'drag', '', 1, 4, 20)
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
{11:[No Name] [+] }|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
[2:-----------------------------------------------------]|
|
||||
{12:[No Name] [+] }|
|
||||
|
|
||||
## grid 2
|
||||
some text |
|
||||
to be clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
## grid 3
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do ^eiusmo |
|
||||
{1:~ }|
|
||||
]])
|
||||
|
||||
feed('<c-w><c-w><c-w>v')
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
{12:[No Name] [+] }|
|
||||
[4:--------------------------]{12:│}[2:--------------------------]|
|
||||
[4:--------------------------]{12:│}[2:--------------------------]|
|
||||
[4:--------------------------]{12:│}[2:--------------------------]|
|
||||
[4:--------------------------]{12:│}[2:--------------------------]|
|
||||
[4:--------------------------]{12:│}[2:--------------------------]|
|
||||
[4:--------------------------]{12:│}[2:--------------------------]|
|
||||
[4:--------------------------]{12:│}[2:--------------------------]|
|
||||
{11:[No Name] [+] }{12:[No Name] [+] }|
|
||||
|
|
||||
## grid 2
|
||||
some text |
|
||||
to be clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
## grid 3
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmo |
|
||||
{1:~ }|
|
||||
## grid 4
|
||||
some text |
|
||||
to be ^clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
]])
|
||||
|
||||
meths.input_mouse('left', 'press', '', 1,8, 26)
|
||||
wait()
|
||||
meths.input_mouse('left', 'drag', '', 1, 6, 30)
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
[3:-----------------------------------------------------]|
|
||||
{12:[No Name] [+] }|
|
||||
[4:------------------------------]{12:│}[2:----------------------]|
|
||||
[4:------------------------------]{12:│}[2:----------------------]|
|
||||
[4:------------------------------]{12:│}[2:----------------------]|
|
||||
[4:------------------------------]{12:│}[2:----------------------]|
|
||||
[4:------------------------------]{12:│}[2:----------------------]|
|
||||
[4:------------------------------]{12:│}[2:----------------------]|
|
||||
[4:------------------------------]{12:│}[2:----------------------]|
|
||||
{11:[No Name] [+] }{12:[No Name] [+] }|
|
||||
|
|
||||
## grid 2
|
||||
some text |
|
||||
to be clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
## grid 3
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmo |
|
||||
{1:~ }|
|
||||
## grid 4
|
||||
some text |
|
||||
to be ^clicked |
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
{1:~ }|
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user