Initial commit

This commit is contained in:
Lyx committed 2025-03-14 16:23:01 +01:00
commit 3394196287
2164 files changed
+358958

No files matched your search

@@ -0,0 +1,41 @@
import msvcrt
from ._config import config
def readchar() -> str:
"""Reads a single utf8-character from the input stream.
Blocks until a character is available."""
# read a single wide character from the input
return msvcrt.getwch()
def readkey() -> str:
"""Reads the next keypress. If an escaped key is pressed, the full
sequence is read and returned as noted in `_win_key.py`."""
# read first character
ch = readchar()
# keys like CTRL+C should cause a interrupt
if ch in config.INTERRUPT_KEYS:
raise KeyboardInterrupt
# parse special multi character keys (see key module)
# https://learn.microsoft.com/cpp/c-runtime-library/reference/getch-getwch#remarks
if ch in "\x00\xe0":
# read the second half
# we always return the 0x00 prefix, this avoids duplications in the key module
ch = "\x00" + readchar()
# parse unicode surrogates
# https://docs.python.org/3/c-api/unicode.html#c.Py_UNICODE_IS_SURROGATE
if "\uD800" <= ch <= "\uDFFF":
ch += readchar()
# combine the characters into a single utf-16 encoded string.
# this prevents the character from being treated as a surrogate pair again.
ch = ch.encode("utf-16", errors="surrogatepass").decode("utf-16")
return ch