vim-patch:8.0.1309: cannot use 'balloonexpr' in a terminal

Problem:    Cannot use 'balloonexpr' in a terminal.
Solution:   Add 'balloonevalterm' and add code to handle mouse movements in a
            terminal. Initial implementation for Unix with GUI.
51b0f3701e
This commit is contained in:
Jan Edmund Lazo 2021-05-05 23:09:02 -04:00
parent 4910ac9ab8
commit 51403d6d41
No known key found for this signature in database
GPG Key ID: 64915E6E9F735B15
8 changed files with 20 additions and 6 deletions

View File

@ -992,6 +992,7 @@ static int insert_handle_key(InsertState *s)
case K_LEFTDRAG: case K_LEFTDRAG:
case K_LEFTRELEASE: case K_LEFTRELEASE:
case K_LEFTRELEASE_NM: case K_LEFTRELEASE_NM:
case K_MOUSEMOVE:
case K_MIDDLEMOUSE: case K_MIDDLEMOUSE:
case K_MIDDLEDRAG: case K_MIDDLEDRAG:
case K_MIDDLERELEASE: case K_MIDDLERELEASE:

View File

@ -1953,6 +1953,7 @@ static int command_line_handle_key(CommandLineState *s)
case K_X2MOUSE: case K_X2MOUSE:
case K_X2DRAG: case K_X2DRAG:
case K_X2RELEASE: case K_X2RELEASE:
case K_MOUSEMOVE:
return command_line_not_changed(s); return command_line_not_changed(s);

View File

@ -288,6 +288,7 @@ static const struct key_name_entry {
{ K_LEFTDRAG, "LeftDrag" }, { K_LEFTDRAG, "LeftDrag" },
{ K_LEFTRELEASE, "LeftRelease" }, { K_LEFTRELEASE, "LeftRelease" },
{ K_LEFTRELEASE_NM, "LeftReleaseNM" }, { K_LEFTRELEASE_NM, "LeftReleaseNM" },
{ K_MOUSEMOVE, "MouseMove" },
{ K_MIDDLEMOUSE, "MiddleMouse" }, { K_MIDDLEMOUSE, "MiddleMouse" },
{ K_MIDDLEDRAG, "MiddleDrag" }, { K_MIDDLEDRAG, "MiddleDrag" },
{ K_MIDDLERELEASE, "MiddleRelease" }, { K_MIDDLERELEASE, "MiddleRelease" },
@ -338,9 +339,9 @@ static struct mousetable {
{(int)KE_X2MOUSE, MOUSE_X2, TRUE, FALSE}, {(int)KE_X2MOUSE, MOUSE_X2, TRUE, FALSE},
{(int)KE_X2DRAG, MOUSE_X2, FALSE, TRUE}, {(int)KE_X2DRAG, MOUSE_X2, FALSE, TRUE},
{(int)KE_X2RELEASE, MOUSE_X2, FALSE, FALSE}, {(int)KE_X2RELEASE, MOUSE_X2, FALSE, FALSE},
/* DRAG without CLICK */ // DRAG without CLICK
{(int)KE_IGNORE, MOUSE_RELEASE, FALSE, TRUE}, {(int)K_MOUSEMOVE, MOUSE_RELEASE, FALSE, TRUE},
/* RELEASE without CLICK */ // RELEASE without CLICK
{(int)KE_IGNORE, MOUSE_RELEASE, FALSE, FALSE}, {(int)KE_IGNORE, MOUSE_RELEASE, FALSE, FALSE},
{0, 0, 0, 0}, {0, 0, 0, 0},
}; };

View File

@ -242,7 +242,7 @@ enum key_extra {
, KE_NOP = 97 // no-op: does nothing , KE_NOP = 97 // no-op: does nothing
// , KE_FOCUSGAINED = 98 // focus gained // , KE_FOCUSGAINED = 98 // focus gained
// , KE_FOCUSLOST = 99 // focus lost // , KE_FOCUSLOST = 99 // focus lost
// , KE_MOUSEMOVE = 100 // mouse moved with no button down , KE_MOUSEMOVE = 100 // mouse moved with no button down
// , KE_CANCEL = 101 // return from vgetc // , KE_CANCEL = 101 // return from vgetc
, KE_EVENT = 102 // event , KE_EVENT = 102 // event
, KE_COMMAND = 104 // <Cmd> special key , KE_COMMAND = 104 // <Cmd> special key
@ -411,6 +411,7 @@ enum key_extra {
#define K_LEFTDRAG TERMCAP2KEY(KS_EXTRA, KE_LEFTDRAG) #define K_LEFTDRAG TERMCAP2KEY(KS_EXTRA, KE_LEFTDRAG)
#define K_LEFTRELEASE TERMCAP2KEY(KS_EXTRA, KE_LEFTRELEASE) #define K_LEFTRELEASE TERMCAP2KEY(KS_EXTRA, KE_LEFTRELEASE)
#define K_LEFTRELEASE_NM TERMCAP2KEY(KS_EXTRA, KE_LEFTRELEASE_NM) #define K_LEFTRELEASE_NM TERMCAP2KEY(KS_EXTRA, KE_LEFTRELEASE_NM)
#define K_MOUSEMOVE TERMCAP2KEY(KS_EXTRA, KE_MOUSEMOVE)
#define K_MIDDLEMOUSE TERMCAP2KEY(KS_EXTRA, KE_MIDDLEMOUSE) #define K_MIDDLEMOUSE TERMCAP2KEY(KS_EXTRA, KE_MIDDLEMOUSE)
#define K_MIDDLEDRAG TERMCAP2KEY(KS_EXTRA, KE_MIDDLEDRAG) #define K_MIDDLEDRAG TERMCAP2KEY(KS_EXTRA, KE_MIDDLEDRAG)
#define K_MIDDLERELEASE TERMCAP2KEY(KS_EXTRA, KE_MIDDLERELEASE) #define K_MIDDLERELEASE TERMCAP2KEY(KS_EXTRA, KE_MIDDLERELEASE)

View File

@ -1193,7 +1193,8 @@ void wait_return(int redraw)
|| c == K_MIDDLEDRAG || c == K_MIDDLERELEASE || c == K_MIDDLEDRAG || c == K_MIDDLERELEASE
|| c == K_RIGHTDRAG || c == K_RIGHTRELEASE || c == K_RIGHTDRAG || c == K_RIGHTRELEASE
|| c == K_MOUSELEFT || c == K_MOUSERIGHT || c == K_MOUSELEFT || c == K_MOUSERIGHT
|| c == K_MOUSEDOWN || c == K_MOUSEUP); || c == K_MOUSEDOWN || c == K_MOUSEUP
|| c == K_MOUSEMOVE);
os_breakcheck(); os_breakcheck();
/* /*
* Avoid that the mouse-up event causes visual mode to start. * Avoid that the mouse-up event causes visual mode to start.

View File

@ -602,6 +602,7 @@ int is_mouse_key(int c)
|| c == K_LEFTDRAG || c == K_LEFTDRAG
|| c == K_LEFTRELEASE || c == K_LEFTRELEASE
|| c == K_LEFTRELEASE_NM || c == K_LEFTRELEASE_NM
|| c == K_MOUSEMOVE
|| c == K_MIDDLEMOUSE || c == K_MIDDLEMOUSE
|| c == K_MIDDLEDRAG || c == K_MIDDLEDRAG
|| c == K_MIDDLERELEASE || c == K_MIDDLERELEASE

View File

@ -294,6 +294,7 @@ static const struct nv_cmd {
{ K_LEFTDRAG, nv_mouse, 0, 0 }, { K_LEFTDRAG, nv_mouse, 0, 0 },
{ K_LEFTRELEASE, nv_mouse, 0, 0 }, { K_LEFTRELEASE, nv_mouse, 0, 0 },
{ K_LEFTRELEASE_NM, nv_mouse, 0, 0 }, { K_LEFTRELEASE_NM, nv_mouse, 0, 0 },
{ K_MOUSEMOVE, nv_mouse, 0, 0 },
{ K_MIDDLEMOUSE, nv_mouse, 0, 0 }, { K_MIDDLEMOUSE, nv_mouse, 0, 0 },
{ K_MIDDLEDRAG, nv_mouse, 0, 0 }, { K_MIDDLEDRAG, nv_mouse, 0, 0 },
{ K_MIDDLERELEASE, nv_mouse, 0, 0 }, { K_MIDDLERELEASE, nv_mouse, 0, 0 },
@ -2263,6 +2264,10 @@ do_mouse (
break; break;
} }
if (c == K_MOUSEMOVE) {
// Mouse moved without a button pressed.
return false;
}
/* /*
* Ignore drag and release events if we didn't get a click. * Ignore drag and release events if we didn't get a click.
@ -3390,7 +3395,7 @@ bool add_to_showcmd(int c)
static int ignore[] = static int ignore[] =
{ {
K_IGNORE, K_IGNORE,
K_LEFTMOUSE, K_LEFTDRAG, K_LEFTRELEASE, K_LEFTMOUSE, K_LEFTDRAG, K_LEFTRELEASE, K_MOUSEMOVE,
K_MIDDLEMOUSE, K_MIDDLEDRAG, K_MIDDLERELEASE, K_MIDDLEMOUSE, K_MIDDLEDRAG, K_MIDDLERELEASE,
K_RIGHTMOUSE, K_RIGHTDRAG, K_RIGHTRELEASE, K_RIGHTMOUSE, K_RIGHTDRAG, K_RIGHTRELEASE,
K_MOUSEDOWN, K_MOUSEUP, K_MOUSELEFT, K_MOUSERIGHT, K_MOUSEDOWN, K_MOUSEUP, K_MOUSELEFT, K_MOUSERIGHT,
@ -7036,6 +7041,7 @@ static void nv_g_cmd(cmdarg_T *cap)
case K_LEFTMOUSE: case K_LEFTMOUSE:
case K_LEFTDRAG: case K_LEFTDRAG:
case K_LEFTRELEASE: case K_LEFTRELEASE:
case K_MOUSEMOVE:
case K_RIGHTMOUSE: case K_RIGHTMOUSE:
case K_RIGHTDRAG: case K_RIGHTDRAG:
case K_RIGHTRELEASE: case K_RIGHTRELEASE:

View File

@ -450,6 +450,7 @@ static int terminal_execute(VimState *state, int key)
case K_LEFTMOUSE: case K_LEFTMOUSE:
case K_LEFTDRAG: case K_LEFTDRAG:
case K_LEFTRELEASE: case K_LEFTRELEASE:
case K_MOUSEMOVE:
case K_MIDDLEMOUSE: case K_MIDDLEMOUSE:
case K_MIDDLEDRAG: case K_MIDDLEDRAG:
case K_MIDDLERELEASE: case K_MIDDLERELEASE:
@ -1098,6 +1099,7 @@ static bool send_mouse_event(Terminal *term, int c)
switch (c) { switch (c) {
case K_LEFTDRAG: drag = true; FALLTHROUGH; case K_LEFTDRAG: drag = true; FALLTHROUGH;
case K_LEFTMOUSE: button = 1; break; case K_LEFTMOUSE: button = 1; break;
case K_MOUSEMOVE: drag = true; button = 0; break;
case K_MIDDLEDRAG: drag = true; FALLTHROUGH; case K_MIDDLEDRAG: drag = true; FALLTHROUGH;
case K_MIDDLEMOUSE: button = 2; break; case K_MIDDLEMOUSE: button = 2; break;
case K_RIGHTDRAG: drag = true; FALLTHROUGH; case K_RIGHTDRAG: drag = true; FALLTHROUGH;