diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2019-05-09 19:35:38 +0200 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2019-05-09 22:27:41 +0200 |
commit | b9ad12e6c2fa557e2c2c2f2f6c40fabc0cc89efd (patch) | |
tree | e39da37c2dae8899bb9d18c07cc5861a942f72dc /src/nvim/ui.c | |
parent | 8330cc22afec67d9dbc2ad8b4a39eaf62fdf16d1 (diff) | |
download | rneovim-b9ad12e6c2fa557e2c2c2f2f6c40fabc0cc89efd.tar.gz rneovim-b9ad12e6c2fa557e2c2c2f2f6c40fabc0cc89efd.tar.bz2 rneovim-b9ad12e6c2fa557e2c2c2f2f6c40fabc0cc89efd.zip |
UI/nvim_ui_attach(): add `override` option
Before now, Nvim always degrades UI capabilities to the lowest-common
denominator. For example, if any connected UI has `ext_messages=false`
then `ext_messages=true` requested by any other connected UI is ignored.
Now `nvim_ui_attach()` supports `override=true`, which flips the
behavior: if any UI requests an `ext_*` UI capability then the
capability is enabled (and the legacy behavior is disabled).
Legacy UIs will be broken while a `override=true` UI is connected, but
it's useful for debugging: you can type into the TUI and observe the UI
events from another connected (UI) client. And the legacy UI will
"recover" after the `override=true` UI disconnects.
Example using pynvim:
>>> n.ui_attach(2048, 2048, rgb=True, override=True, ext_multigrid=True, ext_messages=True, ext_popupmenu=True)
>>> while True: n.next_message();
Diffstat (limited to 'src/nvim/ui.c')
-rw-r--r-- | src/nvim/ui.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/nvim/ui.c b/src/nvim/ui.c index 0dddfe5f59..7dbb8ec790 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -141,6 +141,17 @@ bool ui_rgb_attached(void) return false; } +/// Returns true if any UI requested `override=true`. +bool ui_override(void) +{ + for (size_t i = 1; i < ui_count; i++) { + if (uis[i]->override) { + return true; + } + } + return false; +} + bool ui_active(void) { return ui_count > 1; @@ -173,12 +184,13 @@ void ui_refresh(void) ext_widgets[i] = true; } + bool inclusive = ui_override(); for (size_t i = 0; i < ui_count; i++) { UI *ui = uis[i]; width = MIN(ui->width, width); height = MIN(ui->height, height); for (UIExtension j = 0; (int)j < kUIExtCount; j++) { - ext_widgets[j] &= ui->ui_ext[j]; + ext_widgets[j] &= (ui->ui_ext[j] || inclusive); } } @@ -431,6 +443,7 @@ Array ui_array(void) PUT(info, "width", INTEGER_OBJ(ui->width)); PUT(info, "height", INTEGER_OBJ(ui->height)); PUT(info, "rgb", BOOLEAN_OBJ(ui->rgb)); + PUT(info, "override", BOOLEAN_OBJ(ui->override)); for (UIExtension j = 0; j < kUIExtCount; j++) { if (ui_ext_names[j][0] != '_' || ui->ui_ext[j]) { PUT(info, ui_ext_names[j], BOOLEAN_OBJ(ui->ui_ext[j])); |