import sys import termios from ._config import config # Initially taken from: # http://code.activestate.com/recipes/134892/ # Thanks to Danny Yoo # more infos from: # https://gist.github.com/michelbl/efda48b19d3e587685e3441a74457024 # Thanks to Michel Blancard def readchar() -> str: """Reads a single character from the input stream. Blocks until a character is available.""" fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) term = termios.tcgetattr(fd) try: term[3] &= ~(termios.ICANON | termios.ECHO | termios.IGNBRK | termios.BRKINT) termios.tcsetattr(fd, termios.TCSAFLUSH, term) ch = sys.stdin.read(1) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return ch def readkey() -> str: """Get a keypress. If an escaped key is pressed, the full sequence is read and returned as noted in `_posix_key.py`.""" c1 = readchar() if c1 in config.INTERRUPT_KEYS: raise KeyboardInterrupt if c1 != "\x1B": return c1 c2 = readchar() if c2 not in "\x4F\x5B": return c1 + c2 c3 = readchar() if c3 not in "\x31\x32\x33\x35\x36": return c1 + c2 + c3 c4 = readchar() if c4 not in "\x30\x31\x33\x34\x35\x37\x38\x39": return c1 + c2 + c3 + c4 c5 = readchar() return c1 + c2 + c3 + c4 + c5