XScreenSaverと動画視聴時のスクリーンセーバー抑制

こちらのフォーラムに回答したのですが,色々余計なことも書きたかったのでここに書いておきます.

XScreenSaverの自分の大体の設定,動画視聴時のスクリーンセーバー抑制についてです.ここではXScreenSaverの説明ですが,GnomeやKDE,Cinnamonなどでもコマンドを置き換えることでほぼ同じように使えるはずです.

Note
例えばGnome ScreenSaverの場合 xscreensaver-commandgnome-screensaver-command に置き換える

2021-03-25追記)
XScreenSaver FAQ を見ると,XScreenSaver 5.45以降はFirefox, Chrome, Chromium, MPV, VLCでの動画視聴時にスクリーンセーバーが抑制されるようになっているようです.確認すると,xprintidleはカウントされますがスクリーンセーバーは抑制されるといった動作になっているようです.

XScreenSaverの設定

$ sudo apt install xscreensaver

xscreensaver パッケージを導入します.

$ dpkg-query -W xscreensaver*
xscreensaver    5.45+dfsg1-1
xscreensaver-data       5.45+dfsg1-1
xscreensaver-data-extra 5.45+dfsg1-1
xscreensaver-gl 5.45+dfsg1-1
xscreensaver-gl-extra   5.45+dfsg1-1
xscreensaver-screensaver-bsod   5.45+dfsg1-1
xscreensaver-screensaver-dizzy  0.3-3.1

いろいろなスクリーンセーバーを使いたい場合その他のパッケージも導入します.

設定は xscreensaver-demo で行えます.

xscreensaver-demo

xscreensaver setting

私は,いくつかのスクリーンセーバーを有効にして,Modeを Random Screen Saver にして選択したスクリーンセーバーがランダムに起動するようにしています.

その他スクリーンセーバー起動時にロックするようにしています.離席時に他の人が触りにくくなります.

Blank After
指定した時間経過後スクリーンセーバー起動
Lick Screen After
スクリーンセーバー起動後指定時間でロックする(スクリーンセーバー解除時にパスワードが必要)

xscreensaver-command でスクリーンセーバー制御

xscreensaver-command というコマンドで制御が出来ます.私がよく使うオプションはこのあたりです.

-activate
スクリーンセーバーを有効にします
-deactivate
スクリーンセーバーを解除します
-lock
画面をロックします

1文字の省略形のオプションもありますが,manやhelpには載っていないので使わないほうがいいかもしれません.
私はこのコマンドで離席時画面をロックするためにキーボードショートカットに登録したり,以前は BlueProximity というソフトウェアでBluetoothデバイスを身につけてそれを持ったまま離席してある程度離れると画面をロックするというのに使っていました.(最近のDebian ではなくなっていたり,今使っているスマートフォンは少電力機能のせいかすぐロックされてしまうようになって今は使っていません.)

awesome wmでキーボード・ショートカット( Alt+l )でスクリーンロックする例.
    -- lock screen
    awful.key({ "Mod1"  }, "l", function () awful.util.spawn( "xscreensaver-command -lock",false) end),

xprintidleを見ながらスクリーンセーバー起動確認

スクリーンセーバーの設定を行って正しく起動するかを確認するとき xprintidle コマンドが便利です.

man xprintidle
       xprintidle is a utility that queries the X server for the user's idle time and prints it to stdout (in milliseconds).

Xサーバーのアイドル時間を表示してくれるコマンドです.単位はミリ秒です.

$ watch xprintidle

watch コマンドなどで定期的に呼ぶようにしてスクリーンセーバーの起動を待つとわかりやすいです.

mpvでスクリーンセーバー抑制

man mpv
       --stop-screensaver, --no-stop-screensaver
              Turns off the screensaver (or screen blanker and similar mechanisms) at startup and turns it on again on exit  (default:  yes).
              The screensaver is always re-enabled when the player is paused.

              This  is not supported on all video outputs or platforms. Sometimes it is implemented, but does not work (especially with Linux
              "desktops").

mpvにはスクリーンセーバー抑制オプションがありました.

$ echo 'alias mpv="mpv --stop-screensaver"' >> ~/.bashrc
$ source ~/.bashrc
$ alias | grep mpv
alias mpv='mpv --stop-screensaver'

alias や

$ cp /usr/share/applications/mpv.desktop ~/.local/share/applications/
$ vi ~/.local/share/applications/mpv.desktop
$ diff -u1 /usr/share/applications/mpv.desktop ~/.local/share/applications/mpv.desktop
--- /usr/share/applications/mpv.desktop 2020-08-13 05:52:09.000000000 +0900
+++ /home/matoken/.local/share/applications/mpv.desktop 2021-03-24 22:15:59.037232611 +0900
@@ -31,3 +31,3 @@
 TryExec=mpv
-Exec=mpv --player-operation-mode=pseudo-gui -- %U
+Exec=mpv --stop-screensaver --player-operation-mode=pseudo-gui -- %U
 Terminal=false

デスクトップファイルに設定しておくと良さそうです.

mplayerでスクリーンセーバー抑制

man mplayer
       -heartbeat-cmd
              Command that is executed every 30 seconds during playback via system() - i.e. using the shell.

              NOTE:  MPlayer  uses this command without any checking, it is your responsibility to ensure it does not cause security problems
              (e.g. make sure to use full paths if "." is in your path like on Windows).  It also only works when  playing  video  (i.e.  not
              with -novideo but works with -vo null).

              This can be "misused" to disable screensavers that do not support the proper X API (also see -stop-xscreensaver).  If you think
              this is too complicated, ask the author of the screensaver program to support the proper X APIs.

              EXAMPLE for xscreensaver: mplayer -heartbeat-cmd "xscreensaver-command -deactivate" file

              EXAMPLE for GNOME screensaver: mplayer -heartbeat-cmd "gnome-screensaver-command -p" file

mplayerには -heartbeat-cmd というオプションがあります.mpvと同じようにaliasやデスクトップファイルを編集しておくと便利です.

lightsOnスクリプトでスクリーンセーバー抑制

mpvやmplayerでは抑制できましたが,ウェブブラウザ等で動画閲覧時に抑制できません.そういうときに便利なのが lightsOn です.
各種動画プレイヤーや,ウェブブラウザでFlash/HTML5ビデオ再生時にスクリーンセーバーを抑制してくれます.これを使うと上のmpv/mplayerの設定も不要になります.

$ wget https://raw.githubusercontent.com/kodx/lightsOn/master/lightsOn.sh
$ chmod u+x ./lightsOn.sh
$ ./lightsOn.sh

とりあえず実行すればokです.

しかし手元の環境では xprop: unable to open display ':0.0' というメッセージで動作しませんでした.
DISPLAY番号が 0 で固定になっているせいのようです.

diff --git a/lightsOn.sh b/lightsOn.sh
index 6b5be4b..bdab249 100755
--- a/lightsOn.sh
+++ b/lightsOn.sh
@@ -162,7 +162,7 @@ checkFullscreen()
     for display in $displays
     do
          id of active window and clean output
-        activ_win_id=$(DISPLAY=:0.${display} xprop -root _NET_CLIENT_LIST_STACKING | sed 's/.*\, //')  used _NET_ACTIVE_WINDOW, but it didn't work with some flash players (eg. Twitch.tv) in firefox. Using sed because id lengths can vary.
+        activ_win_id=$(DISPLAY=${DISPLAY}.${display} xprop -root _NET_CLIENT_LIST_STACKING | sed 's/.*\, //')  used _NET_ACTIVE_WINDOW, but it didn't work with some flash players (eg. Twitch.tv) in firefox. Using sed because id lengths can vary.

         # Skip invalid window ids (commented as I could not reproduce a case
         # where invalid id was returned, plus if id invalid
@@ -173,8 +173,8 @@ checkFullscreen()

         # Check if Active Window (the foremost window) is in a fullscreen state
         if [[ -n $activ_win_id ]]; then
-            isActivWinFullscreen=$(DISPLAY=:0.${display} xprop -id $activ_win_id | grep _NET_WM_STATE_FULLSCREEN)
-            isActivWinAbove=$(DISPLAY=:0.${display} xprop -id $activ_win_id | grep _NET_WM_STATE_ABOVE)
+            isActivWinFullscreen=$(DISPLAY=${DISPLAY}.${display} xprop -id $activ_win_id | grep _NET_WM_STATE_FULLSCREEN)
+            isActivWinAbove=$(DISPLAY=${DISPLAY}.${display} xprop -id $activ_win_id | grep _NET_WM_STATE_ABOVE)
             log "checkFullscreen(): Display: $display isFullScreen: \"$isActivWinFullscreen\""
             log "checkFullscreen(): Display: $display isAbove: \"$isActivWinAbove\""
             if [[ "$isActivWinFullscreen" = *NET_WM_STATE_FULLSCREEN* || "$isActivWinAbove" = *NET_WM_STATE_ABOVE* ]];then

少し書き換えて使っています.

これを自動起動するようにしておくと動画視聴時に抑制されます.

私はNetworkManagerのScriptで自宅のネットワークの場合起動するようにしています.その他のネットワークでは起動しない → スクリーンセーバーが抑制されない.

環境

$ dpkg-query -W xscreensaver* mpv mplayer xprintidle
mplayer 2:1.4+ds1-1
mpv     0.32.0-2+b1
xprintidle      0.2.4-1
xscreensaver    5.45+dfsg1-1
xscreensaver-data       5.45+dfsg1-1
xscreensaver-data-extra 5.45+dfsg1-1
xscreensaver-gl 5.45+dfsg1-1
xscreensaver-gl-extra   5.45+dfsg1-1
xscreensaver-screensaver-bsod   5.45+dfsg1-1
xscreensaver-screensaver-dizzy  0.3-3.1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64