У меня есть межплатформенное приложение, которое работает на Ubuntu 14.04 (GNOME). Там я должен определить, активна ли экранная заставка или не и если экран заблокирован или нет.
Я узнал, что могу получить информацию об экранной заставке с: gnome-screensaver-command -q
Но я, может казаться, не выясняю, как я могу обнаружить экранную блокировку. Например, на Единице я могу использовать:
gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked
но это - Определенный для единицы объект. Так какие-либо идеи о том, как получить эту информацию о машинах Gnome?
Узнанный, что/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
Быстрый тест удара:
#!/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!
}
Приведенный выше ответ возвращает ошибку в 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>,)