# HG changeset patch # User Goffi # Date 1636214930 -3600 # Node ID c143e7f35074f4ee64e1e02652e8c3e4b788160e # Parent de133b180941e6cec42251c9e854fd2a37b2fa4d cli (base): better background detection: - ANSI escape code detection is only used on terminals known to be compatible (currently xterm, konsole, and all VTE based ones) - `COLORFGBG` environment variable is used as fallback - if both methods fail, `dark` is used This should avoid problems with incompatible terminals (e.g. on QTerminal, users had to press `[ENTER]` each time). fix 406 diff -r de133b180941 -r c143e7f35074 sat_frontends/jp/base.py --- a/sat_frontends/jp/base.py Fri Nov 05 18:11:24 2021 +0100 +++ b/sat_frontends/jp/base.py Sat Nov 06 17:08:50 2021 +0100 @@ -119,33 +119,65 @@ return config.getConfig(self.sat_conf, section, name, default=default) def guess_background(self): - if not sys.stdin.isatty() or not sys.stdout.isatty(): - return 'dark' - stdin_fd = sys.stdin.fileno() - old_settings = termios.tcgetattr(stdin_fd) + # cf. https://unix.stackexchange.com/a/245568 (thanks!) try: - tty.setraw(sys.stdin.fileno()) - # we request background color - sys.stdout.write("\033]11;?\a") - sys.stdout.flush() - expected = "\033]11;rgb:" - for c in expected: - ch = sys.stdin.read(1) - if ch != c: - # background id is not supported, we default to "dark" - # TODO: log something? - return 'dark' - red, green, blue = [int(c, 16)/65535 for c in sys.stdin.read(14).split('/')] - # '\a' is the last character - sys.stdin.read(1) - finally: - termios.tcsetattr(stdin_fd, termios.TCSADRAIN, old_settings) + # for VTE based terminals + vte_version = int(os.getenv("VTE_VERSION", 0)) + except ValueError: + vte_version = 0 + + color_fg_bg = os.getenv("COLORFGBG") - lum = utils.per_luminance(red, green, blue) - if lum <= 0.5: - return 'dark' + if ((sys.stdin.isatty() and sys.stdout.isatty() + and ( + # XTerm + os.getenv("TERM", "") in {"xterm"} + # Konsole + or os.getenv("KONSOLE_VERSION") + # All VTE based terminals + or vte_version >= 3502 + ))): + # ANSI escape sequence + stdin_fd = sys.stdin.fileno() + old_settings = termios.tcgetattr(stdin_fd) + try: + tty.setraw(sys.stdin.fileno()) + # we request background color + sys.stdout.write("\033]11;?\a") + sys.stdout.flush() + expected = "\033]11;rgb:" + for c in expected: + ch = sys.stdin.read(1) + if ch != c: + # background id is not supported, we default to "dark" + # TODO: log something? + return 'dark' + red, green, blue = [ + int(c, 16)/65535 for c in sys.stdin.read(14).split('/') + ] + # '\a' is the last character + sys.stdin.read(1) + finally: + termios.tcsetattr(stdin_fd, termios.TCSADRAIN, old_settings) + + lum = utils.per_luminance(red, green, blue) + if lum <= 0.5: + return 'dark' + else: + return 'light' + elif color_fg_bg: + # no luck with ANSI escape sequence, we try COLORFGBG environment variable + try: + bg = int(color_fg_bg.split(";")[-1]) + except ValueError: + return "dark" + if bg in list(range(7)) + [8]: + return "dark" + else: + return "light" else: - return 'light' + # no autodetection method found + return "dark" def set_color_theme(self): background = self.get_config('background', default='auto')