From 88023d51238698dd625c26300142d3dbe5770b73 Mon Sep 17 00:00:00 2001 From: Dongdong Zhou Date: Fri, 24 Feb 2017 09:35:27 +0000 Subject: api/ui: externalize tabline --- src/nvim/api/ui.c | 12 ++++++++++-- src/nvim/screen.c | 36 +++++++++++++++++++++++++++++++++++- src/nvim/tui/tui.c | 1 + src/nvim/ui.c | 34 ++++++++++++++++++++++++++++++++++ src/nvim/ui.h | 9 ++++++++- src/nvim/ui_bridge.c | 1 + src/nvim/window.c | 4 ++++ 7 files changed, 93 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c index f0da0d1812..28fc641dec 100644 --- a/src/nvim/api/ui.c +++ b/src/nvim/api/ui.c @@ -69,6 +69,7 @@ void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height, 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; @@ -171,19 +172,26 @@ void nvim_ui_set_option(uint64_t channel_id, String name, } static void ui_set_option(UI *ui, String name, Object value, Error *error) { - if (strcmp(name.data, "rgb") == 0) { + if (strequal(name.data, "rgb")) { if (value.type != kObjectTypeBoolean) { api_set_error(error, kErrorTypeValidation, "rgb must be a Boolean"); return; } ui->rgb = value.data.boolean; - } else if (strcmp(name.data, "popupmenu_external") == 0) { + } else if (strequal(name.data, "popupmenu_external")) { 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) { + api_set_error(error, kErrorTypeValidation, + "tabline_external must be a Boolean"); + return; + } + ui->tabline_external = value.data.boolean; } else { api_set_error(error, kErrorTypeValidation, "No such ui option"); } diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 10dc86d5fa..ed85b6e8b8 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -132,6 +132,7 @@ #include "nvim/version.h" #include "nvim/window.h" #include "nvim/os/time.h" +#include "nvim/api/private/helpers.h" #define MB_FILLER_CHAR '<' /* character used when a double-width character * doesn't fit. */ @@ -6885,8 +6886,13 @@ static void draw_tabline(void) if (ScreenLines == NULL) { return; } - redraw_tabline = false; + if (ui_is_widget_external(kUITabline)) { + draw_tabline_ext(); + return; + } + + redraw_tabline = false; if (tabline_height() < 1) return; @@ -7027,6 +7033,34 @@ static void draw_tabline(void) redraw_tabline = FALSE; } +// send tabline update to external ui +void draw_tabline_ext(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; + } + get_trans_bufname(cwp->w_buffer); + Array tab = ARRAY_DICT_INIT; + ADD(tab, INTEGER_OBJ(tp->handle)); + + Dictionary tab_info = ARRAY_DICT_INIT; + PUT(tab_info, "name", STRING_OBJ(cstr_to_string((char *)NameBuff))); + ADD(tab, DICTIONARY_OBJ(tab_info)); + ADD(tabs, ARRAY_OBJ(tab)); + } + ADD(args, ARRAY_OBJ(tabs)); + + ui_event("tabline_update", args); +} + /* * Get buffer name for "buf" into NameBuff[]. * Takes care of special buffer names and translates special characters. diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c index e1b97f5306..cd94fe9d49 100644 --- a/src/nvim/tui/tui.c +++ b/src/nvim/tui/tui.c @@ -110,6 +110,7 @@ UI *tui_start(void) 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; diff --git a/src/nvim/ui.c b/src/nvim/ui.c index 69916fa4cd..6dcc3de1b0 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -58,6 +58,10 @@ 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). // @@ -167,17 +171,20 @@ void ui_refresh(void) int width = INT_MAX, height = INT_MAX; bool pum_external = true; + bool tabline_external = 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; } row = col = 0; screen_resize(width, height); pum_set_external(pum_external); + ui_set_widget_external(kUITabline, tabline_external); ui_mode_info_set(); old_mode_idx = -1; ui_cursor_shape(); @@ -557,3 +564,30 @@ void ui_cursor_shape(void) conceal_check_cursur_line(); } +bool ui_is_widget_external(UIWidget widget) +{ + switch (widget) { + case kUITabline: + return tabline_external; + case kUICmdline: + return cmdline_external; + case kUIWildmenu: + return wildmenu_external; + } + return false; +} + +void ui_set_widget_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; + } +} diff --git a/src/nvim/ui.h b/src/nvim/ui.h index fcf52ac9e1..a1ff449eaf 100644 --- a/src/nvim/ui.h +++ b/src/nvim/ui.h @@ -8,6 +8,13 @@ #include "api/private/defs.h" #include "nvim/buffer_defs.h" +// values for externalized widgets +typedef enum { + kUITabline, + kUICmdline, + kUIWildmenu +} UIWidget; + typedef struct { bool bold, underline, undercurl, italic, reverse; int foreground, background, special; @@ -16,7 +23,7 @@ typedef struct { typedef struct ui_t UI; struct ui_t { - bool rgb, pum_external; + bool rgb, pum_external, tabline_external; 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 5697c765ba..9a3fcab13c 100644 --- a/src/nvim/ui_bridge.c +++ b/src/nvim/ui_bridge.c @@ -58,6 +58,7 @@ UI *ui_bridge_attach(UI *ui, ui_main_fn ui_main, event_scheduler scheduler) 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; diff --git a/src/nvim/window.c b/src/nvim/window.c index 60bba19b07..effce8b413 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -48,6 +48,7 @@ #include "nvim/syntax.h" #include "nvim/terminal.h" #include "nvim/undo.h" +#include "nvim/ui.h" #include "nvim/os/os.h" @@ -5223,6 +5224,9 @@ static void last_status_rec(frame_T *fr, int statusline) */ int tabline_height(void) { + if (ui_is_widget_external(kUITabline)) { + return 0; + } assert(first_tabpage); switch (p_stal) { case 0: return 0; -- cgit From 00843902d3472ac4e74106fc06fa60e599914496 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 25 Apr 2017 02:17:15 +0200 Subject: api/ui: externalize tabline - Work with a bool[] array parallel to the UIWidget enum. - Rename some functions. - Documentation. --- src/nvim/api/ui.c | 40 ++++++++++++++++++++++++++++++++-------- src/nvim/popupmnu.c | 9 +-------- src/nvim/screen.c | 18 +++++------------- src/nvim/tui/tui.c | 5 +++-- src/nvim/ui.c | 51 +++++++++++++++++++-------------------------------- src/nvim/ui.h | 10 ++++++---- src/nvim/ui_bridge.c | 6 ++++-- src/nvim/window.c | 4 ++-- 8 files changed, 72 insertions(+), 71 deletions(-) (limited to 'src') 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) { -- cgit From c8e1af93de90b2e23579f726fd4aa6a65f9387b6 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 25 Apr 2017 10:14:29 +0200 Subject: api: nvim_ui_attach(): Flatten ext_* options. --- src/nvim/api/ui.c | 57 ++++++++++++++++++++++++------------------------------- 1 file changed, 25 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c index 08d285eedc..3c0e8bc049 100644 --- a/src/nvim/api/ui.c +++ b/src/nvim/api/ui.c @@ -173,13 +173,33 @@ void nvim_ui_set_option(uint64_t channel_id, String name, static void ui_set_option(UI *ui, String name, Object value, Error *error) { +#define UI_EXT_OPTION(o, e) \ + do { \ + if (strequal(name.data, #o)) { \ + if (value.type != kObjectTypeBoolean) { \ + api_set_error(error, kErrorTypeValidation, #o " must be a Boolean"); \ + return; \ + } \ + ui->ui_ext[(e)] = value.data.boolean; \ + return; \ + } \ + } while (0) + if (strequal(name.data, "rgb")) { if (value.type != kObjectTypeBoolean) { api_set_error(error, kErrorTypeValidation, "rgb must be a Boolean"); return; } ui->rgb = value.data.boolean; - } else if (strequal(name.data, "popupmenu_external")) { + return; + } + + UI_EXT_OPTION(ext_cmdline, kUICmdline); + UI_EXT_OPTION(ext_popupmenu, kUIPopupmenu); + UI_EXT_OPTION(ext_tabline, kUITabline); + UI_EXT_OPTION(ext_wildmenu, kUIWildmenu); + + if (strequal(name.data, "popupmenu_external")) { // LEGACY: Deprecated option, use `ui_ext` instead. if (value.type != kObjectTypeBoolean) { api_set_error(error, kErrorTypeValidation, @@ -187,38 +207,11 @@ static void ui_set_option(UI *ui, String name, Object value, Error *error) return; } ui->ui_ext[kUIPopupmenu] = value.data.boolean; - } else if (strequal(name.data, "ui_ext")) { - if (value.type != kObjectTypeArray) { - api_set_error(error, kErrorTypeValidation, - "ui_ext must be an Array"); - return; - } - - 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"); + return; } + + api_set_error(error, kErrorTypeValidation, "No such ui option"); +#undef UI_EXT_OPTION } static void push_call(UI *ui, char *name, Array args) -- cgit From 6944abad2f3f443027af1966a2a310034d2179b2 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 25 Apr 2017 11:13:29 +0200 Subject: api/ext_tabline: List of Dicts. --- src/nvim/screen.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/nvim/screen.c b/src/nvim/screen.c index a6563534aa..de24156579 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -7038,15 +7038,14 @@ void ui_ext_tabline_update(void) ADD(args, INTEGER_OBJ(curtab->handle)); Array tabs = ARRAY_DICT_INIT; FOR_ALL_TABS(tp) { + Dictionary tab_info = ARRAY_DICT_INIT; + PUT(tab_info, "tab", TABPAGE_OBJ(tp->handle)); + 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)); - - Dictionary tab_info = ARRAY_DICT_INIT; PUT(tab_info, "name", STRING_OBJ(cstr_to_string((char *)NameBuff))); - ADD(tab, DICTIONARY_OBJ(tab_info)); - ADD(tabs, ARRAY_OBJ(tab)); + + ADD(tabs, DICTIONARY_OBJ(tab_info)); } ADD(args, ARRAY_OBJ(tabs)); -- cgit