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

@ -35,7 +35,11 @@ general_beval_cb(BalloonEval *beval, int state UNUSED)
/* Don't do anything when 'ballooneval' is off, messages scrolled the
* windows up or we have no beval area. */
if (!p_beval || balloonEval == NULL || msg_scrolled > 0)
if (!((gui.in_use && p_beval)
# ifdef FEAT_BEVALTERM
|| (!gui.in_use && p_bevalterm)
# endif
) || beval == NULL || msg_scrolled > 0)
return;
/* Don't do this recursively. Happens when the expression evaluation
@ -45,7 +49,7 @@ general_beval_cb(BalloonEval *beval, int state UNUSED)
recursive = TRUE;
#ifdef FEAT_EVAL
if (get_beval_info(balloonEval, TRUE, &wp, &lnum, &text, &col) == OK)
if (get_beval_info(beval, TRUE, &wp, &lnum, &text, &col) == OK)
{
bexpr = (*wp->w_buffer->b_p_bexpr == NUL) ? p_bexpr
: wp->w_buffer->b_p_bexpr;
@ -96,7 +100,7 @@ general_beval_cb(BalloonEval *beval, int state UNUSED)
set_vim_var_string(VV_BEVAL_TEXT, NULL, -1);
if (result != NULL && result[0] != NUL)
{
gui_mch_post_balloon(beval, result);
post_balloon(beval, result);
recursive = FALSE;
return;
}
@ -335,8 +339,18 @@ get_beval_info(
linenr_T lnum;
*textp = NULL;
row = Y_2_ROW(beval->y);
col = X_2_COL(beval->x);
# ifdef FEAT_BEVALTERM
if (!gui.in_use)
{
row = mouse_row;
col = mouse_col;
}
else
# endif
{
row = Y_2_ROW(beval->y);
col = X_2_COL(beval->x);
}
wp = mouse_find_win(&row, &col);
if (wp != NULL && row < wp->w_height && col < wp->w_width)
{
@ -421,6 +435,20 @@ get_beval_info(
return FAIL;
}
/*
* Show a balloon with "mesg".
*/
void
post_balloon(BalloonEval *beval, char_u *mesg)
{
# ifdef FEAT_BEVALTERM
if (!gui.in_use)
ui_post_balloon(mesg);
else
# endif
gui_mch_post_balloon(beval, mesg);
}
# if !defined(FEAT_GUI_W32) || defined(PROTO)
/*
@ -451,10 +479,6 @@ gui_mch_unpost_balloon(BalloonEval *beval)
#endif
#ifdef FEAT_GUI_GTK
/*
* We can unconditionally use ANSI-style prototypes here since
* GTK+ requires an ANSI C compiler anyway.
*/
static void
addEventHandler(GtkWidget *target, BalloonEval *beval)
{