Обнаружение блокировки экрана в shell/c++

Обнаружение блокировки экрана в shell/c++

У меня есть кроссплатформенное приложение, работающее на Ubuntu 14.04 (GNOME). Там мне нужно определить, активен ли скринсейвер или нет, и заблокирован ли экран или нет.

Я обнаружил, что информацию о заставке можно получить с помощью:gnome-screensaver-command -q

Но я не могу понять, как обнаружить блокировку экрана. Например, на Unity я могу использовать:

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

но это специфичный для Unity элемент. Так что есть идеи, как получить эту информацию на машинах Gnome?

решение1

Обнаружено, что /org/gnome/SessionManager/Presence содержит текущий статус сеанса пользователя.

Его можно назвать так:

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

Быстрый тест bash:

#!/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

Например в 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!
}

решение2

Вышеприведенный ответ возвращает ошибку в Ubuntu 18.04, потому что вызов хочет точки вместо слешей. Включая вывод ошибок для будущих поисков:

Ошибка вызова:

$ 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')

Пример рабочего синтаксиса:

$ 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>,)

Вывод при блокировке:

$ 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>,)

Документыhttps://people.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Presence

Связанный контент