Tengo una aplicación multiplataforma que se ejecuta en Ubuntu 14.04 (GNOME). Allí necesito determinar si el salvapantallas está activo o no y si la pantalla está bloqueada o no.
Descubrí que puedo obtener la información del protector de pantalla con:gnome-screensaver-command -q
Pero parece que no puedo entender cómo puedo detectar un bloqueo de pantalla. Por ejemplo, en Unity puedo usar:
gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked
pero ese es un elemento específico de Unity. Entonces, ¿alguna idea sobre cómo obtener esta información en las máquinas Gnome?
Respuesta1
Descubrí que /org/gnome/SessionManager/Presence contiene el estado actual de la sesión del usuario.
Se puede llamar así:
gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get /org/gnome/SessionManager/Presence status
Prueba rápida de 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
Por ejemplo en 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!
}
Respuesta2
La respuesta anterior devuelve un error en Ubuntu 18.04 porque la llamada quiere puntos en lugar de barras. Incluyendo salida de error para búsquedas futuras:
Error al llamar:
$ 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')
Ejemplo de sintaxis de trabajo:
$ 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>,)
Salida cuando está bloqueado:
$ 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>,)