aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2023-02-28 06:24:23 -0500
committerGitHub <noreply@github.com>2023-02-28 06:24:23 -0500
commit3b927762264c27aaeb31b83ba2e4924d5312ddcc (patch)
tree0c8252f2636b84b8387cfbe1754bb7a6928bd4ca /src
parenta87b52d328d5f78965d6eaff7efab7b63069bdc0 (diff)
parentce597235a26839826de88ecd8b949ec54c310fbd (diff)
downloadrneovim-3b927762264c27aaeb31b83ba2e4924d5312ddcc.tar.gz
rneovim-3b927762264c27aaeb31b83ba2e4924d5312ddcc.tar.bz2
rneovim-3b927762264c27aaeb31b83ba2e4924d5312ddcc.zip
Merge #22382 has('gui_running')
Diffstat (limited to 'src')
-rw-r--r--src/nvim/api/ui.c15
-rw-r--r--src/nvim/eval/funcs.c4
-rw-r--r--src/nvim/ui.c21
-rw-r--r--src/nvim/ui.h7
-rw-r--r--src/nvim/ui_client.c2
5 files changed, 42 insertions, 7 deletions
diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c
index f6dee066dc..a8f5d2e070 100644
--- a/src/nvim/api/ui.c
+++ b/src/nvim/api/ui.c
@@ -113,6 +113,10 @@ void remote_ui_disconnect(uint64_t channel_id)
kv_destroy(data->call_buf);
pmap_del(uint64_t)(&connected_uis, channel_id);
ui_detach_impl(ui, channel_id);
+
+ // Destroy `ui`.
+ XFREE_CLEAR(ui->term_name);
+ XFREE_CLEAR(ui->term_background);
xfree(ui);
}
@@ -163,15 +167,9 @@ void nvim_ui_attach(uint64_t channel_id, Integer width, Integer height, Dictiona
UI *ui = xcalloc(1, sizeof(UI));
ui->width = (int)width;
ui->height = (int)height;
- ui->pum_nlines = 0;
- ui->pum_pos = false;
- ui->pum_width = 0.0;
- ui->pum_height = 0.0;
ui->pum_row = -1.0;
ui->pum_col = -1.0;
ui->rgb = true;
- ui->override = false;
-
CLEAR_FIELD(ui->ui_ext);
for (size_t i = 0; i < options.size; i++) {
@@ -320,6 +318,7 @@ static void ui_set_option(UI *ui, bool init, String name, Object value, Error *e
return;
});
set_tty_option("term", string_to_cstr(value.data.string));
+ ui->term_name = string_to_cstr(value.data.string);
return;
}
@@ -328,6 +327,7 @@ static void ui_set_option(UI *ui, bool init, String name, Object value, Error *e
return;
});
t_colors = (int)value.data.integer;
+ ui->term_colors = (int)value.data.integer;
return;
}
@@ -336,6 +336,7 @@ static void ui_set_option(UI *ui, bool init, String name, Object value, Error *e
return;
});
set_tty_background(value.data.string.data);
+ ui->term_background = string_to_cstr(value.data.string);
return;
}
@@ -359,6 +360,7 @@ static void ui_set_option(UI *ui, bool init, String name, Object value, Error *e
return;
});
stdin_isatty = value.data.boolean;
+ ui->stdin_tty = value.data.boolean;
return;
}
@@ -367,6 +369,7 @@ static void ui_set_option(UI *ui, bool init, String name, Object value, Error *e
return;
});
stdout_isatty = value.data.boolean;
+ ui->stdout_tty = value.data.boolean;
return;
}
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index 20e590a30c..d3bac14754 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -3228,7 +3228,9 @@ static void f_has(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
}
if (!n) {
- if (STRNICMP(name, "patch", 5) == 0) {
+ if (STRNICMP(name, "gui_running", 11) == 0) {
+ n = ui_gui_attached();
+ } else if (STRNICMP(name, "patch", 5) == 0) {
if (name[5] == '-'
&& strlen(name) >= 11
&& ascii_isdigit(name[6])
diff --git a/src/nvim/ui.c b/src/nvim/ui.c
index 73545441d3..ce1a57350a 100644
--- a/src/nvim/ui.c
+++ b/src/nvim/ui.c
@@ -134,6 +134,7 @@ void ui_free_all_mem(void)
}
#endif
+/// Returns true if any `rgb=true` UI is attached.
bool ui_rgb_attached(void)
{
if (!headless_mode && p_tgc) {
@@ -147,6 +148,18 @@ bool ui_rgb_attached(void)
return false;
}
+/// Returns true if a GUI is attached.
+bool ui_gui_attached(void)
+{
+ for (size_t i = 0; i < ui_count; i++) {
+ bool tui = uis[i]->stdin_tty || uis[i]->stdout_tty;
+ if (!tui) {
+ return true;
+ }
+ }
+ return false;
+}
+
/// Returns true if any UI requested `override=true`.
bool ui_override(void)
{
@@ -598,6 +611,14 @@ Array ui_array(void)
PUT(info, "height", INTEGER_OBJ(ui->height));
PUT(info, "rgb", BOOLEAN_OBJ(ui->rgb));
PUT(info, "override", BOOLEAN_OBJ(ui->override));
+
+ // TUI fields. (`stdin_fd` is intentionally omitted.)
+ PUT(info, "term_name", STRING_OBJ(cstr_to_string(ui->term_name)));
+ PUT(info, "term_background", STRING_OBJ(cstr_to_string(ui->term_background)));
+ PUT(info, "term_colors", INTEGER_OBJ(ui->term_colors));
+ PUT(info, "stdin_tty", BOOLEAN_OBJ(ui->stdin_tty));
+ PUT(info, "stdout_tty", BOOLEAN_OBJ(ui->stdout_tty));
+
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]));
diff --git a/src/nvim/ui.h b/src/nvim/ui.h
index e83f93eb07..dc0ccc73ea 100644
--- a/src/nvim/ui.h
+++ b/src/nvim/ui.h
@@ -103,6 +103,13 @@ struct ui_t {
double pum_height;
double pum_width;
+ // TUI fields.
+ char *term_name;
+ char *term_background;
+ int term_colors;
+ bool stdin_tty;
+ bool stdout_tty;
+
// TODO(bfredl): integrate into struct!
UIData data[1];
};
diff --git a/src/nvim/ui_client.c b/src/nvim/ui_client.c
index 8262293ec5..25ff63ea2d 100644
--- a/src/nvim/ui_client.c
+++ b/src/nvim/ui_client.c
@@ -1,6 +1,8 @@
// This is an open source non-commercial project. Dear PVS-Studio, please check
// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+/// Nvim's own UI client, which attaches to a child or remote Nvim server.
+
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>