スクリーンセーバーが有効になっているかどうかを検出

スクリーンセーバーが有効になっているかどうかを検出

スクリーンセーバーが有効になっていることを確認したいと思います。 Ubuntu 14.04とFedora 21で次のコマンドを試しました。

$ dbus-send --print-reply=literal --dest=org.freedesktop.ScreenSaver /org/freedesktop/ScreenSaver org.freedesktop.ScreenSaver.Lock
Error org.freedesktop.DBus.Error.NotSupported: This method is not implemented

dbus-sendd-feetでその方法が可能であることを伝えるので、私が誤解している可能性がありますGetActive

dフィートのスクリーンショット

どのようにできる可能な限りデスクトップ独立した方法でスクリーンセーバーの活動を検出しますか?一つある関連質問しかし、これは問題を解決しませんでした。

答え1

環境に応じて:

$ qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive

$ qdbus org.kde.screensaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive

$ qdbus org.gnome.ScreenSaver /ScreenSaver org.gnome.ScreenSaver.GetActive

正しい人は真実または偽の声明をするべきです。正しくない場合はエラーが報告されます。

$ qdbus org.gnome.ScreenSaver /ScreenSaver org.gnome.ScreenSaver.GetActive
false

$ qdbus org.kde.screensaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive
Service 'org.kde.screensaver' does not exist.

(私はGnomeを実行しています)

答え2

dbus-sendを誤解しませんでした。

それだけです。Gnome-Shellは嘘をついています。。これは、Gnome-Shell開発者が実際にKDE APIの説明をそのままとり、freedesktopの一部である2つの方法のみを実装したことを意味します。アイドリングスピード抑制仕様。したがって、他のメソッドは実装されていないエラーを返します。

+        } else if (g_strcmp0 (method_name, "GetActive") == 0) {
+                goto unimplemented;
+        } else ...

このアプローチが混乱していると考えるレビューコメントは無視されました。

これはGnome-Shell 3.38.1(Fedora 33など)の現在の状況です。

$ qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive
Error: org.freedesktop.DBus.Error.NotSupported
This method is not implemented
$ qdbus org.freedesktop.ScreenSaver /org/freedesktop/ScreenSaver org.freedesktop.ScreenSaver.GetActive
Error: org.freedesktop.DBus.Error.NotSupported
This method is not implemented

したがって、最良の方法は、エラーが発生しなくなるまでいくつかの方法を試すことですNotSupported

たとえば、Gnome-Shellを確認してください。

$ qdbus org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActive                
false

関連情報