idb/common/hid.py (166 lines of code) (raw):
#!/usr/bin/env python3
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
from typing import AsyncIterator, Dict, Iterable, List, Optional, Tuple
from idb.common.types import (
HIDButton,
HIDButtonType,
HIDDelay,
HIDDirection,
HIDEvent,
HIDKey,
HIDPress,
HIDPressAction,
HIDSwipe,
HIDTouch,
Point,
)
def tap_to_events(
x: float, y: float, duration: Optional[float] = None
) -> List[HIDEvent]:
return _press_with_duration(HIDTouch(point=Point(x=x, y=y)), duration=duration)
def button_press_to_events(
button: HIDButtonType, duration: Optional[float] = None
) -> List[HIDEvent]:
return _press_with_duration(HIDButton(button=button), duration=duration)
def key_press_to_events(
keycode: int, duration: Optional[float] = None
) -> List[HIDEvent]:
return _press_with_duration(HIDKey(keycode=keycode), duration=duration)
def _press_with_duration(
action: HIDPressAction, duration: Optional[float] = None
) -> List[HIDEvent]:
events = []
events.append(HIDPress(action=action, direction=HIDDirection.DOWN))
if duration:
events.append(HIDDelay(duration=duration))
events.append(HIDPress(action=action, direction=HIDDirection.UP))
return events
def swipe_to_events(
p_start: Tuple[float, float],
p_end: Tuple[float, float],
duration: Optional[float] = None,
delta: Optional[float] = None,
) -> List[HIDEvent]:
start = Point(x=p_start[0], y=p_start[1])
end = Point(x=p_end[0], y=p_end[1])
return [HIDSwipe(start=start, end=end, delta=delta, duration=duration)]
def _key_down_event(keycode: int) -> HIDEvent:
return HIDPress(action=HIDKey(keycode=keycode), direction=HIDDirection.DOWN)
def _key_up_event(keycode: int) -> HIDEvent:
return HIDPress(action=HIDKey(keycode=keycode), direction=HIDDirection.UP)
def key_press_shifted_to_events(keycode: int) -> List[HIDEvent]:
return [
_key_down_event(225),
_key_down_event(keycode),
_key_up_event(keycode),
_key_up_event(225),
]
KEY_MAP: Dict[str, List[HIDEvent]] = {
"a": key_press_to_events(4),
"b": key_press_to_events(5),
"c": key_press_to_events(6),
"d": key_press_to_events(7),
"e": key_press_to_events(8),
"f": key_press_to_events(9),
"g": key_press_to_events(10),
"h": key_press_to_events(11),
"i": key_press_to_events(12),
"j": key_press_to_events(13),
"k": key_press_to_events(14),
"l": key_press_to_events(15),
"m": key_press_to_events(16),
"n": key_press_to_events(17),
"o": key_press_to_events(18),
"p": key_press_to_events(19),
"q": key_press_to_events(20),
"r": key_press_to_events(21),
"s": key_press_to_events(22),
"t": key_press_to_events(23),
"u": key_press_to_events(24),
"v": key_press_to_events(25),
"w": key_press_to_events(26),
"x": key_press_to_events(27),
"y": key_press_to_events(28),
"z": key_press_to_events(29),
"A": key_press_shifted_to_events(4),
"B": key_press_shifted_to_events(5),
"C": key_press_shifted_to_events(6),
"D": key_press_shifted_to_events(7),
"E": key_press_shifted_to_events(8),
"F": key_press_shifted_to_events(9),
"G": key_press_shifted_to_events(10),
"H": key_press_shifted_to_events(11),
"I": key_press_shifted_to_events(12),
"J": key_press_shifted_to_events(13),
"K": key_press_shifted_to_events(14),
"L": key_press_shifted_to_events(15),
"M": key_press_shifted_to_events(16),
"N": key_press_shifted_to_events(17),
"O": key_press_shifted_to_events(18),
"P": key_press_shifted_to_events(19),
"Q": key_press_shifted_to_events(20),
"R": key_press_shifted_to_events(21),
"S": key_press_shifted_to_events(22),
"T": key_press_shifted_to_events(23),
"U": key_press_shifted_to_events(24),
"V": key_press_shifted_to_events(25),
"W": key_press_shifted_to_events(26),
"X": key_press_shifted_to_events(27),
"Y": key_press_shifted_to_events(28),
"Z": key_press_shifted_to_events(29),
"1": key_press_to_events(30),
"2": key_press_to_events(31),
"3": key_press_to_events(32),
"4": key_press_to_events(33),
"5": key_press_to_events(34),
"6": key_press_to_events(35),
"7": key_press_to_events(36),
"8": key_press_to_events(37),
"9": key_press_to_events(38),
"0": key_press_to_events(39),
"\n": key_press_to_events(40),
";": key_press_to_events(51),
"=": key_press_to_events(46),
",": key_press_to_events(54),
"-": key_press_to_events(45),
".": key_press_to_events(55),
"/": key_press_to_events(56),
"`": key_press_to_events(53),
"[": key_press_to_events(47),
"\\": key_press_to_events(49),
"]": key_press_to_events(48),
"'": key_press_to_events(52),
" ": key_press_to_events(44),
"!": key_press_shifted_to_events(30),
"@": key_press_shifted_to_events(31),
"#": key_press_shifted_to_events(32),
"$": key_press_shifted_to_events(33),
"%": key_press_shifted_to_events(34),
"^": key_press_shifted_to_events(35),
"&": key_press_shifted_to_events(36),
"*": key_press_shifted_to_events(37),
"(": key_press_shifted_to_events(38),
")": key_press_shifted_to_events(39),
"_": key_press_shifted_to_events(45),
"+": key_press_shifted_to_events(46),
"{": key_press_shifted_to_events(47),
"}": key_press_shifted_to_events(48),
":": key_press_shifted_to_events(51),
'"': key_press_shifted_to_events(52),
"|": key_press_shifted_to_events(49),
"<": key_press_shifted_to_events(54),
">": key_press_shifted_to_events(55),
"?": key_press_shifted_to_events(56),
"~": key_press_shifted_to_events(53),
}
def text_to_events(text: str) -> List[HIDEvent]:
events = []
for character in text:
if character in KEY_MAP:
events.extend(KEY_MAP[character])
else:
raise Exception(f"No keycode found for {character}")
return events
async def iterator_to_async_iterator(
events: Iterable[HIDEvent],
) -> AsyncIterator[HIDEvent]:
for event in events:
yield event