From 98a80c7cbc3b2667db2b57032f48ebedf01382d8 Mon Sep 17 00:00:00 2001 From: Uyanide Date: Sat, 17 Jan 2026 07:36:42 +0100 Subject: [PATCH] add a script to query if the terminal supports kitty tgp --- config/scripts/.local/scripts/kitty-tgp-query | 88 +++++++++++++++++++ .../shell/.config/fish/conf.d/60-fetch.fish | 8 +- config/yazi/.config/yazi/package.toml | 4 +- 3 files changed, 97 insertions(+), 3 deletions(-) create mode 100755 config/scripts/.local/scripts/kitty-tgp-query diff --git a/config/scripts/.local/scripts/kitty-tgp-query b/config/scripts/.local/scripts/kitty-tgp-query new file mode 100755 index 0000000..5650bad --- /dev/null +++ b/config/scripts/.local/scripts/kitty-tgp-query @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 + +import re +import sys +import os +import termios +from select import select +from time import time_ns + +QUERY_ID = time_ns() & 0xFFFFFF +QUERY_CODE = f"\033_Gi={QUERY_ID},s=1,v=1,a=q,t=d,f=24;AAAA\033\\" +EXPECTED_RESPONSE = f"\033_Gi={QUERY_ID};OK\033\\" +# Device Attributes request that most terminals respond to +FENCE_CODE = "\033[c" +FENCE_PATTERN = re.compile(r"\033\[\?.*?c") +TIMEOUT = 0.05 # seconds + +# Terminals that are known to support +SUPPORTED_TERMINALS = { + "xterm-kitty", + "xterm-ghostty" +} +# and those who don't +UNSUPPORTED_TERMINALS = { + "alacritty", + "linux", + "kmscon" +} +# the rest will be tested dynamically + + +def check_terminal_graphics(): + if os.environ.get("TERM") in UNSUPPORTED_TERMINALS: + return False + if os.environ.get("TERM") in SUPPORTED_TERMINALS: + return True + + code = QUERY_CODE + FENCE_CODE + + fd = sys.stdin.fileno() + if not os.isatty(fd): + return False + + old_settings = termios.tcgetattr(fd) + response = "" + + try: + new_settings = termios.tcgetattr(fd) + # Disable canonical mode and echo + new_settings[3] = new_settings[3] & ~termios.ICANON & ~termios.ECHO + termios.tcsetattr(fd, termios.TCSANOW, new_settings) + + sys.stdout.write(code) + sys.stdout.flush() + + while True: + # Set a timeout to prevent blocking indefinitely + r, w, e = select([fd], [], [], TIMEOUT) + if not r: + break + + char = os.read(fd, 1) + if not char: + break + + response += char.decode('utf-8', errors='ignore') + + # If received expected response, return True + if EXPECTED_RESPONSE in response: + return True + + # If received fence response before any expected response, return False + if FENCE_PATTERN.search(response): + return False + + except Exception: + pass + finally: + termios.tcsetattr(fd, termios.TCSANOW, old_settings) + + return False + + +if __name__ == "__main__": + if check_terminal_graphics(): + sys.exit(0) + else: + sys.exit(1) diff --git a/config/shell/.config/fish/conf.d/60-fetch.fish b/config/shell/.config/fish/conf.d/60-fetch.fish index 55d7da1..ef97d89 100644 --- a/config/shell/.config/fish/conf.d/60-fetch.fish +++ b/config/shell/.config/fish/conf.d/60-fetch.fish @@ -1,5 +1,11 @@ if not set -q fetch_logo_type - set -g fetch_logo_type auto + if type -q kitty-tgp-query; and kitty-tgp-query + set -g fetch_logo_type kitty + else if type -q kitty-tgp-query + set -g fetch_logo_type logo + else + set -g fetch_logo_type auto + end end if not set -q fetch_color diff --git a/config/yazi/.config/yazi/package.toml b/config/yazi/.config/yazi/package.toml index ceb8102..adfcc07 100644 --- a/config/yazi/.config/yazi/package.toml +++ b/config/yazi/.config/yazi/package.toml @@ -1,11 +1,11 @@ [[plugin.deps]] use = "yazi-rs/plugins:git" -rev = "68f7d48" +rev = "56971d0" hash = "36a484acf6a0a0219c543ccb4cee218f" [[plugin.deps]] use = "yazi-rs/plugins:smart-enter" -rev = "68f7d48" +rev = "56971d0" hash = "56fdabc96fc1f4d53c96eb884b02a5be" [[plugin.deps]]