From 5e1716fd00a0ab6c0046f6fd20611cdeee6c3607 Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Thu, 30 Apr 2026 20:36:35 +0200 Subject: 54404: skip the RGB terminal query on older versions of the Apple terminal The sequence isn't consumed so gets printed and then quickly erased. macOS conveniently sets TERM_PROGRAM in the environment so this can be detected. --- ChangeLog | 6 ++++++ Src/Zle/termquery.c | 19 ++++++++++++++++++- Test/X06termquery.ztst | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index ca4c1f442..8869d6577 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2026-04-30 Oliver Kiddle + + * 54404: Src/Zle/termquery.c, Test/X06termquery.ztst: skip + the RGB terminal query on older versions of the Apple terminal + which fail to consume the sequence + 2026-04-29 dana * unposted: Completion/Linux/Command/_opkg: guard zparseopts diff --git a/Src/Zle/termquery.c b/Src/Zle/termquery.c index d8be6e49a..bd601735f 100644 --- a/Src/Zle/termquery.c +++ b/Src/Zle/termquery.c @@ -507,8 +507,25 @@ query_terminal(void) { char *tqend = tquery; static seqstate_t states[] = QUERY_STATES; char **f, **flist = getaparam(EXTVAR); + char *envid = getsparam("TERM_PROGRAM"); + int badapple = 0; size_t i; + /* If TERM_PROGRAM is set in the environment, use that and + * skip the XTVERSION query */ + if (envid) { + char *envver; + handle_query(4, NULL, 0, envid, strlen(envid), NULL); + if ((envver = getsparam("TERM_PROGRAM_VERSION"))) { + handle_query(5, NULL, 0, envver, strlen(envver), NULL); + /* Older macOS terminal doesn't consume RGB queries, + * nor does it support truecolor. Given that it's widely + * used, we handle it explicitly. */ + badapple = !strcmp(envid, "Apple_Terminal") && + zstrtol(envver, NULL, 10) < 470; + } + } + for (f = flist; f && *f; f++) if (!strcmp(*f, "-query")) return; /* disable all queries */ @@ -536,7 +553,7 @@ query_terminal(void) { (!strcmp(cterm, "truecolor") || !strcmp(cterm, "24bit"))))) handle_query(3, NULL, 0, NULL, 0, NULL); - else + else if ((i != 4 || !badapple) && (i != 5 || !envid)) struncpy(&tqend, (char *) queries[i], /* collate escape sequences */ sizeof(tquery) - (tqend - tquery)); } diff --git a/Test/X06termquery.ztst b/Test/X06termquery.ztst index 5f3a81aae..701cd625b 100644 --- a/Test/X06termquery.ztst +++ b/Test/X06termquery.ztst @@ -5,6 +5,7 @@ termresp() { setopt localoptions extendedglob export PS1= PS2= COLORTERM= TERM= + typeset +x TERM_PROGRAM typeset +x -m .term.\* zpty -d zpty zsh "${(q)ZTST_testdir}/../Src/zsh -fiV +Z" -- cgit v1.3.1