diff --git a/osc.c b/osc.c index eb1a6064..6d346299 100644 --- a/osc.c +++ b/osc.c @@ -159,7 +159,11 @@ from_clipboard_done(void *user) term_to_slave(term, res, 4); } - term_to_slave(term, "\033\\", 2); + if (term->vt.osc.bel) + term_to_slave(term, "\a", 1); + else + term_to_slave(term, "\033\\", 2); + free(ctx); } @@ -642,10 +646,12 @@ osc_dispatch(struct terminal *term) uint8_t r = (color >> 16) & 0xff; uint8_t g = (color >> 8) & 0xff; uint8_t b = (color >> 0) & 0xff; + const char *terminator = term->vt.osc.bel ? "\a" : "\033\\"; char reply[32]; - size_t n = xsnprintf(reply, sizeof(reply), "\033]4;%u;rgb:%02x/%02x/%02x\033\\", - idx, r, g, b); + size_t n = xsnprintf( + reply, sizeof(reply), "\033]4;%u;rgb:%02x/%02x/%02x%s", + idx, r, g, b, terminator); term_to_slave(term, reply, n); } @@ -695,6 +701,7 @@ osc_dispatch(struct terminal *term) uint8_t r = (color >> 16) & 0xff; uint8_t g = (color >> 8) & 0xff; uint8_t b = (color >> 0) & 0xff; + const char *terminator = term->vt.osc.bel ? "\a" : "\033\\"; /* * Reply in XParseColor format @@ -702,8 +709,8 @@ osc_dispatch(struct terminal *term) */ char reply[32]; size_t n = xsnprintf( - reply, sizeof(reply), "\033]%u;rgb:%02x/%02x/%02x\033\\", - param, r, g, b); + reply, sizeof(reply), "\033]%u;rgb:%02x/%02x/%02x%s", + param, r, g, b, terminator); term_to_slave(term, reply, n); break; @@ -761,9 +768,13 @@ osc_dispatch(struct terminal *term) uint8_t r = (term->cursor_color.cursor >> 16) & 0xff; uint8_t g = (term->cursor_color.cursor >> 8) & 0xff; uint8_t b = (term->cursor_color.cursor >> 0) & 0xff; + const char *terminator = term->vt.osc.bel ? "\a" : "\033\\"; char reply[32]; - size_t n = xsnprintf(reply, sizeof(reply), "\033]12;rgb:%02x/%02x/%02x\033\\", r, g, b); + size_t n = xsnprintf( + reply, sizeof(reply), "\033]12;rgb:%02x/%02x/%02x%s", + r, g, b, terminator); + term_to_slave(term, reply, n); break; } diff --git a/terminal.h b/terminal.h index b3b4a90e..73988ba8 100644 --- a/terminal.h +++ b/terminal.h @@ -172,6 +172,7 @@ struct vt { uint8_t *data; size_t size; size_t idx; + bool bel; /* true if OSC string was terminated by BEL */ } osc; /* Start coordinate for current OSC-8 URI */ diff --git a/vt.c b/vt.c index b34f8fbe..687be912 100644 --- a/vt.c +++ b/vt.c @@ -579,6 +579,7 @@ action_osc_end(struct terminal *term, uint8_t c) if (!osc_ensure_size(term, term->vt.osc.idx + 1)) return; term->vt.osc.data[term->vt.osc.idx] = '\0'; + term->vt.osc.bel = c == '\a'; osc_dispatch(term); }