diff --git a/dcs.c b/dcs.c new file mode 100644 index 00000000..c591974a --- /dev/null +++ b/dcs.c @@ -0,0 +1,32 @@ +#include "dcs.h" + +#define LOG_MODULE "dcs" +#define LOG_ENABLE_DBG 0 +#include "log.h" + +void +dcs_passthrough(struct terminal *term) +{ + LOG_DBG("DCS passthrough: %.*s (%zu bytes)", + (int)term->vt.dcs.idx, term->vt.dcs.data, term->vt.dcs.idx); +} + +bool +dcs_ensure_size(struct terminal *term, size_t required_size) +{ + if (required_size <= term->vt.dcs.size) + return true; + + size_t new_size = (required_size + 127) / 128 * 128; + assert(new_size > 0); + + uint8_t *new_data = realloc(term->vt.dcs.data, new_size); + if (new_data == NULL) { + LOG_ERRNO("failed to increase size of DCS buffer"); + return false; + } + + term->vt.dcs.data = new_data; + term->vt.dcs.size = new_size; + return true; +} diff --git a/dcs.h b/dcs.h new file mode 100644 index 00000000..38108444 --- /dev/null +++ b/dcs.h @@ -0,0 +1,7 @@ +#pragma once + +#include +#include "terminal.h" + +void dcs_passthrough(struct terminal *term); +bool dcs_ensure_size(struct terminal *term, size_t required_size); diff --git a/main.c b/main.c index 642bea23..0c618d39 100644 --- a/main.c +++ b/main.c @@ -819,6 +819,7 @@ out: xkb_context_unref(term.kbd.xkb); free(term.vt.osc.data); + free(term.vt.dcs.data); for (int row = 0; row < term.normal.num_rows; row++) grid_row_free(term.normal.rows[row]); free(term.normal.rows); diff --git a/meson.build b/meson.build index d95fc347..4e074458 100644 --- a/meson.build +++ b/meson.build @@ -62,6 +62,7 @@ executable( 'config.c', 'config.h', 'commands.c', 'commands.h', 'csi.c', 'csi.h', + 'dcs.c', 'dcs.h', 'font.c', 'font.h', 'grid.c', 'grid.h', 'input.c', 'input.h', diff --git a/terminal.h b/terminal.h index 57e8c97a..2af1af53 100644 --- a/terminal.h +++ b/terminal.h @@ -129,6 +129,11 @@ struct vt { size_t size; size_t idx; } osc; + struct { + uint8_t *data; + size_t size; + size_t idx; + } dcs; struct { uint8_t data[4]; size_t idx; diff --git a/vt.c b/vt.c index 8899fc74..585e9cde 100644 --- a/vt.c +++ b/vt.c @@ -9,8 +9,9 @@ #define LOG_ENABLE_DBG 0 #include "log.h" #include "csi.h" -#include "osc.h" +#include "dcs.h" #include "grid.h" +#include "osc.h" /* https://vt100.net/emu/dec_ansi_parser */ @@ -923,10 +924,21 @@ action(struct terminal *term, enum action _action, uint8_t c) break; case ACTION_HOOK: - case ACTION_UNHOOK: + term->vt.dcs.idx = 0; + break; + case ACTION_PUT: - LOG_ERR("unimplemented: action %s", action_names[_action]); - abort(); + if (!dcs_ensure_size(term, term->vt.dcs.idx + 1)) + break; + term->vt.dcs.data[term->vt.dcs.idx++] = c; + break; + + case ACTION_UNHOOK: + if (!dcs_ensure_size(term, term->vt.dcs.idx + 1)) + break; + term->vt.dcs.data[term->vt.dcs.idx] = '\0'; + dcs_passthrough(term); + break; case ACTION_UTF8_2_ENTRY: term->vt.utf8.idx = 0;