74 lines
1.4 KiB
Python
74 lines
1.4 KiB
Python
|
|
import sys
|
|
|
|
BACKSPACE = "backspace"
|
|
ENTER = "enter"
|
|
|
|
|
|
DELETE = "delete"
|
|
ESCAPE = "escape"
|
|
UP = "up"
|
|
DOWN = "down"
|
|
LEFT = "left"
|
|
RIGHT = "right"
|
|
PAGEUP = "pageup"
|
|
PAGEDOWN = "pagedown"
|
|
HOME = "home"
|
|
END = "end"
|
|
|
|
BEFORE_LETTERS = ord('A') - 1
|
|
|
|
def name_char(char):
|
|
n = ord(char)
|
|
if n > 31 and n != 127:
|
|
return char
|
|
if n == 8 or n == 127:
|
|
return BACKSPACE
|
|
if n == 10 or n == 13:
|
|
return ENTER
|
|
if n > 0 and n <= 26:
|
|
return "^" + chr(n + BEFORE_LETTERS)
|
|
return "chr({})".format(n)
|
|
|
|
def get_key(stream=sys.stdin, combine_escape=True, do_interrupt=False):
|
|
char = stream.read(1)
|
|
if do_interrupt and ord(char) == 3:
|
|
raise KeyboardInterrupt
|
|
if ord(char) == 27:
|
|
if not combine_escape:
|
|
return ESCAPE
|
|
nextchar = stream.read(1)
|
|
while ord(nextchar) == 27: # avoid deep recursion
|
|
nextchar = stream.read(1)
|
|
if nextchar != "[":
|
|
return "\\e" + name_char(nextchar)
|
|
last = stream.read(1)
|
|
rest = last
|
|
while last in "1234567890;=?":
|
|
last = stream.read(1)
|
|
rest += last
|
|
if rest == "A":
|
|
return UP
|
|
elif rest == "B":
|
|
return DOWN
|
|
elif rest == "C":
|
|
return RIGHT
|
|
elif rest == "D":
|
|
return LEFT
|
|
elif rest == "H":
|
|
return HOME
|
|
elif rest == "F":
|
|
return END
|
|
elif rest == "3~":
|
|
return DELETE
|
|
elif rest == "5~":
|
|
return PAGEUP
|
|
elif rest == "6~":
|
|
return PAGEDOWN
|
|
else:
|
|
return "\\e[" + rest
|
|
else:
|
|
return name_char(char)
|
|
|
|
|