Как остановить 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)

    1. Создать файл 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
      
    2. Открыть терминал Ctrl+Alt+t

    3. Добавить разрешения на запуск:

      chmod +x ~/Desktop/heartbeat.sh
      
    4. Запустить скрипт:

      ~/Desktop/heartbeat.sh
      
    5. Попробуй 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
    

Отладочные подсказки:

  1. Смотреть X простой

    watch -n1 xprintidle
    

    или же:

    while sleep 1; do xprintidle; done;
    
  2. Проверьте, работает ли отключение заставки (при запуске этого скрипта xscreensave не должен появляться)

        #!/bin/bash
    
        while sleep 55
        do
            #xscreensaver-command -deactivate
            #xdg-screensaver reset
            xset s reset
        done
    
  3. Проверьте список 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"
    

Рекомендации:

Я заметил, что все ответы здесь кажутся излишне сложными; вам не нужно делать это на основе конкретного медиаплеера - все, что вам нужно сделать, это определить, воспроизводится ли какой-либо звук. Я на самом деле удивлен, что это не функция, встроенная в 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 во время просмотра видео.

Другие вопросы по тегам