aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/vterm
diff options
context:
space:
mode:
authorGregory Anders <greg@gpanders.com>2025-01-14 08:18:59 -0600
committerGitHub <noreply@github.com>2025-01-14 08:18:59 -0600
commitf1c45fc7a4a595e460cd245172a5767bddeb09e9 (patch)
treebf9dd2ffe6acea41c7639828fffef9a8393015fe /src/nvim/vterm
parent7eabc8899af8b2fed1472165b74f43965282974f (diff)
downloadrneovim-f1c45fc7a4a595e460cd245172a5767bddeb09e9.tar.gz
rneovim-f1c45fc7a4a595e460cd245172a5767bddeb09e9.tar.bz2
rneovim-f1c45fc7a4a595e460cd245172a5767bddeb09e9.zip
feat(terminal): support theme update notifications (DEC mode 2031) (#31999)
Diffstat (limited to 'src/nvim/vterm')
-rw-r--r--src/nvim/vterm/screen.c12
-rw-r--r--src/nvim/vterm/state.c19
-rw-r--r--src/nvim/vterm/vterm_defs.h3
-rw-r--r--src/nvim/vterm/vterm_internal_defs.h1
4 files changed, 35 insertions, 0 deletions
diff --git a/src/nvim/vterm/screen.c b/src/nvim/vterm/screen.c
index c91c6fb84f..45bd5e2a27 100644
--- a/src/nvim/vterm/screen.c
+++ b/src/nvim/vterm/screen.c
@@ -784,6 +784,17 @@ static int resize(int new_rows, int new_cols, VTermStateFields *fields, void *us
return 1;
}
+static int theme(bool *dark, void *user)
+{
+ VTermScreen *screen = user;
+
+ if (screen->callbacks && screen->callbacks->theme) {
+ return (*screen->callbacks->theme)(dark, screen->cbdata);
+ }
+
+ return 1;
+}
+
static int setlineinfo(int row, const VTermLineInfo *newinfo, const VTermLineInfo *oldinfo,
void *user)
{
@@ -838,6 +849,7 @@ static VTermStateCallbacks state_cbs = {
.settermprop = &settermprop,
.bell = &bell,
.resize = &resize,
+ .theme = &theme,
.setlineinfo = &setlineinfo,
.sb_clear = &sb_clear,
};
diff --git a/src/nvim/vterm/state.c b/src/nvim/vterm/state.c
index 9e787acd9b..4ad07377de 100644
--- a/src/nvim/vterm/state.c
+++ b/src/nvim/vterm/state.c
@@ -819,6 +819,10 @@ static void set_dec_mode(VTermState *state, int num, int val)
state->mode.bracketpaste = (unsigned)val;
break;
+ case 2031:
+ settermprop_bool(state, VTERM_PROP_THEMEUPDATES, val);
+ break;
+
default:
DEBUG_LOG("libvterm: Unknown DEC mode %d\n", num);
return;
@@ -894,6 +898,10 @@ static void request_dec_mode(VTermState *state, int num)
reply = state->mode.bracketpaste;
break;
+ case 2031:
+ reply = state->mode.theme_updates;
+ break;
+
default:
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?%d;%d$y", num, 0);
return;
@@ -1387,6 +1395,7 @@ static int on_csi(const char *leader, const long args[], int argcount, const cha
{
char *qmark = (leader_byte == '?') ? "?" : "";
+ bool dark = false;
switch (val) {
case 0:
@@ -1403,6 +1412,13 @@ static int on_csi(const char *leader, const long args[], int argcount, const cha
vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "%s%d;%dR", qmark, state->pos.row + 1,
state->pos.col + 1);
break;
+ case 996:
+ if (state->callbacks && state->callbacks->theme) {
+ if (state->callbacks->theme(&dark, state->cbdata)) {
+ vterm_push_output_sprintf_ctrl(state->vt, C1_CSI, "?997;%cn", dark ? '1' : '2');
+ }
+ }
+ break;
}
}
break;
@@ -2268,6 +2284,9 @@ int vterm_state_set_termprop(VTermState *state, VTermProp prop, VTermValue *val)
case VTERM_PROP_FOCUSREPORT:
state->mode.report_focus = (unsigned)val->boolean;
return 1;
+ case VTERM_PROP_THEMEUPDATES:
+ state->mode.theme_updates = (unsigned)val->boolean;
+ return 1;
case VTERM_N_PROPS:
return 0;
diff --git a/src/nvim/vterm/vterm_defs.h b/src/nvim/vterm/vterm_defs.h
index d0a8ba8814..9aa933bef0 100644
--- a/src/nvim/vterm/vterm_defs.h
+++ b/src/nvim/vterm/vterm_defs.h
@@ -86,6 +86,7 @@ typedef enum {
VTERM_PROP_CURSORSHAPE, // number
VTERM_PROP_MOUSE, // number
VTERM_PROP_FOCUSREPORT, // bool
+ VTERM_PROP_THEMEUPDATES, // bool
VTERM_N_PROPS,
} VTermProp;
@@ -111,6 +112,7 @@ typedef struct {
int (*settermprop)(VTermProp prop, VTermValue *val, void *user);
int (*bell)(void *user);
int (*resize)(int rows, int cols, void *user);
+ int (*theme)(bool *dark, void *user);
int (*sb_pushline)(int cols, const VTermScreenCell *cells, void *user);
int (*sb_popline)(int cols, VTermScreenCell *cells, void *user);
int (*sb_clear)(void *user);
@@ -263,6 +265,7 @@ typedef struct {
int (*settermprop)(VTermProp prop, VTermValue *val, void *user);
int (*bell)(void *user);
int (*resize)(int rows, int cols, VTermStateFields *fields, void *user);
+ int (*theme)(bool *dark, void *user);
int (*setlineinfo)(int row, const VTermLineInfo *newinfo, const VTermLineInfo *oldinfo,
void *user);
int (*sb_clear)(void *user);
diff --git a/src/nvim/vterm/vterm_internal_defs.h b/src/nvim/vterm/vterm_internal_defs.h
index 770f862ce3..d4d59867bf 100644
--- a/src/nvim/vterm/vterm_internal_defs.h
+++ b/src/nvim/vterm/vterm_internal_defs.h
@@ -119,6 +119,7 @@ struct VTermState {
unsigned leftrightmargin:1;
unsigned bracketpaste:1;
unsigned report_focus:1;
+ unsigned theme_updates:1;
} mode;
VTermEncodingInstance encoding[4], encoding_utf8;