43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
"""Модуль 5: hotkeys — клавиши управления (событийные бэкенды).
|
|
|
|
Использование:
|
|
|
|
from modules.hotkeys import KeyEvents, get_backend
|
|
|
|
events = KeyEvents(on_talk_down=..., on_talk_up=..., on_stop=...,
|
|
on_repeat=..., on_quit=...)
|
|
backend = get_backend("console", events) # или "keys" (Windows / root-Linux)
|
|
backend.start()
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
from .base import KeyEvents
|
|
from .console import ConsoleBackend
|
|
from .keyboard_hook import KeyboardHookBackend
|
|
|
|
__all__ = ["KeyEvents", "ConsoleBackend", "KeyboardHookBackend", "get_backend"]
|
|
|
|
_BACKENDS = {
|
|
ConsoleBackend.name: ConsoleBackend,
|
|
KeyboardHookBackend.name: KeyboardHookBackend,
|
|
}
|
|
|
|
|
|
def get_backend(name: str, events: KeyEvents, **kwargs):
|
|
"""Фабрика бэкендов клавиш."""
|
|
if name == KeyboardHookBackend.name:
|
|
# Клавиши можно переопределить через переменные окружения/.env:
|
|
# HOTKEY_DIALOG (пробел-тумблер), HOTKEY_TALK, HOTKEY_STOP, HOTKEY_REPEAT
|
|
kwargs.setdefault("dialog", os.environ.get("HOTKEY_DIALOG", "space"))
|
|
kwargs.setdefault("talk", os.environ.get("HOTKEY_TALK", "num 0"))
|
|
kwargs.setdefault("stop_key", os.environ.get("HOTKEY_STOP", "esc"))
|
|
kwargs.setdefault("repeat", os.environ.get("HOTKEY_REPEAT", "enter"))
|
|
try:
|
|
backend_cls = _BACKENDS[name]
|
|
except KeyError:
|
|
raise ValueError(
|
|
f"Неизвестный бэкенд клавиш: {name!r}. Доступны: {sorted(_BACKENDS)}"
|
|
) from None
|
|
return backend_cls(events, **kwargs) |