Files
weatherCLI/.venv/lib/python3.13/site-packages/readchar/_posix_read.py
T
2025-03-14 16:23:01 +01:00

56 lines
1.3 KiB
Python

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