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
when the window is maximized and will adjust 'lines' and
'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.
*'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_base_width; // width of pum items base
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_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_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]".
/// "array" must remain valid until pum_undisplay() is called!
/// 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,
int cmd_startcol)
{
int w;
int def_width;
int max_width;
int kind_width;
int extra_width;
int i;
int context_lines;
int above_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 (array_changed) {
Array arr = ARRAY_DICT_INIT;
for (i = 0; i < size; i++) {
for (int i = 0; i < size; i++) {
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_kind)));
@ -140,9 +162,6 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
}
def_width = PUM_DEF_WIDTH;
max_width = 0;
kind_width = 0;
extra_width = 0;
win_T *pvwin = NULL;
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;
}
// Compute the width of the widest match and the widest extra.
for (i = 0; i < size; i++) {
w = vim_strsize(array[i].pum_text);
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;
pum_array = array;
pum_size = size;
pum_compute_size();
int max_width = pum_base_width;
// if there are more items than room we need a scrollbar
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);
}
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 = max_width + kind_width + extra_width + 1;
pum_width = max_width + pum_kind_width + pum_extra_width + 1;
if (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_array = array;
pum_size = size;
// 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
// room the window size will keep changing.