fix: EvdevHotkeyListener.stop() cancelt Tasks und schließt Devices

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-11 21:21:57 +02:00
parent 107508eeb9
commit d780960381
2 changed files with 49 additions and 6 deletions
+16 -6
View File
@@ -37,6 +37,8 @@ class EvdevHotkeyListener:
raise ValueError(f"Unbekannter Key-Name: {key_name}")
self.on_press: AsyncCallback | None = None
self.on_release: AsyncCallback | None = None
self._tasks: list[asyncio.Task] = []
self._devices: list[InputDevice] = []
async def _handle_key_event(self, key_down: bool) -> None:
"""Ruft den passenden Callback auf."""
@@ -57,13 +59,21 @@ class EvdevHotkeyListener:
await self._handle_key_event(key_down=False)
def stop(self) -> None:
"""Stub — evdev-Listener läuft bis zum Prozessende."""
pass
"""Cancelt laufende Read-Tasks und schließt Devices."""
for task in self._tasks:
task.cancel()
for dev in self._devices:
try:
dev.close()
except Exception:
pass
self._tasks = []
self._devices = []
async def listen(self) -> None:
"""Lauscht auf evdev-Events der konfigurierten Taste auf allen passenden Devices."""
devices = find_keyboard_devices(self.key_name)
for dev in devices:
self._devices = find_keyboard_devices(self.key_name)
for dev in self._devices:
logger.info("Lausche auf %s auf %s (%s)", self.key_name, dev.name, dev.path)
tasks = [asyncio.create_task(self._read_device(dev)) for dev in devices]
await asyncio.gather(*tasks)
self._tasks = [asyncio.create_task(self._read_device(dev)) for dev in self._devices]
await asyncio.gather(*self._tasks, return_exceptions=True)