diff --git a/libervia/cli/base.py b/libervia/cli/base.py index 7448159e..823ef52c 100644 --- a/libervia/cli/base.py +++ b/libervia/cli/base.py @@ -26,6 +26,7 @@ import logging as log import os import os.path from pathlib import Path +import signal import sys import termios import tty @@ -168,7 +169,15 @@ class LiberviaCli: or vte_version >= 3502 ) ): - # ANSI escape sequence + # ANSI escape sequence with alarm timeout to avoid hanging on unresponsive ptys + _bg_timeout = 0.5 + + def _alarm_handler(signum, frame): + raise TimeoutError("ANSI query timed out") + + old_handler = signal.signal(signal.SIGALRM, _alarm_handler) + signal.setitimer(signal.ITIMER_REAL, _bg_timeout) + stdin_fd = sys.stdin.fileno() old_settings = termios.tcgetattr(stdin_fd) try: @@ -188,7 +197,11 @@ class LiberviaCli: ] # '\a' is the last character sys.stdin.read(1) + except TimeoutError: + return "dark" finally: + signal.setitimer(signal.ITIMER_REAL, 0) + signal.signal(signal.SIGALRM, old_handler) termios.tcsetattr(stdin_fd, termios.TCSADRAIN, old_settings) lum = utils.per_luminance(red, green, blue)