diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 8ded46f4938..4172db12a5b 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -1923,12 +1923,12 @@ int get_default_background_color(double *ret_red, double *ret_green, double *ret if (tcsetattr(STDIN_FILENO, TCSADRAIN, &new_termios) < 0) return -errno; - r = loop_write(STDOUT_FILENO, "\x1B]11;?\x07", SIZE_MAX); + r = loop_write(STDOUT_FILENO, "\x1B]11;?" ANSI_ST, SIZE_MAX); if (r < 0) goto finish; usec_t end = usec_add(now(CLOCK_MONOTONIC), 333 * USEC_PER_MSEC); - char buf[STRLEN("\x1B]11;rgb:0/0/0\x07")]; /* shortest possible reply */ + char buf[STRLEN("\x1B]11;rgb:0/0/0" ANSI_ST)]; /* shortest possible reply */ size_t buf_full = 0; BackgroundColorContext context = {}; diff --git a/src/basic/terminal-util.h b/src/basic/terminal-util.h index b446e547d60..3d02e92d0bf 100644 --- a/src/basic/terminal-util.h +++ b/src/basic/terminal-util.h @@ -27,6 +27,13 @@ #define ANSI_WINDOW_TITLE_PUSH "\x1b[22;2t" #define ANSI_WINDOW_TITLE_POP "\x1b[23;2t" +/* ANSI "string terminator" character ("ST"). Terminal emulators typically allow three different ones: 0x07, + * 0x9c, and 0x1B 0x5C. We'll avoid 0x07 (BEL, aka ^G) since it might trigger unexpected TTY signal + * handling. And we'll avoid 0x9c since that's also valid regular codepoint in UTF-8 and elsewhere, and + * creates ambiguities. Because of that some terminal emulators explicitly choose not to support it. Hence we + * use 0x1B 0x5c */ +#define ANSI_ST "\e\\" + bool isatty_safe(int fd); int terminal_reset_defensive(int fd, bool switch_to_text); diff --git a/src/shared/pretty-print.c b/src/shared/pretty-print.c index df1c20fa244..1e9819ab093 100644 --- a/src/shared/pretty-print.c +++ b/src/shared/pretty-print.c @@ -88,7 +88,7 @@ int terminal_urlify(const char *url, const char *text, char **ret) { text = url; if (urlify_enabled()) - n = strjoin("\x1B]8;;", url, "\a", text, "\x1B]8;;\a"); + n = strjoin("\x1B]8;;", url, ANSI_ST, text, "\x1B]8;;" ANSI_ST); else n = strdup(text); if (!n) @@ -475,7 +475,7 @@ void draw_progress_bar_unbuffered(const char *prefix, double percentage) { * https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC * https://github.com/microsoft/terminal/pull/8055 */ - fprintf(stderr, "\x1B]9;4;1;%u\a", (unsigned) ceil(percentage)); + fprintf(stderr, "\x1B]9;4;1;%u" ANSI_ST, (unsigned) ceil(percentage)); size_t cols = columns(); size_t prefix_width = utf8_console_width(prefix) + 1 /* space */; @@ -534,7 +534,7 @@ void clear_progress_bar_unbuffered(const char *prefix) { stderr); else /* Undo Windows Terminal progress indication again. */ - fputs("\x1B]9;4;0;;\a" + fputs("\x1B]9;4;0;;" ANSI_ST ANSI_ERASE_TO_END_OF_LINE, stderr); fputc('\r', stderr); diff --git a/src/shared/ptyfwd.c b/src/shared/ptyfwd.c index c06c279d87b..11701f67687 100644 --- a/src/shared/ptyfwd.c +++ b/src/shared/ptyfwd.c @@ -397,7 +397,7 @@ static int insert_window_title_fix(PTYForward *f, size_t offset) { if (!t) return 0; - _cleanup_free_ char *joined = strjoin("\x1b]0;", f->title_prefix, t, "\a"); + _cleanup_free_ char *joined = strjoin("\x1b]0;", f->title_prefix, t, ANSI_ST); if (!joined) return -ENOMEM; @@ -567,7 +567,7 @@ static int do_shovel(PTYForward *f) { if (f->title) { if (!strextend(&f->out_buffer, ANSI_WINDOW_TITLE_PUSH - "\x1b]2;", f->title, "\a")) + "\x1b]2;", f->title, ANSI_ST)) return log_oom(); }