mirror of
https://github.com/neovim/neovim.git
synced 2025-10-07 02:16:31 +00:00
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:

committed by
Justin M. Keyes

parent
a2c98a2938
commit
477113d1ae
@@ -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'*
|
||||||
|
@@ -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.
|
||||||
|
Reference in New Issue
Block a user