mirror of
https://github.com/vim/vim.git
synced 2025-09-28 04:24:06 -04:00
patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Problem: balloon_show() only works in terminal when compiled with the GUI. Solution: Add FEAT_BEVAL_GUI and refactor to move common code out of the GUI specific file.
This commit is contained in:
248
src/gui_beval.c
248
src/gui_beval.c
@@ -10,114 +10,7 @@
|
||||
|
||||
#include "vim.h"
|
||||
|
||||
#if defined(FEAT_BEVAL) || defined(PROTO)
|
||||
|
||||
/*
|
||||
* Common code, invoked when the mouse is resting for a moment.
|
||||
*/
|
||||
void
|
||||
general_beval_cb(BalloonEval *beval, int state UNUSED)
|
||||
{
|
||||
#ifdef FEAT_EVAL
|
||||
win_T *wp;
|
||||
int col;
|
||||
int use_sandbox;
|
||||
linenr_T lnum;
|
||||
char_u *text;
|
||||
static char_u *result = NULL;
|
||||
long winnr = 0;
|
||||
char_u *bexpr;
|
||||
buf_T *save_curbuf;
|
||||
size_t len;
|
||||
win_T *cw;
|
||||
#endif
|
||||
static int recursive = FALSE;
|
||||
|
||||
/* Don't do anything when 'ballooneval' is off, messages scrolled the
|
||||
* windows up or we have no beval area. */
|
||||
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
|
||||
* takes a long time and invokes something that checks for CTRL-C typed. */
|
||||
if (recursive)
|
||||
return;
|
||||
recursive = TRUE;
|
||||
|
||||
#ifdef FEAT_EVAL
|
||||
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;
|
||||
if (*bexpr != NUL)
|
||||
{
|
||||
/* Convert window pointer to number. */
|
||||
for (cw = firstwin; cw != wp; cw = cw->w_next)
|
||||
++winnr;
|
||||
|
||||
set_vim_var_nr(VV_BEVAL_BUFNR, (long)wp->w_buffer->b_fnum);
|
||||
set_vim_var_nr(VV_BEVAL_WINNR, winnr);
|
||||
set_vim_var_nr(VV_BEVAL_WINID, wp->w_id);
|
||||
set_vim_var_nr(VV_BEVAL_LNUM, (long)lnum);
|
||||
set_vim_var_nr(VV_BEVAL_COL, (long)(col + 1));
|
||||
set_vim_var_string(VV_BEVAL_TEXT, text, -1);
|
||||
vim_free(text);
|
||||
|
||||
/*
|
||||
* Temporarily change the curbuf, so that we can determine whether
|
||||
* the buffer-local balloonexpr option was set insecurely.
|
||||
*/
|
||||
save_curbuf = curbuf;
|
||||
curbuf = wp->w_buffer;
|
||||
use_sandbox = was_set_insecurely((char_u *)"balloonexpr",
|
||||
*curbuf->b_p_bexpr == NUL ? 0 : OPT_LOCAL);
|
||||
curbuf = save_curbuf;
|
||||
if (use_sandbox)
|
||||
++sandbox;
|
||||
++textlock;
|
||||
|
||||
vim_free(result);
|
||||
result = eval_to_string(bexpr, NULL, TRUE);
|
||||
|
||||
/* Remove one trailing newline, it is added when the result was a
|
||||
* list and it's hardly ever useful. If the user really wants a
|
||||
* trailing newline he can add two and one remains. */
|
||||
if (result != NULL)
|
||||
{
|
||||
len = STRLEN(result);
|
||||
if (len > 0 && result[len - 1] == NL)
|
||||
result[len - 1] = NUL;
|
||||
}
|
||||
|
||||
if (use_sandbox)
|
||||
--sandbox;
|
||||
--textlock;
|
||||
|
||||
set_vim_var_string(VV_BEVAL_TEXT, NULL, -1);
|
||||
if (result != NULL && result[0] != NUL)
|
||||
{
|
||||
post_balloon(beval, result);
|
||||
recursive = FALSE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef FEAT_NETBEANS_INTG
|
||||
if (bevalServers & BEVAL_NETBEANS)
|
||||
netbeans_beval_cb(beval, state);
|
||||
#endif
|
||||
#ifdef FEAT_SUN_WORKSHOP
|
||||
if (bevalServers & BEVAL_WORKSHOP)
|
||||
workshop_beval_cb(beval, state);
|
||||
#endif
|
||||
|
||||
recursive = FALSE;
|
||||
}
|
||||
#if defined(FEAT_BEVAL_GUI) || defined(PROTO)
|
||||
|
||||
/* on Win32 only get_beval_info() is required */
|
||||
#if !defined(FEAT_GUI_W32) || defined(PROTO)
|
||||
@@ -149,8 +42,6 @@ general_beval_cb(BalloonEval *beval, int state UNUSED)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include "gui_beval.h"
|
||||
|
||||
#ifndef FEAT_GUI_GTK
|
||||
extern Widget vimShell;
|
||||
|
||||
@@ -192,8 +83,6 @@ static void drawBalloon(BalloonEval *);
|
||||
static void undrawBalloon(BalloonEval *beval);
|
||||
static void createBalloonEvalWindow(BalloonEval *);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Create a balloon-evaluation area for a Widget.
|
||||
* There can be either a "mesg" for a fixed string or "mesgCB" to generate a
|
||||
@@ -318,137 +207,6 @@ gui_mch_currently_showing_beval(void)
|
||||
|
||||
#if defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) \
|
||||
|| defined(FEAT_EVAL) || defined(PROTO)
|
||||
/*
|
||||
* Get the text and position to be evaluated for "beval".
|
||||
* If "getword" is true the returned text is not the whole line but the
|
||||
* relevant word in allocated memory.
|
||||
* Returns OK or FAIL.
|
||||
*/
|
||||
int
|
||||
get_beval_info(
|
||||
BalloonEval *beval,
|
||||
int getword,
|
||||
win_T **winp,
|
||||
linenr_T *lnump,
|
||||
char_u **textp,
|
||||
int *colp)
|
||||
{
|
||||
win_T *wp;
|
||||
int row, col;
|
||||
char_u *lbuf;
|
||||
linenr_T lnum;
|
||||
|
||||
*textp = NULL;
|
||||
# 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)
|
||||
{
|
||||
/* Found a window and the cursor is in the text. Now find the line
|
||||
* number. */
|
||||
if (!mouse_comp_pos(wp, &row, &col, &lnum))
|
||||
{
|
||||
/* Not past end of the file. */
|
||||
lbuf = ml_get_buf(wp->w_buffer, lnum, FALSE);
|
||||
if (col <= win_linetabsize(wp, lbuf, (colnr_T)MAXCOL))
|
||||
{
|
||||
/* Not past end of line. */
|
||||
if (getword)
|
||||
{
|
||||
/* For Netbeans we get the relevant part of the line
|
||||
* instead of the whole line. */
|
||||
int len;
|
||||
pos_T *spos = NULL, *epos = NULL;
|
||||
|
||||
if (VIsual_active)
|
||||
{
|
||||
if (LT_POS(VIsual, curwin->w_cursor))
|
||||
{
|
||||
spos = &VIsual;
|
||||
epos = &curwin->w_cursor;
|
||||
}
|
||||
else
|
||||
{
|
||||
spos = &curwin->w_cursor;
|
||||
epos = &VIsual;
|
||||
}
|
||||
}
|
||||
|
||||
col = vcol2col(wp, lnum, col);
|
||||
|
||||
if (VIsual_active
|
||||
&& wp->w_buffer == curwin->w_buffer
|
||||
&& (lnum == spos->lnum
|
||||
? col >= (int)spos->col
|
||||
: lnum > spos->lnum)
|
||||
&& (lnum == epos->lnum
|
||||
? col <= (int)epos->col
|
||||
: lnum < epos->lnum))
|
||||
{
|
||||
/* Visual mode and pointing to the line with the
|
||||
* Visual selection: return selected text, with a
|
||||
* maximum of one line. */
|
||||
if (spos->lnum != epos->lnum || spos->col == epos->col)
|
||||
return FAIL;
|
||||
|
||||
lbuf = ml_get_buf(curwin->w_buffer, VIsual.lnum, FALSE);
|
||||
len = epos->col - spos->col;
|
||||
if (*p_sel != 'e')
|
||||
len += MB_PTR2LEN(lbuf + epos->col);
|
||||
lbuf = vim_strnsave(lbuf + spos->col, len);
|
||||
lnum = spos->lnum;
|
||||
col = spos->col;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Find the word under the cursor. */
|
||||
++emsg_off;
|
||||
len = find_ident_at_pos(wp, lnum, (colnr_T)col, &lbuf,
|
||||
FIND_IDENT + FIND_STRING + FIND_EVAL);
|
||||
--emsg_off;
|
||||
if (len == 0)
|
||||
return FAIL;
|
||||
lbuf = vim_strnsave(lbuf, len);
|
||||
}
|
||||
}
|
||||
|
||||
*winp = wp;
|
||||
*lnump = lnum;
|
||||
*textp = lbuf;
|
||||
*colp = col;
|
||||
beval->ts = wp->w_buffer->b_p_ts;
|
||||
return OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
/*
|
||||
@@ -463,7 +221,7 @@ gui_mch_post_balloon(BalloonEval *beval, char_u *mesg)
|
||||
else
|
||||
undrawBalloon(beval);
|
||||
}
|
||||
# endif /* FEAT_GUI_W32 */
|
||||
# endif /* !FEAT_GUI_W32 */
|
||||
#endif /* FEAT_SUN_WORKSHOP || FEAT_NETBEANS_INTG || PROTO */
|
||||
|
||||
#if !defined(FEAT_GUI_W32) || defined(PROTO)
|
||||
@@ -1519,4 +1277,4 @@ createBalloonEvalWindow(BalloonEval *beval)
|
||||
#endif /* !FEAT_GUI_GTK */
|
||||
#endif /* !FEAT_GUI_W32 */
|
||||
|
||||
#endif /* FEAT_BEVAL */
|
||||
#endif /* FEAT_BEVAL_GUI */
|
||||
|
Reference in New Issue
Block a user