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

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

助けてください – Raspberry Pi Forums

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

Note

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

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

XScreenSaverの設定

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

私は，いくつかのスクリーンセーバーを有効にして，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
#get id of active window and clean output
- activ_win_id=$(DISPLAY=:0.${display} xprop -root _NET_CLIENT_LIST_STACKING | sed 's/.*\, //') #previously 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/.*\, //') #previously 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

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

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

ちょっと便利なGnome NetworkManager のscript – Speaker Deck

私は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