X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=input_utils.py;h=648ee301639ec876750ebdd2b5d98e0d01603eaf;hb=b10d30a46e601c9ee1f843241f2d69a1f90f7a94;hp=913146a313608398d902a03eef7fe824399cd6fc;hpb=497fb9e21f45ec08e1486abaee6dfa7b20b8a691;p=python_utils.git diff --git a/input_utils.py b/input_utils.py index 913146a..648ee30 100644 --- a/input_utils.py +++ b/input_utils.py @@ -7,6 +7,8 @@ import signal import sys from typing import List +import exceptions + def single_keystroke_response( valid_responses: List[str], @@ -15,15 +17,13 @@ def single_keystroke_response( default_response: str = None, timeout_seconds: int = None, ) -> str: - class TimeoutError(Exception): - pass - def _handle_timeout(signum, frame) -> None: - raise TimeoutError() + raise exceptions.TimeoutError() def _single_keystroke_response_internal( valid_responses: List[str], timeout_seconds=None ) -> str: + os_special_keystrokes = [3, 26] # ^C, ^Z if timeout_seconds is not None: signal.signal(signal.SIGALRM, _handle_timeout) signal.alarm(timeout_seconds) @@ -33,6 +33,8 @@ def single_keystroke_response( response = readchar.readchar() if response in valid_responses: break + if ord(response) in os_special_keystrokes: + break return response finally: if timeout_seconds is not None: @@ -45,7 +47,7 @@ def single_keystroke_response( response = _single_keystroke_response_internal( valid_responses, timeout_seconds ) - except TimeoutError: + except exceptions.TimeoutError: if default_response is not None: response = default_response if prompt is not None: