diff --git a/kvmd/apps/kvmd/api/hid.py b/kvmd/apps/kvmd/api/hid.py index d67fd0ff..858ddad5 100644 --- a/kvmd/apps/kvmd/api/hid.py +++ b/kvmd/apps/kvmd/api/hid.py @@ -23,6 +23,7 @@ import os import stat import functools +import itertools import struct from typing import Iterable @@ -47,6 +48,7 @@ from ....plugins.hid import BaseHid from ....validators import raise_error from ....validators.basic import valid_bool from ....validators.basic import valid_int_f0 +from ....validators.basic import valid_string_list from ....validators.os import valid_printable_filename from ....validators.hid import valid_hid_keyboard_output from ....validators.hid import valid_hid_mouse_output @@ -256,6 +258,19 @@ class HidApi: # ===== + @exposed_http("POST", "/hid/events/send_shortcut") + async def __events_send_shortcut_handler(self, req: Request) -> Response: + shortcut = valid_string_list(req.query.get("keys"), subval=valid_hid_key) + if shortcut: + press = [WEB_TO_EVDEV[key] for key in shortcut] + release = list(reversed(press)) + seq = [ + *zip(press, itertools.repeat(True)), + *zip(release, itertools.repeat(False)), + ] + await self.__hid.send_key_events(seq, no_ignore_keys=True, slow=True) + return make_json_response() + @exposed_http("POST", "/hid/events/send_key") async def __events_send_key_handler(self, req: Request) -> Response: key = WEB_TO_EVDEV[valid_hid_key(req.query.get("key"))]