From 13d3985ba81d714af343685fc33cd0f8e393c930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Thu, 18 Jul 2019 19:26:24 +0200 Subject: [PATCH] osc: implement foreground/background query --- osc.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/osc.c b/osc.c index be9b50b1..6b226dfd 100644 --- a/osc.c +++ b/osc.c @@ -1,20 +1,46 @@ #include "osc.h" + +#include #include -#include "terminal.h" #define LOG_MODULE "osc" #define LOG_ENABLE_DBG 0 #include "log.h" #include "render.h" +#include "terminal.h" +#include "vt.h" + +static void +osc_query(struct terminal *term, unsigned param) +{ + switch (param) { + case 10: + case 11: { + char reply[16]; + snprintf( + reply, sizeof(reply), "\033]%u;%06x\x07", + param, + (param == 10 ? term->foreground : term->background) & 0xffffff); + vt_to_slave(term, reply, strlen(reply)); + break; + } + + default: + LOG_ERR("unimplemented: OSC query: %.*s", + (int)term->vt.osc.idx, term->vt.osc.data); + abort(); + break; + } +} void osc_dispatch(struct terminal *term) { - int param = 0; + unsigned param = 0; int data_ofs = 0; for (size_t i = 0; i < term->vt.osc.idx; i++) { - int c = term->vt.osc.data[i]; + char c = term->vt.osc.data[i]; if (c == ';') { data_ofs = i + 1; @@ -35,6 +61,11 @@ osc_dispatch(struct terminal *term) const char *string = (const char *)&term->vt.osc.data[data_ofs]; + if (strlen(string) == 1 && string[0] == '?') { + osc_query(term, param); + return; + } + switch (param) { case 0: render_set_title(term, string); break; /* icon + title */ case 1: break; /* icon */