qdbus / qdbus6
Der "Zauber" passiert mittels qdbus bzw. qdbus6, mit dem man unter KDE verschiedenste Dinge tun kann. Alles nicht auf den ersten Blick klar, aber wir brauchen hier nur wenig davon.
Bei mir in Solus heißt der Befehl qdbus6 in Abgrenzung zur qt5-Variante qdbus(5). Unter Debian ist es wohl qdbus (ohne 6). Das müsst ihr entsprechend eurer Distribution anpassen.
Liste an Geräten abrufen
Folgender Befehl ruft eine Liste an allen vorhandenen Geräten ab, über die KDE Kenntnis hat.
qdbus org.kde.KWin /org/kde/KWin/InputDevice org.freedesktop.DBus.Properties.Get org.kde.KWin.InputDeviceManager devicesSysNames
Erklärung:
- org.kde.KWin - wir möchten mit KWin, dem KDE Window Manager bzw. Wayland Compositor reden.
- /org/kde/KWin/InputDevice - wir suchen darin alle Eingabegeräte.
- org.freedesktop.DBus.Properties.Get - wichtig ist das "Get", d.h. wir holen uns Informationen.
- org.kde.KWin.InputDeviceManager devicesSysNames - das ist eine nur-lesbare Liste an Strings:
property read QStringList org.kde.KWin.InputDeviceManager.devicesSysNames
Es kann sich lohnen, Teile des Befehls mal weg zu lassen und zu schauen, was alles angeboten wird, wenn ihr mal schauen wollt.
Damit bekommen wir eine Liste an Events, die uns aber noch nichts sagen:
event4
event0
event1
...
Wir müssen schon wissen, was die einzelnen Geräte sind. Touchpad? Tastatur? Touchscreen? Wir fragen das also ab. Für das event0 sieht das so aus:
qdbus org.kde.KWin /org/kde/KWin/InputDevice/event0 org.freedesktop.DBus.Properties.Get org.kde.KWin.InputDevice name
Erklärung
- org.kde.KWin - wir reden wieder mit KWin.
- /org/kde/KWin/InputDevice/event0 - Abfrage geht an das Objekt event0.
- org.freedesktop.DBus.Properties.Get - Wir holen wieder einen Wert.
- org.kde.KWin.InputDevice name - Wir fragen den Namen des Eingabegeräts ab.
Das Ergebnis sieht dann (bei mir) so aus:
~$ qdbus org.kde.KWin /org/kde/KWin/InputDevice/event0 org.freedesktop.DBus.Properties.Get org.kde.KWin.InputDevice name
Lid Switch
Aha, das ist also der "Deckel" des Laptops.
In einem Skript kann man das zusammensetzen, sodass für jedes Eingabegerät in einer Liste der jeweilige "Name" also Funktion ausgegeben wird. Das ist original von Amine Hassane und tut noch mehr. Ich habe es hier gekürzt auf das, was uns interessiert. Das Gesamt-Skript findet ihr in den Quellen.
#!/usr/bin/env bash
SERVICE="org.kde.KWin"
DBUS_PATH="/org/kde/KWin/InputDevice"
INTERFACE="org.kde.KWin.InputDevice"
METHOD_GET="org.freedesktop.DBus.Properties.Get"
find_devices() {
local DM_INTERFACE="org.kde.KWin.InputDeviceManager"
local DM_PROPERTY="devicesSysNames"
for sysname in $(qdbus "$SERVICE" "$DBUS_PATH" "$METHOD_GET" "$DM_INTERFACE" "$DM_PROPERTY" | sort); do
name=$(qdbus "$SERVICE" "${DBUS_PATH}/${sysname}" "$METHOD_GET" "$INTERFACE" name)
echo -e "$sysname \t $name"
done
}
find_devices
Bei mir sieht das Ergebnis so aus:
event0 Lid Switch
event1 Power Button
event2 Sleep Button
event3 AT Translated Set 2 keyboard
event4 Video Bus
event5 XXXX0000:05 0911:5288 Touchpad
event6 Intel HID events
event7 Intel HID 5 button array
event8 Goodix Capacitive TouchScreen
Spannend sind für ich die Tastatur event3 und das Touchpad event5.
(De-)Aktivieren von events
Über qdbus kann ich einzelne Eingabegeräte aus- bzw. einschalten, wenn ich die Events kenne. Das sieht für das event3 so aus:
/usr/bin/qdbus org.kde.KWin /org/kde/KWin/InputDevice/event3 org.freedesktop.DBus.Properties.Set org.kde.KWin.InputDevice enabled false
Erklärung:
- org.kde.KWin - Wiedermals reden wir mit KWin.
- /org/kde/KWin/InputDevice/event3 - Wir sprechen das Objekt event3 an. Nach Liste oben ist das bei mir die Tastatur.
- org.freedesktop.DBus.Properties.Set - Wir wollen einen Wert setzen. Bisher haben wir ja nur welche eingeholt.
- org.kde.KWin.InputDevice enabled false - Es geht um das Eingabegerät, wobei wir den Wert der Variable "enabled" mit false (oder true) setzen wollen.
Skript zum (De-)Aktivieren
#!/usr/bin/bash
SERVICE="org.kde.KWin"
DBUS_PATH="/org/kde/KWin/InputDevice"
INTERFACE="org.kde.KWin.InputDevice"
METHOD_GET="org.freedesktop.DBus.Properties.Get"
METHOD_SET="org.freedesktop.DBus.Properties.Set"
PROPERTY="enabled"
DBUS="/usr/bin/qdbus"
# Liste an Geräten:
devices=(3 5)
for device in "${devices[@]}"; do
# Pfad zum Gerät:
PATH="${DBUS_PATH}/event$device"
# Hole Zustand des Geräts (false oder true)
status=$($DBUS "$SERVICE" "$PATH" "$METHOD_GET" "$INTERFACE" "$PROPERTY")
# Wechsele den Zustand, außer es wird "enable" als Argument mitgegeben, sodass dann immer aktiviert wird.
if [ "$1" = "enable" ]; then
status=true
else
status=$([[ "$status" == "false" ]] && echo true || echo false)
fi
# Neuen Zustand setzen:
$DBUS "$SERVICE" "$PATH" "$METHOD_SET" "$INTERFACE" "$PROPERTY" "$status"
done
Dieses Skript habe ich mir als "Starter" ins Startmenü bzw. als Knopf in die KDE control station, sodass ich das schnel togglen kann.
Fehler und Optimierungsbedarf:
- Aus mir unbekannten Gründen musste ich bei diesem Skript den Pfad zu qdbus6 explizit angeben. Ich bin dankbar für sachdienliche Hinweise, warum...
- Ich habe das Phänomen bemerkt, dass "Touch to Click" beim Touchpad teilweise nicht mehr funktioniert, wenn ich mittels Skript umschalte.
- Man muss manuell ein mal herausfinden, was die zu blockierenden Geräte-IDs sind, weil diese sich von Gerät zu Gerät unterscheiden. Auf der anderen Seite ist das aber auch schwer zu bewerkstelligen, weil nicht jeder will ja "alles" gesperrt bzw. aktiviert haben. Vielleicht will man auch nur das Touchpad (de-)aktivieren?
- Es kann sich lohnen, das Skript mit "enable" beim Herunterfahren auszuführen, sodass beim nächsten Hochfahren alles aktiviert ist. Dafür geht ihr in die Systemeinstellungen -> Autostart -> Neue Hinzufügen -> Abmeldungsskript und fügt dort das Skript ein.
Fazit
qdbus ist ein interessantes Werkzeug, mit dem man auf der anderen Seite aber auch wieder viel kaputt machen kann. Ein mal deaktivierte Tastatur bleibt (bis nach Neustart oder sogar darüber hinweg) deaktiviert. Man sollte also beim Testen vorsichtig sein und eine zweite Tastatur oder so zur Hand haben.
Quellen:
- Skript von Amine Hassane https://gist.github.com/Sporif/0e52e4b0eaf071cfbf19f3381ba3d65a
- QDBUS im Arch Wiki
- KDE: Chapter 4. Scripting Konsole
- KDE Scripting Tutorial
- KWin Scripting API
- Qt-Dokumentation zu Qt D-BUS
- DBUS in Qt-Applikationen abrufen
Titelbild: Mit Inkscape und Breeze icons erstellt (copyright KDE and licenced under the GNU LGPL version 3 or later).


Dann hat Cachyos vielleicht eine Tastenkombination für solch ein Skript. Denn mitten im Spiel ließ sich heute der Mauszeiger nicht bewegen. Maustasten funktionierten. Nach einem Neustart funktionierte wieder alles. Danke für die Inspiration zur Fehlersuche!
Das kann natürlich sein, wäre aber eher untypisch. Warum sollte sowas vom OS deaktiviert werden? Hast du einen Touchscreen?
Aber freut mich, dass ich dir eine Inspiration geliefert habe.
gibst sowas entliches für gtk welt auch
gibst so möglichkeit ah gtk welt cinamone mate oder xfce
Mir ist zwar nichts bekannt, aber da ich keinen GTK-basierten Desktop einsetze, kann ich dir das leider nicht beantworten. Ich habe nur KDE und LXQt. Tut mir leid.
Vielleicht gibt es etwas in "dconf" oder im "gnome/cinnamon settings deamon".
So ein "(C/K)onvertible" oder "KDE" habe ich leider nicht, aber gilt das so –weil Du es ja neben KDE verwendest– auch für LXQt? Selber habe ich LXDE und LXQt, und das Touchpad kann ich jederzeit auch mit
FN+F7deaktivieren.Hingegen war unter Debian bei Neuinstallationen (und X) das sogenannte 'Tapping' erst noch händisch zu aktivieren, und zwar in /usr/share/X11/xorg.conf.d/40-libinput.conf über...
Die obige Methode funktioniert mit KWin unter Wayland und vmtl auch unter X11. Wie das bei anderen Desktops bzw Compositors oder unter X11 läuft, weiß ich nicht. LXQt Wayland kann ich mal bei Gelegenheit nachschauen, aber andere Desktops habe ich nicht zur Verfügung aktuell.
Vielen Dank für diesen Artikel. Ich habe bei meinem Yoga tatsächlich das Problem, dass beim Umklappen Tastatur und Touchscreen deaktiviert werden, aber beim Zurückklappen inaktiv bleiben. Ich mutmaße mal, dass es hier in systemd auch irgendwo Events gibt. Da muss ich mal auf die Suche gehen…