refactor: convert hotkey module to package with evdev backend

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Vitali Graf
2026-04-08 10:28:52 +02:00
parent 5c8eecbb8b
commit f9bc2204c7
3 changed files with 32 additions and 9 deletions
+24
View File
@@ -0,0 +1,24 @@
"""Hotkey-Listener — plattformspezifische Backends hinter gemeinsamem Interface."""
import sys
from typing import Callable, Coroutine, Protocol, runtime_checkable
AsyncCallback = Callable[[], Coroutine]
@runtime_checkable
class HotkeyListener(Protocol):
on_press: AsyncCallback | None
on_release: AsyncCallback | None
async def listen(self) -> None: ...
def create_listener(key_name: str = "KEY_F12") -> HotkeyListener:
"""Erstellt den plattformspezifischen HotkeyListener."""
if sys.platform == "linux":
from whisper_local.hotkey._evdev import EvdevHotkeyListener
return EvdevHotkeyListener(key_name)
else:
from whisper_local.hotkey._pynput import PynputHotkeyListener
return PynputHotkeyListener(key_name)
@@ -1,16 +1,14 @@
"""Hotkey-Listener via evdev für Push-to-Talk."""
"""Hotkey-Listener via evdev für Push-to-Talk (Linux)."""
import asyncio
import logging
from pathlib import Path
from typing import Callable, Coroutine
import evdev
from evdev import InputDevice, categorize, ecodes
logger = logging.getLogger(__name__)
from whisper_local.hotkey import AsyncCallback
AsyncCallback = Callable[[], Coroutine]
logger = logging.getLogger(__name__)
def find_keyboard_devices(key_name: str) -> list[InputDevice]:
@@ -31,7 +29,7 @@ def find_keyboard_devices(key_name: str) -> list[InputDevice]:
return matches
class HotkeyListener:
class EvdevHotkeyListener:
def __init__(self, key_name: str = "KEY_F12"):
self.key_name = key_name
self.key_code = ecodes.ecodes.get(key_name)