pikvm/pikvm#1563, pikvm/pikvm#1564: Customizable /api/hid/print delay

This commit is contained in:
Maxim Devaev
2025-07-28 21:00:32 +03:00
parent dc7f38a1b6
commit 9b5b6f6152
6 changed files with 38 additions and 18 deletions

View File

@@ -47,6 +47,7 @@ from ....plugins.hid import BaseHid
from ....validators import raise_error
from ....validators.basic import valid_bool
from ....validators.basic import valid_number
from ....validators.basic import valid_int_f0
from ....validators.basic import valid_string_list
from ....validators.os import valid_printable_filename
@@ -134,7 +135,18 @@ class HidApi:
text = text[:limit]
symmap = self.__ensure_symmap(req.query.get("keymap", self.__default_keymap_name))
slow = valid_bool(req.query.get("slow", False))
await self.__hid.send_key_events(text_to_evdev_keys(text, symmap), no_ignore_keys=True, slow=slow)
delay = float(valid_number(
arg=req.query.get("delay", (0.02 if slow else 0)),
min=0,
max=5,
type=float,
name="keys delay",
))
await self.__hid.send_key_events(
keys=text_to_evdev_keys(text, symmap),
no_ignore_keys=True,
delay=delay,
)
return make_json_response()
def __ensure_symmap(self, keymap_name: str) -> dict[int, dict[int, int]]:
@@ -273,7 +285,7 @@ class HidApi:
*zip(press, itertools.repeat(True)),
*zip(release, itertools.repeat(False)),
]
await self.__hid.send_key_events(seq, no_ignore_keys=True, slow=True)
await self.__hid.send_key_events(seq, no_ignore_keys=True, delay=0.05)
return make_json_response()
@exposed_http("POST", "/hid/events/send_key")

View File

@@ -152,13 +152,13 @@ class BaseHid(BasePlugin): # pylint: disable=too-many-instance-attributes
self,
keys: Iterable[tuple[int, bool]],
no_ignore_keys: bool=False,
slow: bool=False,
delay: float=0.0,
) -> None:
for (key, state) in keys:
if no_ignore_keys or key not in self.__ignore_keys:
if slow:
await asyncio.sleep(0.02)
if delay > 0:
await asyncio.sleep(delay)
self.send_key_event(key, state, False)
def send_key_event(self, key: int, state: bool, finish: bool) -> None: