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