1
0
forked from aniani/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.
This commit is contained in:
Bram Moolenaar
2017-11-18 18:52:04 +01:00
parent 234d16286a
commit 51b0f3701e
26 changed files with 419 additions and 85 deletions

View File

@@ -3564,16 +3564,25 @@ get_tty_info(int fd, ttyinfo_T *info)
#endif /* VMS */
#if defined(FEAT_MOUSE_TTY) || defined(PROTO)
static int mouse_ison = FALSE;
/*
* Set mouse clicks on or off.
*/
void
mch_setmouse(int on)
{
static int ison = FALSE;
# ifdef FEAT_BEVALTERM
static int bevalterm_ison = FALSE;
# endif
int xterm_mouse_vers;
if (on == ison) /* return quickly if nothing to do */
if (on == mouse_ison
# ifdef FEAT_BEVALTERM
&& p_bevalterm == bevalterm_ison
# endif
)
/* return quickly if nothing to do */
return;
xterm_mouse_vers = use_xterm_mouse();
@@ -3585,18 +3594,30 @@ mch_setmouse(int on)
(on
? IF_EB("\033[?1015h", ESC_STR "[?1015h")
: IF_EB("\033[?1015l", ESC_STR "[?1015l")));
ison = on;
mouse_ison = on;
}
# endif
# ifdef FEAT_MOUSE_SGR
if (ttym_flags == TTYM_SGR)
{
/* SGR mode supports columns above 223 */
out_str_nf((char_u *)
(on
? IF_EB("\033[?1006h", ESC_STR "[?1006h")
: IF_EB("\033[?1006l", ESC_STR "[?1006l")));
ison = on;
mouse_ison = on;
}
# endif
# ifdef FEAT_BEVALTERM
if (bevalterm_ison != (p_bevalterm && on))
{
bevalterm_ison = (p_bevalterm && on);
if (xterm_mouse_vers > 1 && !bevalterm_ison)
/* disable mouse movement events, enabling is below */
out_str_nf((char_u *)
(IF_EB("\033[?1003l", ESC_STR "[?1003l")));
}
# endif
@@ -3605,14 +3626,19 @@ mch_setmouse(int on)
if (on) /* enable mouse events, use mouse tracking if available */
out_str_nf((char_u *)
(xterm_mouse_vers > 1
? IF_EB("\033[?1002h", ESC_STR "[?1002h")
? (
# ifdef FEAT_BEVALTERM
bevalterm_ison
? IF_EB("\033[?1003h", ESC_STR "[?1003h") :
# endif
IF_EB("\033[?1002h", ESC_STR "[?1002h"))
: IF_EB("\033[?1000h", ESC_STR "[?1000h")));
else /* disable mouse events, could probably always send the same */
out_str_nf((char_u *)
(xterm_mouse_vers > 1
? IF_EB("\033[?1002l", ESC_STR "[?1002l")
: IF_EB("\033[?1000l", ESC_STR "[?1000l")));
ison = on;
mouse_ison = on;
}
# ifdef FEAT_MOUSE_DEC
@@ -3622,7 +3648,7 @@ mch_setmouse(int on)
out_str_nf((char_u *)"\033[1;2'z\033[1;3'{");
else /* disable mouse events */
out_str_nf((char_u *)"\033['z");
ison = on;
mouse_ison = on;
}
# endif
@@ -3632,12 +3658,12 @@ mch_setmouse(int on)
if (on)
{
if (gpm_open())
ison = TRUE;
mouse_ison = TRUE;
}
else
{
gpm_close();
ison = FALSE;
mouse_ison = FALSE;
}
}
# endif
@@ -3648,12 +3674,12 @@ mch_setmouse(int on)
if (on)
{
if (sysmouse_open() == OK)
ison = TRUE;
mouse_ison = TRUE;
}
else
{
sysmouse_close();
ison = FALSE;
mouse_ison = FALSE;
}
}
# endif
@@ -3686,13 +3712,13 @@ mch_setmouse(int on)
out_str_nf((char_u *)IF_EB("\033[0~ZwLMRK+1Q\033\\",
ESC_STR "[0~ZwLMRK+1Q" ESC_STR "\\"));
# endif
ison = TRUE;
mouse_ison = TRUE;
}
else
{
out_str_nf((char_u *)IF_EB("\033[0~ZwQ\033\\",
ESC_STR "[0~ZwQ" ESC_STR "\\"));
ison = FALSE;
mouse_ison = FALSE;
}
}
# endif
@@ -3704,11 +3730,22 @@ mch_setmouse(int on)
out_str_nf("\033[>1h\033[>6h\033[>7h\033[>1h\033[>9l");
else
out_str_nf("\033[>1l\033[>6l\033[>7l\033[>1l\033[>9h");
ison = on;
mouse_ison = on;
}
# endif
}
#if defined(FEAT_BEVALTERM) || defined(PROTO)
/*
* Called when 'balloonevalterm' changed.
*/
void
mch_bevalterm_changed(void)
{
mch_setmouse(mouse_ison);
}
#endif
/*
* Set the mouse termcode, depending on the 'term' and 'ttymouse' options.
*/