Как настроить хранитель экрана для работы с VLC

Как настроить хранитель экрана для работы с VLCВ качестве хранителя экрана часто используется xscreensaver. И есть одна проблема с проигрывателем VLC. В настройках установлена опция «Не запускать хранитель экрана», но скринсейвер при этом все равно запускается во время проигрывания фильма. Приходится периодически шевелить мышкой, что, согласитесь, не очень способствует комфортному просмотру. В KDE и Gnome всё хорошо, их хранители экрана отключаются, а xscreensaver, например, нет. Проблема эта очень распространенная, но хороших простых решений, к сожалению, мало. Тем не менее, они есть.

Первый вариант решения проблемы vlc+xscreensaver:

Скрипт lightsOn, который решает эту проблему. Его можно скачать и запускать перед запуском VLC.

Второй вариант:

Для второго варианта придется выйти немного за рамки. Написать свой скрипт для отслеживания, запущен ли vlc, включающий или выключающий в зависимости от этого управление энергосбережением монитора. Для начала надо удалить xscreensaver, поскольку он нам не понадобится, мы будет работать напрямую с X-сервером:

apt-get remove xscreensaver

И теперь можно написать скрипт, который будет следить за vlc и, если он запущен, отключать управление питанием монитора. Для управления питанием воспользуемся программой xset

xset +dpms dpms 600 900 0

600 — таймаут, по истечении которого монитор переходит в ждущий режим, 900 — по истечении которого монитор переходит в спящий режим, 0 — по истечении которого монитор отключается.

Получится примерно такой скрипт:

#!/bin/bash

TIMEOUT_STANDBY=60
TIMEOUT_SUSPEND=900
TIMEOUT_OFF=0

xset -dpms -display ":0.0"
while :
do
    DPMS_STATUS=$(xset q | grep 'DPMS is' | awk '{print $3}')
    VLC_PID=$(pgrep vlc)
    if [ "$VLC_PID" == "" ]
    then
        if [ "$DPMS_STATUS" == "Disabled" ]
        then
            xset +dpms -display ":0.0" dpms $TIMEOUT_STANDBY $TIMEOUT_SUSPEND $TIMEOUT_OFF
        fi
    else
        if [ "$DPMS_STATUS" == "Enabled" ]
        then
            xset -dpms -display ":0.0"
        fi
    fi
    sleep 1
done

Скрипт будет проверять каждую секунду, запущен ли vlc, и, если это так, отключать управление питанием монитора. Запускать его можно либо из автозагрузки графической оболочки, которой вы пользуетесь, либо просто в фоновом режиме

screenspy.sh &

Скрипт раз в секунду проверяет, есть ли процесс с названием vlc и, если да, выключает управление электросбережением монитора, а если нет. то включает управление энергосбережением с таймаутами, указанными в скрипте.

Установка скрипта как сервиса

Рассмотрим два варианта установки этого скрипта как сервиса. Первый вариант — для sysvinit, второй — для systemd

Для sysvinit скрипт придется немного дополнить, чтобы в результате он выглядел так:

#!/bin/bash

TIMEOUT_STANDBY=60
TIMEOUT_SUSPEND=900
TIMEOUT_OFF=0

start(){
$0 &
}

main(){
xset -dpms -display ":0.0"
while :
do
    DPMS_STATUS=$(xset q | grep 'DPMS is' | awk '{print $3}')
    VLC_PID=$(pgrep vlc)
    if [ "$VLC_PID" == "" ]
    then
        if [ "$DPMS_STATUS" == "Disabled" ]
        then
            xset +dpms -display ":0.0" dpms $TIMEOUT_STANDBY $TIMEOUT_SUSPEND $TIMEOUT_OFF
        fi
    else
        if [ "$DPMS_STATUS" == "Enabled" ]
        then
            xset -dpms -display ":0.0"
        fi
    fi
    sleep 1
done
}

if [ "$1" == "" ]
then
  main
fi

case "$1" in
  start)
    start
    ;;
  stop)
    killall -9 screenspy.sh
    ;;
esac

После этого его можно скопировать в директорию /etc/init.d. При необходимости можно добавить LSB-заголовки.

Для systemd скрипт будет выглядеть так:

[Unit]
Description=VLC screensaver spy

[Service]
Type=forking
ExecStart=/usr/bin/screenspy.sh
RemainAfterExit=yes
TimeoutSec=0

[Install]
WantedBy=multi-user.target

Для запуска сервиса на определенных уровнях после этого для sysvinit используйте команду update-rc.d или chkconfig, в зависимости от дистрибутива, а для systemd скрипт необходимо положить в директорию /lib/systemd/system и назвать его screenspy.service. После этого сервис включается командой.

systemctl enable screenspy.service

И теперь его можно запустить командой

systemctl start screenspy.service

Вот и всё. Замечания просьба оставлять в комментариях.