diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/api/ui.c | 40 | ||||
-rw-r--r-- | src/nvim/popupmnu.c | 9 | ||||
-rw-r--r-- | src/nvim/screen.c | 18 | ||||
-rw-r--r-- | src/nvim/tui/tui.c | 5 | ||||
-rw-r--r-- | src/nvim/ui.c | 51 | ||||
-rw-r--r-- | src/nvim/ui.h | 10 | ||||
-rw-r--r-- | src/nvim/ui_bridge.c | 6 | ||||
-rw-r--r-- | src/nvim/window.c | 4 |
8 files changed, 72 insertions, 71 deletions
diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c index 28fc641dec..08d285eedc 100644 --- a/src/nvim/api/ui.c +++ b/src/nvim/api/ui.c @@ -68,8 +68,6 @@ void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height, ui->width = (int)width; ui->height = (int)height; ui->rgb = true; - ui->pum_external = false; - ui->tabline_external = false; ui->resize = remote_ui_resize; ui->clear = remote_ui_clear; ui->eol_clear = remote_ui_eol_clear; @@ -96,6 +94,8 @@ void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height, ui->set_icon = remote_ui_set_icon; ui->event = remote_ui_event; + memset(ui->ui_ext, 0, sizeof(ui->ui_ext)); + for (size_t i = 0; i < options.size; i++) { ui_set_option(ui, options.items[i].key, options.items[i].value, err); if (ERROR_SET(err)) { @@ -171,7 +171,8 @@ void nvim_ui_set_option(uint64_t channel_id, String name, } } -static void ui_set_option(UI *ui, String name, Object value, Error *error) { +static void ui_set_option(UI *ui, String name, Object value, Error *error) +{ if (strequal(name.data, "rgb")) { if (value.type != kObjectTypeBoolean) { api_set_error(error, kErrorTypeValidation, "rgb must be a Boolean"); @@ -179,19 +180,42 @@ static void ui_set_option(UI *ui, String name, Object value, Error *error) { } ui->rgb = value.data.boolean; } else if (strequal(name.data, "popupmenu_external")) { + // LEGACY: Deprecated option, use `ui_ext` instead. if (value.type != kObjectTypeBoolean) { api_set_error(error, kErrorTypeValidation, "popupmenu_external must be a Boolean"); return; } - ui->pum_external = value.data.boolean; - } else if (strequal(name.data, "tabline_external")) { - if (value.type != kObjectTypeBoolean) { + ui->ui_ext[kUIPopupmenu] = value.data.boolean; + } else if (strequal(name.data, "ui_ext")) { + if (value.type != kObjectTypeArray) { api_set_error(error, kErrorTypeValidation, - "tabline_external must be a Boolean"); + "ui_ext must be an Array"); return; } - ui->tabline_external = value.data.boolean; + + for (size_t i = 0; i < value.data.array.size; i++) { + Object item = value.data.array.items[i]; + if (item.type != kObjectTypeString) { + api_set_error(error, kErrorTypeValidation, + "ui_ext: item must be a String"); + return; + } + char *name = item.data.string.data; + if (strequal(name, "cmdline")) { + ui->ui_ext[kUICmdline] = true; + } else if (strequal(name, "popupmenu")) { + ui->ui_ext[kUIPopupmenu] = true; + } else if (strequal(name, "tabline")) { + ui->ui_ext[kUITabline] = true; + } else if (strequal(name, "wildmenu")) { + ui->ui_ext[kUIWildmenu] = true; + } else { + api_set_error(error, kErrorTypeValidation, + "ui_ext: unknown widget: %s", name); + return; + } + } } else { api_set_error(error, kErrorTypeValidation, "No such ui option"); } diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c index 6e81c5a171..b8650d8c62 100644 --- a/src/nvim/popupmnu.c +++ b/src/nvim/popupmnu.c @@ -41,9 +41,7 @@ static int pum_row; // top row of pum static int pum_col; // left column of pum static bool pum_is_visible = false; - static bool pum_external = false; -static bool pum_wants_external = false; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "popupmnu.c.generated.h" @@ -80,7 +78,7 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed) if (!pum_is_visible) { // To keep the code simple, we only allow changing the // draw mode when the popup menu is not being displayed - pum_external = pum_wants_external; + pum_external = ui_is_external(kUIPopupmenu); } redo: @@ -751,8 +749,3 @@ int pum_get_height(void) { return pum_height; } - -void pum_set_external(bool external) -{ - pum_wants_external = external; -} diff --git a/src/nvim/screen.c b/src/nvim/screen.c index ed85b6e8b8..a6563534aa 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -6886,14 +6886,13 @@ static void draw_tabline(void) if (ScreenLines == NULL) { return; } + redraw_tabline = false; - if (ui_is_widget_external(kUITabline)) { - draw_tabline_ext(); + if (ui_is_external(kUITabline)) { + ui_ext_tabline_update(); return; } - redraw_tabline = false; - if (tabline_height() < 1) return; @@ -7033,20 +7032,13 @@ static void draw_tabline(void) redraw_tabline = FALSE; } -// send tabline update to external ui -void draw_tabline_ext(void) +void ui_ext_tabline_update(void) { - win_T *cwp; - Array args = ARRAY_DICT_INIT; ADD(args, INTEGER_OBJ(curtab->handle)); Array tabs = ARRAY_DICT_INIT; FOR_ALL_TABS(tp) { - if (tp == curtab) { - cwp = curwin; - } else { - cwp = tp->tp_curwin; - } + win_T *cwp = (tp == curtab) ? curwin : tp->tp_curwin; get_trans_bufname(cwp->w_buffer); Array tab = ARRAY_DICT_INIT; ADD(tab, INTEGER_OBJ(tp->handle)); diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c index cd94fe9d49..21abc19c47 100644 --- a/src/nvim/tui/tui.c +++ b/src/nvim/tui/tui.c @@ -109,8 +109,6 @@ UI *tui_start(void) UI *ui = xcalloc(1, sizeof(UI)); ui->stop = tui_stop; ui->rgb = p_tgc; - ui->pum_external = false; - ui->tabline_external = false; ui->resize = tui_resize; ui->clear = tui_clear; ui->eol_clear = tui_eol_clear; @@ -136,6 +134,9 @@ UI *tui_start(void) ui->set_title = tui_set_title; ui->set_icon = tui_set_icon; ui->event = tui_event; + + memset(ui->ui_ext, 0, sizeof(ui->ui_ext)); + return ui_bridge_attach(ui, tui_main, tui_scheduler); } diff --git a/src/nvim/ui.c b/src/nvim/ui.c index 6dcc3de1b0..713dffb46c 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -47,6 +47,7 @@ #define MAX_UI_COUNT 16 static UI *uis[MAX_UI_COUNT]; +static bool ui_ext[UI_WIDGETS] = { 0 }; static size_t ui_count = 0; static int row = 0, col = 0; static struct { @@ -58,10 +59,6 @@ static int busy = 0; static int height, width; static int old_mode_idx = -1; -static bool tabline_external = false; -static bool cmdline_external = false; -static bool wildmenu_external = false; - // UI_CALL invokes a function on all registered UI instances. The functions can // have 0-5 arguments (configurable by SELECT_NTH). // @@ -170,21 +167,25 @@ void ui_refresh(void) } int width = INT_MAX, height = INT_MAX; - bool pum_external = true; - bool tabline_external = true; + bool ext_widgets[UI_WIDGETS]; + for (UIWidget i = 0; (int)i < UI_WIDGETS; i++) { + ext_widgets[i] = true; + } for (size_t i = 0; i < ui_count; i++) { UI *ui = uis[i]; width = MIN(ui->width, width); height = MIN(ui->height, height); - pum_external &= ui->pum_external; - tabline_external &= ui->tabline_external; + for (UIWidget i = 0; (int)i < UI_WIDGETS; i++) { + ext_widgets[i] &= ui->ui_ext[i]; + } } row = col = 0; screen_resize(width, height); - pum_set_external(pum_external); - ui_set_widget_external(kUITabline, tabline_external); + for (UIWidget i = 0; (int)i < UI_WIDGETS; i++) { + ui_set_external(i, ext_widgets[i]); + } ui_mode_info_set(); old_mode_idx = -1; ui_cursor_shape(); @@ -564,30 +565,16 @@ void ui_cursor_shape(void) conceal_check_cursur_line(); } -bool ui_is_widget_external(UIWidget widget) +/// Returns true if `widget` is externalized. +bool ui_is_external(UIWidget widget) { - switch (widget) { - case kUITabline: - return tabline_external; - case kUICmdline: - return cmdline_external; - case kUIWildmenu: - return wildmenu_external; - } - return false; + return ui_ext[widget]; } -void ui_set_widget_external(UIWidget widget, bool external) +/// Sets `widget` as "external". +/// Such widgets are not drawn by Nvim; external UIs are expected to handle +/// higher-level UI events and present the data. +void ui_set_external(UIWidget widget, bool external) { - switch (widget) { - case kUITabline: - tabline_external = external; - break; - case kUICmdline: - cmdline_external = external; - break; - case kUIWildmenu: - wildmenu_external = external; - break; - } + ui_ext[widget] = external; } diff --git a/src/nvim/ui.h b/src/nvim/ui.h index a1ff449eaf..9338ab3ea3 100644 --- a/src/nvim/ui.h +++ b/src/nvim/ui.h @@ -8,12 +8,13 @@ #include "api/private/defs.h" #include "nvim/buffer_defs.h" -// values for externalized widgets typedef enum { + kUICmdline = 0, + kUIPopupmenu, kUITabline, - kUICmdline, - kUIWildmenu + kUIWildmenu, } UIWidget; +#define UI_WIDGETS (kUIWildmenu + 1) typedef struct { bool bold, underline, undercurl, italic, reverse; @@ -23,7 +24,8 @@ typedef struct { typedef struct ui_t UI; struct ui_t { - bool rgb, pum_external, tabline_external; + bool rgb; + bool ui_ext[UI_WIDGETS]; ///< Externalized widgets int width, height; void *data; void (*resize)(UI *ui, int rows, int columns); diff --git a/src/nvim/ui_bridge.c b/src/nvim/ui_bridge.c index 9a3fcab13c..b7b12ae39e 100644 --- a/src/nvim/ui_bridge.c +++ b/src/nvim/ui_bridge.c @@ -57,8 +57,6 @@ UI *ui_bridge_attach(UI *ui, ui_main_fn ui_main, event_scheduler scheduler) UIBridgeData *rv = xcalloc(1, sizeof(UIBridgeData)); rv->ui = ui; rv->bridge.rgb = ui->rgb; - rv->bridge.pum_external = ui->pum_external; - rv->bridge.tabline_external = ui->tabline_external; rv->bridge.stop = ui_bridge_stop; rv->bridge.resize = ui_bridge_resize; rv->bridge.clear = ui_bridge_clear; @@ -86,6 +84,10 @@ UI *ui_bridge_attach(UI *ui, ui_main_fn ui_main, event_scheduler scheduler) rv->bridge.set_icon = ui_bridge_set_icon; rv->scheduler = scheduler; + for (UIWidget i = 0; (int)i < UI_WIDGETS; i++) { + rv->bridge.ui_ext[i] = ui->ui_ext[i]; + } + rv->ui_main = ui_main; uv_mutex_init(&rv->mutex); uv_cond_init(&rv->cond); diff --git a/src/nvim/window.c b/src/nvim/window.c index effce8b413..69c0a838ea 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -5224,8 +5224,8 @@ static void last_status_rec(frame_T *fr, int statusline) */ int tabline_height(void) { - if (ui_is_widget_external(kUITabline)) { - return 0; + if (ui_is_external(kUITabline)) { + return 0; } assert(first_tabpage); switch (p_stal) { |