mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
feat(tui): recognize sidescroll events (#19992)
Ref https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Other-buttons This works in xterm and kitty. CSI < 66 ; x ; y M sequence is for ScrollWheelLeft. CSI < 67 ; x ; y M sequence is for ScrollWheelRight.
This commit is contained in:
parent
7f20d61e00
commit
568737d5b3
@ -398,6 +398,14 @@ static void forward_mouse_event(TermInput *input, TermKeyKey *key)
|
||||
button = last_pressed_button;
|
||||
}
|
||||
|
||||
if (ev == TERMKEY_MOUSE_UNKNOWN && !(key->code.mouse[0] & 0x20)) {
|
||||
int code = key->code.mouse[0] & ~0x3c;
|
||||
if (code == 66 || code == 67) {
|
||||
ev = TERMKEY_MOUSE_PRESS;
|
||||
button = code - 60;
|
||||
}
|
||||
}
|
||||
|
||||
if (button == 0 || (ev != TERMKEY_MOUSE_PRESS && ev != TERMKEY_MOUSE_DRAG
|
||||
&& ev != TERMKEY_MOUSE_RELEASE)) {
|
||||
return;
|
||||
@ -431,8 +439,11 @@ static void forward_mouse_event(TermInput *input, TermKeyKey *key)
|
||||
if (button == 4) {
|
||||
len += (size_t)snprintf(buf + len, sizeof(buf) - len, "ScrollWheelUp");
|
||||
} else if (button == 5) {
|
||||
len += (size_t)snprintf(buf + len, sizeof(buf) - len,
|
||||
"ScrollWheelDown");
|
||||
len += (size_t)snprintf(buf + len, sizeof(buf) - len, "ScrollWheelDown");
|
||||
} else if (button == 6) {
|
||||
len += (size_t)snprintf(buf + len, sizeof(buf) - len, "ScrollWheelLeft");
|
||||
} else if (button == 7) {
|
||||
len += (size_t)snprintf(buf + len, sizeof(buf) - len, "ScrollWheelRight");
|
||||
} else {
|
||||
len += (size_t)snprintf(buf + len, sizeof(buf) - len, "Mouse");
|
||||
last_pressed_button = button;
|
||||
|
@ -297,6 +297,199 @@ describe('TUI', function()
|
||||
]], attrs)
|
||||
end)
|
||||
|
||||
it('accepts mouse wheel events #19992', function()
|
||||
child_session:request('nvim_command', [[
|
||||
set number nostartofline nowrap mousescroll=hor:1,ver:1
|
||||
call setline(1, repeat([join(range(10), '----')], 10))
|
||||
vsplit
|
||||
]])
|
||||
screen:expect([[
|
||||
{11: 1 }{1:0}----1----2----3----4│{11: 1 }0----1----2----3----|
|
||||
{11: 2 }0----1----2----3----4│{11: 2 }0----1----2----3----|
|
||||
{11: 3 }0----1----2----3----4│{11: 3 }0----1----2----3----|
|
||||
{11: 4 }0----1----2----3----4│{11: 4 }0----1----2----3----|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <ScrollWheelDown> in active window
|
||||
feed_data('\027[<65;8;1M')
|
||||
screen:expect([[
|
||||
{11: 2 }{1:0}----1----2----3----4│{11: 1 }0----1----2----3----|
|
||||
{11: 3 }0----1----2----3----4│{11: 2 }0----1----2----3----|
|
||||
{11: 4 }0----1----2----3----4│{11: 3 }0----1----2----3----|
|
||||
{11: 5 }0----1----2----3----4│{11: 4 }0----1----2----3----|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <ScrollWheelDown> in inactive window
|
||||
feed_data('\027[<65;48;1M')
|
||||
screen:expect([[
|
||||
{11: 2 }{1:0}----1----2----3----4│{11: 2 }0----1----2----3----|
|
||||
{11: 3 }0----1----2----3----4│{11: 3 }0----1----2----3----|
|
||||
{11: 4 }0----1----2----3----4│{11: 4 }0----1----2----3----|
|
||||
{11: 5 }0----1----2----3----4│{11: 5 }0----1----2----3----|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <ScrollWheelRight> in active window
|
||||
feed_data('\027[<67;8;1M')
|
||||
screen:expect([[
|
||||
{11: 2 }{1:-}---1----2----3----4-│{11: 2 }0----1----2----3----|
|
||||
{11: 3 }----1----2----3----4-│{11: 3 }0----1----2----3----|
|
||||
{11: 4 }----1----2----3----4-│{11: 4 }0----1----2----3----|
|
||||
{11: 5 }----1----2----3----4-│{11: 5 }0----1----2----3----|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <ScrollWheelRight> in inactive window
|
||||
feed_data('\027[<67;48;1M')
|
||||
screen:expect([[
|
||||
{11: 2 }{1:-}---1----2----3----4-│{11: 2 }----1----2----3----4|
|
||||
{11: 3 }----1----2----3----4-│{11: 3 }----1----2----3----4|
|
||||
{11: 4 }----1----2----3----4-│{11: 4 }----1----2----3----4|
|
||||
{11: 5 }----1----2----3----4-│{11: 5 }----1----2----3----4|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <S-ScrollWheelDown> in active window
|
||||
feed_data('\027[<69;8;1M')
|
||||
screen:expect([[
|
||||
{11: 5 }{1:-}---1----2----3----4-│{11: 2 }----1----2----3----4|
|
||||
{11: 6 }----1----2----3----4-│{11: 3 }----1----2----3----4|
|
||||
{11: 7 }----1----2----3----4-│{11: 4 }----1----2----3----4|
|
||||
{11: 8 }----1----2----3----4-│{11: 5 }----1----2----3----4|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <S-ScrollWheelDown> in inactive window
|
||||
feed_data('\027[<69;48;1M')
|
||||
screen:expect([[
|
||||
{11: 5 }{1:-}---1----2----3----4-│{11: 5 }----1----2----3----4|
|
||||
{11: 6 }----1----2----3----4-│{11: 6 }----1----2----3----4|
|
||||
{11: 7 }----1----2----3----4-│{11: 7 }----1----2----3----4|
|
||||
{11: 8 }----1----2----3----4-│{11: 8 }----1----2----3----4|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <S-ScrollWheelRight> in active window
|
||||
feed_data('\027[<71;8;1M')
|
||||
screen:expect([[
|
||||
{11: 5 }{1:-}---6----7----8----9 │{11: 5 }----1----2----3----4|
|
||||
{11: 6 }----6----7----8----9 │{11: 6 }----1----2----3----4|
|
||||
{11: 7 }----6----7----8----9 │{11: 7 }----1----2----3----4|
|
||||
{11: 8 }----6----7----8----9 │{11: 8 }----1----2----3----4|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <S-ScrollWheelRight> in inactive window
|
||||
feed_data('\027[<71;48;1M')
|
||||
screen:expect([[
|
||||
{11: 5 }{1:-}---6----7----8----9 │{11: 5 }5----6----7----8----|
|
||||
{11: 6 }----6----7----8----9 │{11: 6 }5----6----7----8----|
|
||||
{11: 7 }----6----7----8----9 │{11: 7 }5----6----7----8----|
|
||||
{11: 8 }----6----7----8----9 │{11: 8 }5----6----7----8----|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <ScrollWheelUp> in active window
|
||||
feed_data('\027[<64;8;1M')
|
||||
screen:expect([[
|
||||
{11: 4 }----6----7----8----9 │{11: 5 }5----6----7----8----|
|
||||
{11: 5 }{1:-}---6----7----8----9 │{11: 6 }5----6----7----8----|
|
||||
{11: 6 }----6----7----8----9 │{11: 7 }5----6----7----8----|
|
||||
{11: 7 }----6----7----8----9 │{11: 8 }5----6----7----8----|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <ScrollWheelUp> in inactive window
|
||||
feed_data('\027[<64;48;1M')
|
||||
screen:expect([[
|
||||
{11: 4 }----6----7----8----9 │{11: 4 }5----6----7----8----|
|
||||
{11: 5 }{1:-}---6----7----8----9 │{11: 5 }5----6----7----8----|
|
||||
{11: 6 }----6----7----8----9 │{11: 6 }5----6----7----8----|
|
||||
{11: 7 }----6----7----8----9 │{11: 7 }5----6----7----8----|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <ScrollWheelLeft> in active window
|
||||
feed_data('\027[<66;8;1M')
|
||||
screen:expect([[
|
||||
{11: 4 }5----6----7----8----9│{11: 4 }5----6----7----8----|
|
||||
{11: 5 }5{1:-}---6----7----8----9│{11: 5 }5----6----7----8----|
|
||||
{11: 6 }5----6----7----8----9│{11: 6 }5----6----7----8----|
|
||||
{11: 7 }5----6----7----8----9│{11: 7 }5----6----7----8----|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <ScrollWheelLeft> in inactive window
|
||||
feed_data('\027[<66;48;1M')
|
||||
screen:expect([[
|
||||
{11: 4 }5----6----7----8----9│{11: 4 }-5----6----7----8---|
|
||||
{11: 5 }5{1:-}---6----7----8----9│{11: 5 }-5----6----7----8---|
|
||||
{11: 6 }5----6----7----8----9│{11: 6 }-5----6----7----8---|
|
||||
{11: 7 }5----6----7----8----9│{11: 7 }-5----6----7----8---|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <S-ScrollWheelUp> in active window
|
||||
feed_data('\027[<68;8;1M')
|
||||
screen:expect([[
|
||||
{11: 1 }5----6----7----8----9│{11: 4 }-5----6----7----8---|
|
||||
{11: 2 }5----6----7----8----9│{11: 5 }-5----6----7----8---|
|
||||
{11: 3 }5----6----7----8----9│{11: 6 }-5----6----7----8---|
|
||||
{11: 4 }5{1:-}---6----7----8----9│{11: 7 }-5----6----7----8---|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <S-ScrollWheelUp> in inactive window
|
||||
feed_data('\027[<68;48;1M')
|
||||
screen:expect([[
|
||||
{11: 1 }5----6----7----8----9│{11: 1 }-5----6----7----8---|
|
||||
{11: 2 }5----6----7----8----9│{11: 2 }-5----6----7----8---|
|
||||
{11: 3 }5----6----7----8----9│{11: 3 }-5----6----7----8---|
|
||||
{11: 4 }5{1:-}---6----7----8----9│{11: 4 }-5----6----7----8---|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <S-ScrollWheelLeft> in active window
|
||||
feed_data('\027[<70;8;1M')
|
||||
screen:expect([[
|
||||
{11: 1 }0----1----2----3----4│{11: 1 }-5----6----7----8---|
|
||||
{11: 2 }0----1----2----3----4│{11: 2 }-5----6----7----8---|
|
||||
{11: 3 }0----1----2----3----4│{11: 3 }-5----6----7----8---|
|
||||
{11: 4 }0----1----2----3----{1:4}│{11: 4 }-5----6----7----8---|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
-- <S-ScrollWheelLeft> in inactive window
|
||||
feed_data('\027[<70;48;1M')
|
||||
screen:expect([[
|
||||
{11: 1 }0----1----2----3----4│{11: 1 }0----1----2----3----|
|
||||
{11: 2 }0----1----2----3----4│{11: 2 }0----1----2----3----|
|
||||
{11: 3 }0----1----2----3----4│{11: 3 }0----1----2----3----|
|
||||
{11: 4 }0----1----2----3----{1:4}│{11: 4 }0----1----2----3----|
|
||||
{5:[No Name] [+] }{1:[No Name] [+] }|
|
||||
|
|
||||
{3:-- TERMINAL --} |
|
||||
]])
|
||||
end)
|
||||
|
||||
it('accepts keypad keys from kitty keyboard protocol #19180', function()
|
||||
feed_data('i')
|
||||
feed_data(funcs.nr2char(57399)) -- KP_0
|
||||
|
Loading…
Reference in New Issue
Block a user