diff options
| author | Gregory Anders <greg@gpanders.com> | 2025-01-14 08:18:59 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-14 08:18:59 -0600 |
| commit | f1c45fc7a4a595e460cd245172a5767bddeb09e9 (patch) | |
| tree | bf9dd2ffe6acea41c7639828fffef9a8393015fe /src/nvim/vterm | |
| parent | 7eabc8899af8b2fed1472165b74f43965282974f (diff) | |
| download | rneovim-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.c | 12 | ||||
| -rw-r--r-- | src/nvim/vterm/state.c | 19 | ||||
| -rw-r--r-- | src/nvim/vterm/vterm_defs.h | 3 | ||||
| -rw-r--r-- | src/nvim/vterm/vterm_internal_defs.h | 1 |
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; |