シェル/C++で画面ロックを検出する

シェル/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

関連情報