neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 44dbfcfba4b09bb0e38f4a3f1960fa256a7bed71
parent d7aba51d39c7409ef388ed7cffe3e31d9fcec163
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Tue, 21 Jan 2025 20:50:33 +0800

feat(tui): recognize X1 and X2 mouse events

Ref:
https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Other-buttons

Diffstat:
Msrc/nvim/os/input.c | 1+
Msrc/nvim/tui/input.c | 4++++
Msrc/nvim/tui/termkey/driver-csi.c | 6++++++
3 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c @@ -403,6 +403,7 @@ static unsigned handle_mouse_event(const char **ptr, uint8_t *buf, unsigned bufs if (type != KS_EXTRA || !((mouse_code >= KE_LEFTMOUSE && mouse_code <= KE_RIGHTRELEASE) + || (mouse_code >= KE_X1MOUSE && mouse_code <= KE_X2RELEASE) || (mouse_code >= KE_MOUSEDOWN && mouse_code <= KE_MOUSERIGHT) || mouse_code == KE_MOUSEMOVE)) { return bufsize; diff --git a/src/nvim/tui/input.c b/src/nvim/tui/input.c @@ -387,6 +387,10 @@ static void forward_mouse_event(TermInput *input, TermKeyKey *key) len += (size_t)snprintf(buf + len, sizeof(buf) - len, "Middle"); } else if (button == 3) { len += (size_t)snprintf(buf + len, sizeof(buf) - len, "Right"); + } else if (button == 8) { + len += (size_t)snprintf(buf + len, sizeof(buf) - len, "X1"); + } else if (button == 9) { + len += (size_t)snprintf(buf + len, sizeof(buf) - len, "X2"); } switch (ev) { diff --git a/src/nvim/tui/termkey/driver-csi.c b/src/nvim/tui/termkey/driver-csi.c @@ -327,6 +327,12 @@ TermKeyResult termkey_interpret_mouse(TermKey *tk, const TermKeyKey *key, TermKe btn = code + 4 - 64; break; + case 128: + case 129: + *event = drag ? TERMKEY_MOUSE_DRAG : TERMKEY_MOUSE_PRESS; + btn = code + 8 - 128; + break; + default: *event = TERMKEY_MOUSE_UNKNOWN; }