aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/msgpack_rpc.txt10
-rw-r--r--src/nvim/api/ui.c57
-rw-r--r--test/functional/ui/screen_basic_spec.lua24
-rw-r--r--test/functional/ui/tabline_spec.lua2
-rw-r--r--test/functional/viml/completion_spec.lua2
5 files changed, 34 insertions, 61 deletions
diff --git a/runtime/doc/msgpack_rpc.txt b/runtime/doc/msgpack_rpc.txt
index 7adc4ca2e9..da9b2360e3 100644
--- a/runtime/doc/msgpack_rpc.txt
+++ b/runtime/doc/msgpack_rpc.txt
@@ -264,13 +264,11 @@ a dictionary with these (optional) keys:
colors.
Set to false to use terminal color codes (at
most 256 different colors).
- `ui_ext` String array of "externalized" widgets.
- Widgets in this list will not be drawn by
+ `ext_popupmenu` Externalize the popupmenu. |ui-ext-popupmenu|
+ `ext_tabline` Externalize the tabline. |ui-ext-tabline|
+ Externalized widgets will not be drawn by
Nvim; only high-level data will be published
- in new UI event kinds. Valid names:
- popupmenu |ui-ext-popupmenu|
- tabline |ui-ext-tabline|
- Defaults to empty.
+ in new UI event kinds.
Nvim will then send msgpack-rpc notifications, with the method name "redraw"
and a single argument, an array of screen updates (described below). These
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)
diff --git a/test/functional/ui/screen_basic_spec.lua b/test/functional/ui/screen_basic_spec.lua
index d6aa1aa993..5d89416e4a 100644
--- a/test/functional/ui/screen_basic_spec.lua
+++ b/test/functional/ui/screen_basic_spec.lua
@@ -577,28 +577,10 @@ describe('nvim_ui_attach()', function()
eq(999, eval('&lines'))
eq(999, eval('&columns'))
end)
- it('"ui_ext" widgets', function()
+ it('invalid option returns error', function()
local screen = Screen.new()
- screen:attach({ui_ext={
- 'cmdline',
- 'popupmenu',
- 'tabline',
- 'wildmenu',
- }})
- end)
- it('invalid "ui_ext" returns error', function()
- local screen = Screen.new()
-
- local status, rv = pcall(function() screen:attach({ui_ext={'foo'}}) end)
- eq(false, status)
- eq('ui_ext: unknown widget: foo', rv:match("ui_ext:.*"))
-
- status, rv = pcall(function() screen:attach({ui_ext={'cmdline','foo'}}) end)
- eq(false, status)
- eq('ui_ext: unknown widget: foo', rv:match("ui_ext:.*"))
-
- status, rv = pcall(function() screen:attach({ui_ext={'cmdline',1}}) end)
+ local status, rv = pcall(function() screen:attach({foo={'foo'}}) end)
eq(false, status)
- eq('ui_ext: item must be a String', rv:match("ui_ext:.*"))
+ eq('No such ui option', rv:match("No such .*"))
end)
end)
diff --git a/test/functional/ui/tabline_spec.lua b/test/functional/ui/tabline_spec.lua
index c62dd0c94b..aa7b432c09 100644
--- a/test/functional/ui/tabline_spec.lua
+++ b/test/functional/ui/tabline_spec.lua
@@ -9,7 +9,7 @@ describe('ui/tabline', function()
before_each(function()
clear()
screen = Screen.new(25, 5)
- screen:attach({rgb=true, ui_ext={'tabline'}})
+ screen:attach({rgb=true, ext_tabline=true})
screen:set_on_event_handler(function(name, data)
if name == "tabline_update" then
curtab, tabs = unpack(data)
diff --git a/test/functional/viml/completion_spec.lua b/test/functional/viml/completion_spec.lua
index 5f5e9437dc..0e5278345c 100644
--- a/test/functional/viml/completion_spec.lua
+++ b/test/functional/viml/completion_spec.lua
@@ -874,7 +874,7 @@ describe('ui/externalized/popupmenu', function()
before_each(function()
clear()
screen = Screen.new(60, 8)
- screen:attach({rgb=true, ui_ext={'popupmenu'}})
+ screen:attach({rgb=true, ext_popupmenu=true})
screen:set_default_attr_ids({
[1] = {bold=true, foreground=Screen.colors.Blue},
[2] = {bold = true},