まメモ

みむ

特定のアプリケーション起動時にスクリーンセーバー、自動サスペンドを止める

概要

 タイトル通り。 ちなみに、GNOME3なら拡張機能Caffeineというのがあって、アプリケーション名を設定することで早々に目的を達成できます。

 一定時間無操作でブランクスクリーンにするようなアイドル設定をするのはよくあることかと思いますが、アニメを見たりしてるときはこれが邪魔になることもあります。

 しかし、YouTubeを見たりAmazon Prime Videoを見てる時はこういったことには(多分)悩まされないはずです。 同様にVLCのようなメディアプレイヤーで動画を見ているときにも、勝手に画面が消えたりはしないはずです。 これはアプリケーションが裏側でよしなにやってくれているからです。

 ただ、必ずしも無操作の時間が長くなるとは考えられないもの(というかリモートデスクトップのクライアント)ではそういったことはやってくれないので、リモートに接続しながら何かを流し見していると問題になることがあります。

 これでは満足にコンテンツの消化もできないので、解決法を調べました。 思ったよりも意外に簡単にできて、個人的にちょっと面白かったので記事にします。

方法

 gnome-session-inhibit というのがあって、

$ gnome-session-inhibit [実行したいコマンド]

とすれば、指定したコマンドが終了するまでアイドル状態にならなくなります。

 自分の場合はリモートデスクトップクライアントにRemminaを使っていて、起動中は勝手に消えてほしくなかったので、起動コマンドを gnome-session-inhibit でくるんだ カスタム .desktop ファイルを作成してそちらを使うようにしました。

gnome-session-inhibit の裏側

 gnome-session-inhibit は何をしているのかというと、D-Bus 経由で gnome-session の Inhibitor API を呼び出しています。

 dbus-monitorを使って覗き見てみると、gnome-session-inhibitを使った時に以下のような出力が確認できます。

method call time=1539871252.007783 sender=:1.864 -> destination=org.gnome.SessionManager serial=2 path=/org/gnome/SessionManager; interface=org.gnome.SessionManager; member=Inhibit
   string "unknown"
   uint32 0
   string "not specified"
   uint32 8
method return time=1539871252.010514 sender=:1.688 -> destination=:1.864 serial=720 reply_serial=2
   uint32 1663795501

 このように Inhibit を呼び出すことで、gnome-session にアイドル状態を抑制するよう設定を行っています。

 解除時は Uninhibit というのがあって、これを呼び出すことになっているのですが、gnome-session-inhibitではこれを特に呼んでいなさそうので、何か別の方法で解除しているようです。

(D-Bus よく知らないのですが、nameLost というsignal が発生しているので、多分通信に使ったバスが消えることで通知している?)

 ちなみに Cinnamon のアプレットに Inhibit Applet というのがあって、こちらでも Inhibitor APIを呼び出してアイドル状態を抑制することができます。 Inhibit Applet では状態を変化させるごとに Inihibit と Uninhibit が呼ばれるので、D-Bus を見る分にはこちらの方がわかりやすいかも。

 なので、もしアイドル状態を抑制したいようなアプリケーションを作成した時は、どこかで Inhibitor API を叩いてあげると幸せになれそうです。

番外編 systemd-inhibit

 他に似たものにsystemd-inhibit というコマンドもあります。 gnome-session の Inhibitor API と似た形で、systemd にも同様のインタフェースが存在しています。

systemd inhibitor

 systemd 側の話なので、スクリーンセーバー抑制等はできないようですが、サスペンド抑制等には使えそうです。

 gnome-session 以外のセッション・電源管理アプリケーションで同様の枠組みがあるのかは知りませんが、最悪 systemd 側から今回のようなアプローチも取れそうというメモです。