Bildschirmsperre in Shell/C++ erkennen

Bildschirmsperre in Shell/C++ erkennen

Ich habe eine plattformübergreifende Anwendung, die unter Ubuntu 14.04 (GNOME) läuft. Dort muss ich feststellen, ob der Bildschirmschoner aktiv ist oder nicht und ob der Bildschirm gesperrt ist oder nicht.

Ich habe herausgefunden, dass ich die Bildschirmschonerinformationen wie folgt abrufen kann:gnome-screensaver-command -q

Aber ich kann einfach nicht herausfinden, wie ich eine Bildschirmsperre erkennen kann. Unter Unity kann ich beispielsweise Folgendes verwenden:

gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked

aber das ist ein Unity-spezifisches Element. Also, irgendwelche Ideen, wie man diese Informationen auf Gnome-Rechnern bekommt?

Antwort1

Habe herausgefunden, dass /org/gnome/SessionManager/Presence den aktuellen Status der Benutzersitzung enthält.

Es kann folgendermaßen aufgerufen werden:

gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get /org/gnome/SessionManager/Presence status

Schneller Bash-Test:

#!/bin/bash
while true; do
 echo "PRESENCE "
gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get /org/gnome/SessionManager/Presence status
        echo -e "\n"
        sleep 1
done

Beispielsweise in Qt:

QProcess process;
process.start("sh", QStringList() << "-c"<< "gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get /org/gnome/SessionManager/Presence status");
process.waitForFinished();
result = QString::fromLatin1(process.readAllStandardOutput());
int state = result.remove("(<uint32 ").remove(">,)").toInt();
if(state != 0) {
    // user not active!
}

Antwort2

Die obige Antwort gibt unter Ubuntu 18.04 einen Fehler zurück, da der Aufruf Punkte statt Schrägstriche verlangt. Einschließlich Fehlerausgabe für zukünftige Suchvorgänge:

Fehler beim Aufruf:

$ gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get /org/gnome/SessionManager/Presence ss
Error: GDBus.Error:org.freedesktop.DBus.Error.InvalidArgs: No such interface '/org/gnome/SessionManager/Presence'
(According to introspection data, you need to pass 'ss')

Beispiel einer funktionierenden Syntax:

$ gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get org.gnome.SessionManager.Presence status
(<uint32 0>,)

Ausgabe bei Sperrung:

$ sleep 10; gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get org.gnome.SessionManager.Presence status
(<uint32 3>,)

Dokumentationhttps://people.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Presence

verwandte Informationen