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

(Port some refactoring, but ignore "balloon" changes.)

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
2019-09-10 00:23:44 -04:00
committed by Justin M. Keyes
parent a2c98a2938
commit 477113d1ae
2 changed files with 35 additions and 41 deletions

View File

@@ -2966,7 +2966,7 @@ A jump table for the options with a short description can be found at |Q_op|.
toolbar, tabline, etc. Instead, the behavior is similar to toolbar, tabline, etc. Instead, the behavior is similar to
when the window is maximized and will adjust 'lines' and when the window is maximized and will adjust 'lines' and
'columns' to fit to the window. Without the 'k' flag Vim will 'columns' to fit to the window. Without the 'k' flag Vim will
try to keep 'lines' and 'columns the same when adding and try to keep 'lines' and 'columns' the same when adding and
removing GUI components. removing GUI components.
*'guitablabel'* *'gtl'* *'guitablabel'* *'gtl'*

View File

@@ -37,6 +37,7 @@ static int pum_height; // nr of displayed pum items
static int pum_width; // width of displayed pum items static int pum_width; // width of displayed pum items
static int pum_base_width; // width of pum items base static int pum_base_width; // width of pum items base
static int pum_kind_width; // width of pum items kind column static int pum_kind_width; // width of pum items kind column
static int pum_extra_width; // width of extra stuff
static int pum_scrollbar; // TRUE when scrollbar present static int pum_scrollbar; // TRUE when scrollbar present
static int pum_anchor_grid; // grid where position is defined static int pum_anchor_grid; // grid where position is defined
@@ -55,6 +56,32 @@ static bool pum_invalid = false; // the screen was just cleared
#define PUM_DEF_HEIGHT 10 #define PUM_DEF_HEIGHT 10
#define PUM_DEF_WIDTH 15 #define PUM_DEF_WIDTH 15
static void pum_compute_size(void)
{
// Compute the width of the widest match and the widest extra.
pum_base_width = 0;
pum_kind_width = 0;
pum_extra_width = 0;
for (int i = 0; i < pum_size; i++) {
int w = vim_strsize(pum_array[i].pum_text);
if (pum_base_width < w) {
pum_base_width = w;
}
if (pum_array[i].pum_kind != NULL) {
w = vim_strsize(pum_array[i].pum_kind) + 1;
if (pum_kind_width < w) {
pum_kind_width = w;
}
}
if (pum_array[i].pum_extra != NULL) {
w = vim_strsize(pum_array[i].pum_extra) + 1;
if (pum_extra_width < w) {
pum_extra_width = w;
}
}
}
}
/// Show the popup menu with items "array[size]". /// Show the popup menu with items "array[size]".
/// "array" must remain valid until pum_undisplay() is called! /// "array" must remain valid until pum_undisplay() is called!
/// When possible the leftmost character is aligned with screen column "col". /// When possible the leftmost character is aligned with screen column "col".
@@ -70,12 +97,7 @@ static bool pum_invalid = false; // the screen was just cleared
void pum_display(pumitem_T *array, int size, int selected, bool array_changed, void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
int cmd_startcol) int cmd_startcol)
{ {
int w;
int def_width; int def_width;
int max_width;
int kind_width;
int extra_width;
int i;
int context_lines; int context_lines;
int above_row; int above_row;
int below_row; int below_row;
@@ -124,7 +146,7 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
if (pum_external) { if (pum_external) {
if (array_changed) { if (array_changed) {
Array arr = ARRAY_DICT_INIT; Array arr = ARRAY_DICT_INIT;
for (i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
Array item = ARRAY_DICT_INIT; Array item = ARRAY_DICT_INIT;
ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_text))); ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_text)));
ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_kind))); ADD(item, STRING_OBJ(cstr_to_string((char *)array[i].pum_kind)));
@@ -140,9 +162,6 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
} }
def_width = PUM_DEF_WIDTH; def_width = PUM_DEF_WIDTH;
max_width = 0;
kind_width = 0;
extra_width = 0;
win_T *pvwin = NULL; win_T *pvwin = NULL;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
@@ -241,32 +260,10 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
return; return;
} }
// Compute the width of the widest match and the widest extra. pum_array = array;
for (i = 0; i < size; i++) { pum_size = size;
w = vim_strsize(array[i].pum_text); pum_compute_size();
int max_width = pum_base_width;
if (max_width < w) {
max_width = w;
}
if (array[i].pum_kind != NULL) {
w = vim_strsize(array[i].pum_kind) + 1;
if (kind_width < w) {
kind_width = w;
}
}
if (array[i].pum_extra != NULL) {
w = vim_strsize(array[i].pum_extra) + 1;
if (extra_width < w) {
extra_width = w;
}
}
}
pum_base_width = max_width;
pum_kind_width = kind_width;
// if there are more items than room we need a scrollbar // if there are more items than room we need a scrollbar
if (pum_height < size) { if (pum_height < size) {
@@ -293,9 +290,9 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
pum_width = (int)(Columns - pum_col - pum_scrollbar); pum_width = (int)(Columns - pum_col - pum_scrollbar);
} }
if ((pum_width > max_width + kind_width + extra_width + 1) if ((pum_width > max_width + pum_kind_width + pum_extra_width + 1)
&& (pum_width > PUM_DEF_WIDTH)) { && (pum_width > PUM_DEF_WIDTH)) {
pum_width = max_width + kind_width + extra_width + 1; pum_width = max_width + pum_kind_width + pum_extra_width + 1;
if (pum_width < PUM_DEF_WIDTH) { if (pum_width < PUM_DEF_WIDTH) {
pum_width = PUM_DEF_WIDTH; pum_width = PUM_DEF_WIDTH;
@@ -327,9 +324,6 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
pum_width = max_width - pum_scrollbar; pum_width = max_width - pum_scrollbar;
} }
pum_array = array;
pum_size = size;
// Set selected item and redraw. If the window size changed need to redo // Set selected item and redraw. If the window size changed need to redo
// the positioning. Limit this to two times, when there is not much // the positioning. Limit this to two times, when there is not much
// room the window size will keep changing. // room the window size will keep changing.