Как остановить xscreensaver во время воспроизведения фильмов?
Я использую Ubuntu 12.04. Я установил xscreensaver вместо gnome.screensaver.
Моя проблема в том, что я не могу заставить заставку перестать появляться, когда я смотрю фильм в Movie Player. У меня установлен Movie Player для отключения заставок, но он не работает на xscreensaver.
Как изменить файлы программы для отключения xscreensaver во время работы Movie Player?
6 ответов
Вы можете попробовать скрипт, похожий на этот. Следите за состоянием игрока через DBUS.
Я опускаю задержку до 55 сек, лучше работаю с 1мин простой заставки.
Пример VLC:
Кстати, VLC в Ubuntu 14.04 по умолчанию включает интерфейс DBUS. Где в Ubuntu 12.04 нет. Проверьте это от:
Инструменты → Настройки → Дополнительно (или Все) → Интерфейс → Интерфейсы управления → Интерфейс управления D-Bus. (Применить затем перезапустить VLC)
Создать файл
heartbeat.sh
в~/Desktop/
:#!/bin/bash while sleep 55 do if [ "$(pgrep vlc)" != "" ] then state=$(bash -c 'gdbus call --session \ --dest org.mpris.MediaPlayer2.vlc \ --object-path /org/mpris/MediaPlayer2 \ --method org.freedesktop.DBus.Properties.Get \ "org.mpris.MediaPlayer2.Player" \ "PlaybackStatus"') if [ "$state" = "(<'Playing'>,)" ] then #xscreensaver-command -deactivate xset s reset fi fi done
Открыть терминал Ctrl+Alt+t
Добавить разрешения на запуск:
chmod +x ~/Desktop/heartbeat.sh
Запустить скрипт:
~/Desktop/heartbeat.sh
Попробуй VLC player.
Для Gnome MPlayer (D-Bus включен по умолчанию), используйте:
"$(pgrep gnome-mplayer)"
а также--dest org.mpris.MediaPlayer2.gnome-mplayer
Для проигрывателя видео (Totem) (плагин D-Bus по умолчанию отключен),
Правка → Плагины → Проверить сервис D-Bus. (Перезагрузите тотем)
Использование:
"$(pgrep totem)"
а также--dest org.mpris.MediaPlayer2.totem
Это изменено для работы с любым плеером, который обеспечивает MPRIS. Он получает список динамически (недостаток, он не различает только воспроизведение аудио и воспроизведение видео). На мой взгляд, лучший способ - это вручную составить список игроков, которые вам нравятся:
#!/bin/bash players_list=$(gdbus call --session --dest org.freedesktop.DBus \ --object-path / --method org.freedesktop.DBus.ListNames | \ awk 'BEGIN { RS=","; } /org.mpris.MediaPlayer2./ { gsub(/[\[\]()\x27]/, ""); print $1; }') while sleep 55 do for player in $players_list do state=$(gdbus call --session \ --dest $player \ --object-path /org/mpris/MediaPlayer2 \ --method org.freedesktop.DBus.Properties.Get \ "org.mpris.MediaPlayer2.Player" \ "PlaybackStatus") if [ "$state" = "(<'Playing'>,)" ] then echo $player $state send signal #xscreensaver-command -deactivate #use xset to work with all screensaver tools and avoid dimming display ... xset s reset break else echo $player $state fi done done
Отладочные подсказки:
Смотреть X простой
watch -n1 xprintidle
или же:
while sleep 1; do xprintidle; done;
Проверьте, работает ли отключение заставки (при запуске этого скрипта xscreensave не должен появляться)
#!/bin/bash while sleep 55 do #xscreensaver-command -deactivate #xdg-screensaver reset xset s reset done
Проверьте список DBUS для интерфейса проигрывателя MPRIS, например, с запущенным VLC:
gdbus call --session --dest org.freedesktop.DBus \ --object-path / --method org.freedesktop.DBus.ListNames | \ awk 'BEGIN { RS=","; } /org.mpris.MediaPlayer2./ { gsub(/[\[\]()\x27]/, ""); print $1; }'
Выход:
org.mpris.MediaPlayer2.vlc org.mpris.MediaPlayer2.vlc.instance3939
Или используя
dbus-send
командаdbus-send --session \ --dest=org.freedesktop.DBus \ --type=method_call \ --print-reply \ /org/freedesktop/DBus \ org.freedesktop.DBus.ListNames \ | grep org.mpris.MediaPlayer2.
Выход:
string "org.mpris.MediaPlayer2.vlc" string "org.mpris.MediaPlayer2.vlc.instance3939"
Рекомендации:
- Как настроить запрос DBus, чтобы получить состояние воспроизведения VLC? оригинальный сценарий от JB0x2D1
- Спецификация интерфейса MPRIS D-Bus
- использование
qdbusviewer
чтобы проверить правильное имя места назначения или использовать другого игрока, который вам нравится.
Я заметил, что все ответы здесь кажутся излишне сложными; вам не нужно делать это на основе конкретного медиаплеера - все, что вам нужно сделать, это определить, воспроизводится ли какой-либо звук. Я на самом деле удивлен, что это не функция, встроенная в xscreensaver. Вот супер простой скрипт bash:
#!/bin/bash
while true
do
state=$(pacmd list-sinks | grep -A 4 "*" | grep "state: " | cut -c 9-)
if [[ $state == SUSPENDED || $state == IDLE ]]
then
echo "State: $state. Not pausing screensaver."
sleep 2m
else
echo "State: $state. Pausing screensaver."
xscreensaver-command -deactivate > /dev/null
sleep 4m
fi
done
Для MPV и mplayer встроена функция пульса.
1) Найдите свой файл конфигурации mpv. locate mpv.conf
2) Откройте это. sudo nano /path/to/mpv.conf
3) Добавьте эту строку внизу. heartbeat-cmd="/usr/bin/xscreensaver-command -deactivate > /dev/null"
4) Закрыть и сохранить. Ctrl+X при использовании nano.
Узнайте, где найти файл mpv.conf (конфигурация идентична в Arch Linux), https://wiki.archlinux.org/index.php/Mpv
Если переменная окружения XDG_CONFIG_HOME не установлена, файлы конфигурации пользователя будут считываться из каталога ~/.config/mpv. Общесистемные файлы конфигурации считываются из каталога / etc / mpv.
Это работало для меня на Xubuntu 17.10 с xscreensaver
#!/bin/bash
while true; do
sleep 10
cat /proc/asound/card*/pcm*/sub*/status | grep RUNNING && xscreensaver-command -deactivate
done
Это сработало для меня с Xubuntu 18.10 и с VLC, видео с YouTube и т. Д. Без необходимости отключать xscreensaver. Просто добавьте следующий скрипт при запуске системы:
#!/bin/bash
# enumerate all the attached screens
displays=""
while read id
do
displays="$displays $id"
done< <(xvinfo | sed -n 's/^screen #\([0-9]\+\)$/\1/p')
checkFullscreen()
{
# loop through every display looking for a fullscreen window
for display in $displays
do
#get id of active window and clean output
activ_win_id=`DISPLAY=:0.${display} xprop -root _NET_ACTIVE_WINDOW`
activ_win_id=${activ_win_id:40:9}
# Check if Active Window (the foremost window) is in fullscreen state
isActivWinFullscreen=`DISPLAY=:0.${display} xprop -id $activ_win_id | grep _NET_WM_STATE_FULLSCREEN`
if [[ "$isActivWinFullscreen" == *NET_WM_STATE_FULLSCREEN* ]];then
xscreensaver-command -deactivate
fi
done
}
while sleep $((30)); do
checkFullscreen
done
exit 0
Вот моя собственная версия из кода Криса:
#!/bin/bash
while sleep 55
do
players_list=$(gdbus call --session --dest org.freedesktop.DBus \
--object-path / --method org.freedesktop.DBus.ListNames | \
awk 'BEGIN { RS=","; } /org.mpris.MediaPlayer2./ { gsub(/[\[\]()\x27]/, ""); print $1; }')
for player in $players_list
do
state=$(gdbus call --session \
--dest $player \
--object-path /org/mpris/MediaPlayer2 \
--method org.freedesktop.DBus.Properties.Get \
"org.mpris.MediaPlayer2.Player" \
"PlaybackStatus")
fullscreen=$(gdbus call --session \
--dest $player \
--object-path /org/mpris/MediaPlayer2 \
--method org.freedesktop.DBus.Properties.Get \
"org.mpris.MediaPlayer2" \
"Fullscreen")
if [ "$state" = "(<'Playing'>,)" -a "$fullscreen" = "(<true>,)" ]
then
echo $player $state $fullscreen send signal
xscreensaver-command -deactivate
break
else
echo $player $state $fullscreen
fi
done
done
Он проверяет на каждой итерации, был ли изменен список игроков.
Он также деактивирует заставку, только если плеер полноэкранный, что обычно происходит с видео.
Я просто включил этот скрипт в автозапуск и больше не беспокоюсь о xscreensaver во время просмотра видео.