From bd34f4c068cff7c38ab73e01ca878431e54c3ac4 Mon Sep 17 00:00:00 2001 From: Danny Trunk Date: Sun, 29 Mar 2026 14:31:06 +0200 Subject: [PATCH] fix: destroy solaar-keyboard uinput device when no receiver is connected When a Logitech receiver is disconnected, tear down the uinput device so GNOME/mutter no longer detects a virtual pointer, allowing touch mode and the on-screen keyboard to activate correctly. --- lib/logitech_receiver/diversion.py | 14 ++++++++++++++ lib/solaar/ui/__init__.py | 3 +++ 2 files changed, 17 insertions(+) diff --git a/lib/logitech_receiver/diversion.py b/lib/logitech_receiver/diversion.py index e933f5ad..32069a12 100644 --- a/lib/logitech_receiver/diversion.py +++ b/lib/logitech_receiver/diversion.py @@ -268,6 +268,20 @@ def setup_uinput(): logger.warning("cannot create uinput device: %s", e) +def teardown_uinput(): + global udevice + if udevice is None: + return + try: + udevice.close() + if logger.isEnabledFor(logging.INFO): + logger.info("uinput device closed") + except Exception as e: + logger.warning("cannot close uinput device: %s", e) + finally: + udevice = None + + def kbdgroup(): if xkb_setup(): state = XkbStateRec() diff --git a/lib/solaar/ui/__init__.py b/lib/solaar/ui/__init__.py index d3cc8136..3602fcd1 100644 --- a/lib/solaar/ui/__init__.py +++ b/lib/solaar/ui/__init__.py @@ -23,6 +23,7 @@ from typing import Callable import gi import yaml +from logitech_receiver import diversion from logitech_receiver.common import Alert from solaar.i18n import _ @@ -130,6 +131,8 @@ def _status_changed(device, alert, reason, refresh=False): alert = Alert.NONE tray.update(device) + if device.kind is None and not tray._devices_info: + diversion.teardown_uinput() if alert & Alert.ATTENTION: tray.attention(reason)