Linux - DBus (Desktop-Bus)

  Claudia Fischering   Lesezeit: 4 Minuten Auf Mastodon ansehen

D-Bus (Desktop Bus) organisiert unter Linux die Inter-Programm-Kommunikation. Services können Daten austauschen oder Benachrichtigungen senden. Zudem kann es Signale in Echtzeit verarbeiten.

linux - dbus (desktop-bus)

Grund für diesen Artikel

Bei diesem Artikel GNOME: Keine Übersicht beim Starten - Nachtrag über Overview-Ansicht habe ich einen Kommentar hinterlassen, der aber nicht korrekt angezeigt wurde. Deswegen wurde der Kommentar zu einem Nachtrag. Ich möchte deswegen in diesem Artikel die Funktionsweise etwas beschreiben und zum Schluss eine effizientere Variante als Lösung vorschlagen, weil diese keine CPU-Auslastung hat, als das Bash-Skript, wie folgende Bilder es zeigen.

(Bildbeschreibung 01: Bash Skript mit einer Schleife - 50 mal 0,1 Millisekunde gleich 5 Sekunden - aktiv ist)

(Bildbeschreibung 02: Python Skript mit einem DBus-Proxy registriert sich einmalig und wartet auf ein Signal)

Funktionsweise von DBus-Send

Im Grossen und Ganzen ist es ein vereinfachtes System, womit Anwendungen ihre Daten bzw. Signale austauschen können.

Abfrage - aktuellen Wert herausfinden

Folgender Linux-Befehl:

dbus-send --print-reply=literal --session --dest=org.gnome.Shell --type=method_call /org/gnome/Shell org.freedesktop.DBus.Properties.Get string:org.gnome.Shell string:OverviewActive

gibt Folgendes aus: `variant boolean false`. Damit wissen wir nun, dass die Overview-Ansicht nicht aktiv ist. Wäre sie aktiv, würde variant boolean true dort stehen.

Aktion - Umschalten eines Wahrheitswertes (Schließen)

Sofern es aktiv ist, nutzen wir folgenden Linux-Befehl:

/usr/bin/dbus-send --session --dest=org.gnome.Shell --type=method_call /org/gnome/Shell org.freedesktop.DBus.Properties.Set string:org.gnome.Shell string:OverviewActive variant:boolean:false

um dem Programm zu signalisieren, dass es doch bitte die Overview-Ansicht schließen soll.

Aktion - Umschalten eines Wahrheitswertes (Öffnen)

Als kleines Experiment könnte man den Wahrheitswert von false auf true setzen, wie es mit folgendem Linux-Befehl:

/usr/bin/dbus-send --session --dest=org.gnome.Shell --type=method_call /org/gnome/Shell org.freedesktop.DBus.Properties.Set string:org.gnome.Shell string:OverviewActive variant:boolean:true

gemacht wurde, um die Overview-Ansicht zu öffnen, anstatt die Windows-Taste zu drücken.

Effizientere Variante per Python Skript

Man erstellt zwei Dateien:

  • no-overview-at-startup.py (könnt ihr speichern, wo ihr wollt)
  • no-overview-at-startup.desktop (gehört in ~/.config/autostart)

Das Python-Skript sieht so aus:

#!/usr/bin/env python3

# Wichtige importe von Bibliotheken
import sys
from gi.repository import Gio, GLib

# Definition von globalen Variablen
# Explizit für Overview-Ansicht

BUS_NAME = "org.gnome.Shell"
OBJECT_PATH = "/org/gnome/Shell"
INTERFACE = "org.gnome.Shell"
PROPERTY = "OverviewActive"

loop = GLib.MainLoop()

# Funktion zum deaktivieren der Overview-Ansicht
def disable_overview(proxy):
    try:
        proxy.set_cached_property(
            PROPERTY,
            GLib.Variant("b", False)
        )
        # Der eigentliche Aufruf, wie wir es vorher oben beschrieben hatten.
        # Nur das es ein wenig Angepasst werden muss, damit man es per Python ausführen kann.
        proxy.call_sync(
            "org.freedesktop.DBus.Properties.Set",
            GLib.Variant(
                "(ssv)",
                (
                    INTERFACE,
                    PROPERTY,
                    GLib.Variant("b", False),
                ),
            ),
            Gio.DBusCallFlags.NONE,
            -1,
            None,
        )
    except Exception as e:
        # Bei einem Fehler würden wir folgenden Fehler bekommen.
        print(f"Failed to disable Overview: {e}", file=sys.stderr)

    loop.quit()

# Dies ist unsere Überwachungsfunktion, die die Wertänderung war nimmt
def properties_changed(proxy, changed_properties, invalidated_properties):
    value = changed_properties.lookup_value(PROPERTY, None)

    if value is not None and value.get_boolean():
        disable_overview(proxy)

# Es wird versucht ein proxy einzurichten, damit wir später die Überwachung setzen können
try:
    proxy = Gio.DBusProxy.new_for_bus_sync(
        Gio.BusType.SESSION,
        Gio.DBusProxyFlags.NONE,
        None,
        BUS_NAME,
        OBJECT_PATH,
        INTERFACE,
        None,
    )
except Exception as e:
    # Sollte es nicht möglich sein einen Proxy zu erstellen, dann würde man folgenden Fehler bekommen.
    # Dann würde auch das Python-Skript sich sofort beenden.
    print(f"Could not connect to GNOME Shell: {e}", file=sys.stderr)
    sys.exit(1)

# Proxy Erstellung war erfolgreich nun können wir unsere Überwachung mit dem Proxy verbinden.
proxy.connect("g-properties-changed", properties_changed)

# Aktuellen wert abfragen von unseren Overview-Ansicht, ob es False oder True ist.
current = proxy.get_cached_property(PROPERTY)

# Sofern wir einen Wahrheitswert haben und dieser auch True ist, dann ruft man die Funktion disable_overview(...) auf
# ansonsten lass uns warten bis das Signal kommt. Anscheinend war man zu schnell und nun muss man warten mit loop.run().
if current is not None and current.get_boolean():
    disable_overview(proxy)
else:
    loop.run()

Dann macht ihr diese Datei ausführbar (entweder im Dateimanager oder via chmod 755 [pfad/dateiname]).

Und hier ist die Desktop-Datei zur Vollständigkeit:

[Desktop Entry]
Type=Application
Exec=/home/ralf/dev/no-overview-at-startup/no-overview-at-startup.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=No Overview at Start-up
Name[de_DE]=Keine Overview-Ansicht beim Systemstart
Name=No Overview at Start-up
Comment[en_US]=Disable overview mode right after login
Comment[de_DE]=Keine Overview-Ansicht beim Systemstart
Comment=Disable overview mode right after login

Bitte beachtet, dass hinter Exec= der korrekte Pfad zu eurer no-overview-at-startup.sh steht. Falls installiert, könnt ihr die Erweiterung No-Overview abschalten, die Session neu starten und schauen, ob der Overview-Modus ausbleibt.

Ich habe mir hier mal erlaubt, die Anleitung von Ralf zu nutzen, weil die schöner beschrieben war, als die meinige.

Titelbild und Bilder: Selbsterstellt

Quellen:
[1] - Meine Gehirnzellen
[2] - Bild 01 und 02 Screenshots (selbsterstellt)

Tags

Linux, DBus, Python

Es wurden noch keine Kommentare verfasst, sei der erste!