From 73a72e3a7b0e125dfabdf9e16ccb3a129ecdeab6 Mon Sep 17 00:00:00 2001 From: Sam Leonard Date: Tue, 27 Feb 2024 14:35:14 +0000 Subject: [PATCH] basic/terminal-util: accept ST or BEL to end escape sequence queries Currently scan_background_color_response only accepts BEL (\x07) to end a response, however some terminals (namely kitty in my case) will reply with the string terminator (ST - https://en.wikipedia.org/wiki/ANSI_escape_code). This commit changes the behaviour to now accept either ending. --- src/basic/terminal-util.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index aa1cf7cfff7..8b5a9fa8c68 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -1581,6 +1581,7 @@ typedef enum BackgroundColorState { BACKGROUND_RED, BACKGROUND_GREEN, BACKGROUND_BLUE, + BACKGROUND_STRING_TERMINATOR, } BackgroundColorState; typedef struct BackgroundColorContext { @@ -1672,7 +1673,9 @@ static int scan_background_color_response( return 1; /* success! */ context->state = BACKGROUND_TEXT; - } else { + } else if (c == '\x1b') + context->state = context->blue_bits > 0 ? BACKGROUND_STRING_TERMINATOR : BACKGROUND_TEXT; + else { int d = unhexchar(c); if (d < 0 || context->blue_bits >= sizeof(context->blue)*8) context->state = BACKGROUND_TEXT; @@ -1682,10 +1685,18 @@ static int scan_background_color_response( } } break; + + case BACKGROUND_STRING_TERMINATOR: + if (c == '\\') + return 1; /* success! */ + + context->state = c == ']' ? BACKGROUND_ESCAPE : BACKGROUND_TEXT; + break; + } /* Reset any colors we might have picked up */ - if (context->state == BACKGROUND_TEXT) { + if (IN_SET(context->state, BACKGROUND_TEXT, BACKGROUND_ESCAPE)) { /* reset color */ context->red = context->green = context->blue = 0; context->red_bits = context->green_bits = context->blue_bits = 0; -- 2.47.3