Skip to content

Commit 5286261

Browse files
committed
Use base layout keys, reprensted as DOM codes
1 parent 19b4910 commit 5286261

5 files changed

Lines changed: 246 additions & 512 deletions

File tree

gambaterm/keyboard_input.py

Lines changed: 37 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,8 @@
77
from typing import Callable, Iterator
88
from prompt_toolkit.application import create_app_session, AppSession
99

10+
from .dom_codes import DomCode
1011
from .console import Console, InputGetter
11-
from .keys import (
12-
FunctionalKeys,
13-
LatinKeys,
14-
Keys,
15-
)
1612
from .ansi_escape_code import (
1713
detect_keyboard_protocol_support_parser,
1814
run_parser_in_app_session,
@@ -37,53 +33,53 @@
3733
"""
3834

3935

40-
def get_input_mapping(console: Console) -> dict[Keys, Console.Input]:
36+
def get_input_mapping(console: Console) -> dict[DomCode, Console.Input]:
4137
return {
4238
# Directions
43-
FunctionalKeys.UP: console.Input.UP,
44-
FunctionalKeys.DOWN: console.Input.DOWN,
45-
FunctionalKeys.LEFT: console.Input.LEFT,
46-
FunctionalKeys.RIGHT: console.Input.RIGHT,
39+
DomCode.ARROW_UP: console.Input.UP,
40+
DomCode.ARROW_DOWN: console.Input.DOWN,
41+
DomCode.ARROW_LEFT: console.Input.LEFT,
42+
DomCode.ARROW_RIGHT: console.Input.RIGHT,
4743
# A button
48-
LatinKeys.F: console.Input.A,
49-
LatinKeys.V: console.Input.A,
50-
LatinKeys.SPACE: console.Input.A,
44+
DomCode.US_F: console.Input.A,
45+
DomCode.US_V: console.Input.A,
46+
DomCode.SPACE: console.Input.A,
5147
# B button
52-
LatinKeys.D: console.Input.B,
53-
LatinKeys.C: console.Input.B,
54-
FunctionalKeys.LEFT_ALT: console.Input.B,
55-
FunctionalKeys.RIGHT_ALT: console.Input.B,
48+
DomCode.US_D: console.Input.B,
49+
DomCode.US_C: console.Input.B,
50+
DomCode.ALT_LEFT: console.Input.B,
51+
DomCode.ALT_RIGHT: console.Input.B,
5652
# Start button
57-
FunctionalKeys.ENTER: console.Input.START,
58-
FunctionalKeys.RIGHT_CONTROL: console.Input.START,
53+
DomCode.ENTER: console.Input.START,
54+
DomCode.CONTROL_RIGHT: console.Input.START,
5955
# Select button
60-
FunctionalKeys.RIGHT_SHIFT: console.Input.SELECT,
61-
FunctionalKeys.BACKSPACE: console.Input.SELECT,
56+
DomCode.SHIFT_RIGHT: console.Input.SELECT,
57+
DomCode.BACKSPACE: console.Input.SELECT,
6258
}
6359

6460

65-
def get_event_mapping(console: Console) -> dict[Keys, Console.Event]:
61+
def get_event_mapping(console: Console) -> dict[DomCode, Console.Event]:
6662
return {
67-
LatinKeys.DIGIT_0: console.Event.SELECT_STATE_0,
68-
LatinKeys.DIGIT_1: console.Event.SELECT_STATE_1,
69-
LatinKeys.DIGIT_2: console.Event.SELECT_STATE_2,
70-
LatinKeys.DIGIT_3: console.Event.SELECT_STATE_3,
71-
LatinKeys.DIGIT_4: console.Event.SELECT_STATE_4,
72-
LatinKeys.DIGIT_5: console.Event.SELECT_STATE_5,
73-
LatinKeys.DIGIT_6: console.Event.SELECT_STATE_6,
74-
LatinKeys.DIGIT_7: console.Event.SELECT_STATE_7,
75-
LatinKeys.DIGIT_8: console.Event.SELECT_STATE_8,
76-
LatinKeys.DIGIT_9: console.Event.SELECT_STATE_9,
77-
LatinKeys.L: console.Event.LOAD_STATE,
78-
LatinKeys.K: console.Event.SAVE_STATE,
63+
DomCode.DIGIT0: console.Event.SELECT_STATE_0,
64+
DomCode.DIGIT1: console.Event.SELECT_STATE_1,
65+
DomCode.DIGIT2: console.Event.SELECT_STATE_2,
66+
DomCode.DIGIT3: console.Event.SELECT_STATE_3,
67+
DomCode.DIGIT4: console.Event.SELECT_STATE_4,
68+
DomCode.DIGIT5: console.Event.SELECT_STATE_5,
69+
DomCode.DIGIT6: console.Event.SELECT_STATE_6,
70+
DomCode.DIGIT7: console.Event.SELECT_STATE_7,
71+
DomCode.DIGIT8: console.Event.SELECT_STATE_8,
72+
DomCode.DIGIT9: console.Event.SELECT_STATE_9,
73+
DomCode.US_L: console.Event.LOAD_STATE,
74+
DomCode.US_K: console.Event.SAVE_STATE,
7975
}
8076

8177

8278
def make_get_input(
8379
console: Console,
84-
get_pressed: Callable[[], set[Keys]],
80+
get_pressed: Callable[[], set[DomCode]],
8581
) -> InputGetter:
86-
current_pressed: set[Keys] = set()
82+
current_pressed: set[DomCode] = set()
8783
input_mapping = get_input_mapping(console)
8884
event_mapping = get_event_mapping(console)
8985

@@ -158,7 +154,7 @@ def key_pressed_context(
158154
app_session: AppSession,
159155
display: str | None = None,
160156
xdg_session_type: str | None = None,
161-
) -> Iterator[Callable[[], set[Keys]]]:
157+
) -> Iterator[Callable[[], set[DomCode]]]:
162158
if run_parser_in_app_session(
163159
app_session, detect_keyboard_protocol_support_parser
164160
).is_supported():
@@ -193,16 +189,14 @@ def main() -> None:
193189
if key.key == "c-d":
194190
raise EOFError
195191
# Get codes
196-
codes = (x.name for x in get_pressed())
192+
line = " ".join(x.value for x in get_pressed())
197193
# Print pressed key codes
198-
print(*codes, flush=True, end="")
199-
# Tick
200-
time.sleep(1 / 30)
201-
# Clear line and hide cursor
202-
app_session.output.write_raw("\r")
194+
app_session.output.write_raw(f"\r{line}")
203195
app_session.output.erase_down()
204196
# Flush output
205197
app_session.output.flush()
198+
# Tick
199+
time.sleep(1 / 30)
206200
except (KeyboardInterrupt, EOFError):
207201
pass
208202
except RuntimeError as error:

gambaterm/keyboard_protocol_input.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
from prompt_toolkit.keys import Keys as PromptToolkitKeys
1010
from prompt_toolkit.key_binding import KeyPress
1111

12+
from .dom_codes import DomCode
1213
from .keys import (
1314
FunctionalKeys,
14-
LatinKeys,
15-
Keys,
15+
ASCII_PRINTABLE_TO_DOM_CODE,
16+
FUNCTIONAL_KEY_TO_DOM_CODE,
1617
)
1718
from .ansi_escape_code import (
1819
CSI,
@@ -292,12 +293,17 @@ class KeyboardProtocolEvent(NamedTuple):
292293
codepoints: str
293294
raw_data: str
294295

295-
def to_key(self) -> Keys | None:
296-
if self.code == "u":
297-
latin_key = LatinKeys.from_latin(self.char)
298-
if latin_key is not None:
299-
return latin_key
300-
return CSI_TO_FUNCTIONAL_KEY.get((self.code, self.char))
296+
def to_key(self) -> DomCode | None:
297+
char = self.base_layout if self.base_layout is not None else self.char
298+
if self.code == "u" and 0 <= char < 128:
299+
ascii = chr(char)
300+
dom_code = ASCII_PRINTABLE_TO_DOM_CODE.get(ascii)
301+
if dom_code is not None:
302+
return dom_code
303+
functional_key = CSI_TO_FUNCTIONAL_KEY.get((self.code, char))
304+
if functional_key is None:
305+
return None
306+
return FUNCTIONAL_KEY_TO_DOM_CODE.get(functional_key, None)
301307

302308
def to_prompt_toolkit_key(self) -> PromptToolkitKeys | str:
303309
ctrl = "Control" if Modifiers.ctrl in self.modifiers else ""
@@ -327,11 +333,11 @@ def to_prompt_toolkit_key_press(self) -> KeyPress | None:
327333
class KeyboardProtocolParser(Vt100Parser):
328334
def __init__(self, vt100_input: Vt100Parser) -> None:
329335
super().__init__(vt100_input.feed_key_callback)
330-
self.pressed: set[Keys] = set()
336+
self.pressed: set[DomCode] = set()
331337
self.ansi_escape_code_parser = parse_ansi_escape_code()
332338
assert not next(self.ansi_escape_code_parser)
333339

334-
def get_pressed(self) -> set[Keys]:
340+
def get_pressed(self) -> set[DomCode]:
335341
return self.pressed
336342

337343
def feed(self, data: str) -> None:
@@ -447,7 +453,7 @@ def _handle_event(self, event: KeyboardProtocolEvent) -> None:
447453
@contextmanager
448454
def keyboard_protocol_key_pressed_context(
449455
app_session: AppSession,
450-
) -> Iterator[Callable[[], set[Keys]]]:
456+
) -> Iterator[Callable[[], set[DomCode]]]:
451457
app_session.output.write_raw("\033[>31u")
452458
app_session.output.flush()
453459
if sys.platform == "win32":

0 commit comments

Comments
 (0)