Merge pull request #10475 from erw7/fix-ext-popupmenu

Fix some keys not working in ext_popupmenu
This commit is contained in:
Björn Linse
2019-09-08 20:42:32 +02:00
committed by GitHub
5 changed files with 178 additions and 1 deletions

View File

@@ -109,6 +109,7 @@ void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height,
UI *ui = xcalloc(1, sizeof(UI));
ui->width = (int)width;
ui->height = (int)height;
ui->pum_height = 0;
ui->rgb = true;
ui->override = false;
ui->grid_resize = remote_ui_grid_resize;
@@ -313,6 +314,38 @@ void nvim_ui_try_resize_grid(uint64_t channel_id, Integer grid, Integer width,
ui_grid_resize((handle_T)grid, (int)width, (int)height, err);
}
/// Tell Nvim the number of element displayed in popumenu. The amount of
/// movement by <PageUp> or <PageDown> is determined by the value set by this.
///
/// If the ext_popupmenu option is false or the height is 0 or less, fails
/// with error.
///
/// @param channel_id
/// @param height The popupmenu height.
/// @param[out] err Error details, if any
void nvim_ui_pum_set_height(uint64_t channel_id, Integer height, Error *err)
FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY
{
if (!pmap_has(uint64_t)(connected_uis, channel_id)) {
api_set_error(err, kErrorTypeException,
"UI not attached to channel: %" PRId64, channel_id);
return;
}
if (height <= 0) {
api_set_error(err, kErrorTypeValidation, "Expected pum height > 0");
return;
}
UI *ui = pmap_get(uint64_t)(connected_uis, channel_id);
if (!ui->ui_ext[kUIPopupmenu]) {
api_set_error(err, kErrorTypeValidation,
"It must support the ext_popupmenu option");
return;
}
ui->pum_height = (int)height;
}
/// Pushes data into UI.UIData, to be consumed later by remote_ui_flush().
static void push_call(UI *ui, const char *name, Array args)
{

View File

@@ -135,8 +135,8 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
ui_call_popupmenu_show(arr, selected, row, col, pum_anchor_grid);
} else {
ui_call_popupmenu_select(selected);
return;
}
return;
}
def_width = PUM_DEF_WIDTH;
@@ -237,6 +237,9 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
pum_height = row - above_row;
}
}
if (pum_external) {
return;
}
// Compute the width of the widest match and the widest extra.
for (i = 0; i < size; i++) {
@@ -852,6 +855,12 @@ void pum_recompose(void)
/// Only valid when pum_visible() returns TRUE!
int pum_get_height(void)
{
if (pum_external) {
int ui_pum_height = ui_pum_get_height();
if (ui_pum_height) {
return ui_pum_height;
}
}
return pum_height;
}

View File

@@ -221,6 +221,19 @@ void ui_refresh(void)
ui_cursor_shape();
}
int ui_pum_get_height(void)
{
int pum_height = 0;
for (size_t i = 1; i < ui_count; i++) {
int ui_pum_height = uis[i]->pum_height;
if (ui_pum_height) {
pum_height =
pum_height != 0 ? MIN(pum_height, ui_pum_height) : ui_pum_height;
}
}
return pum_height;
}
static void ui_refresh_event(void **argv)
{
ui_refresh();

View File

@@ -53,6 +53,7 @@ struct ui_t {
bool ui_ext[kUIExtCount]; ///< Externalized UI capabilities.
int width;
int height;
int pum_height;
void *data;
#ifdef INCLUDE_GENERATED_DECLARATIONS