LINUX.ORG.RU

i3blocks. Кнопка ломает работу индикатора

 , , ,


0

1

i3blocks выводит состояние аудиоплеера, этот индикатор является также кнопкой, которая может ставить плеер на паузу или продолжать воспроизведение. Делается это с помощью внутренней команды плеера deadbeef --play-pause. Если плеер выключен, то эта же команда его запустит. Всё работает. Но если научить индикатор отображать также состояние, когда плеер не запущен (с помощью команды pidof deadbeef > /dev/null), то кнопка начинает работать неправильно — проигрыватель запускается, но состояние уже не обновляется. По сути он зависает, и не работает более пока не перезапустишь. А если перезапустить i3blocks (сделав рестарт оболочки i3-msg restart), то плеер выключается.

Т. е. ошибка где-то на этапе проверки состояния плеера. Но с чем это связано? i3blocks, плеер или скрипт некорректно составлен? Как решить?

Скрипт индикатора:

#!/bin/bash

## проверить включена ли программа
if pidof deadbeef > /dev/null ;
then STATE="10"
else STATE="20"
fi

## определить статус воспроизведения
if [ $(deadbeef --nowplaying-tf '%isplaying%') == "1" ];
then STATUS="3"
elif [ $(deadbeef --nowplaying-tf '%ispaused%') == "1" ];
then STATUS="4"
else STATUS="5"
fi

## вычислить статус
let "CALC = $STATE + $STATUS"

## отобразить состояние плеера
if [[ "$CALC" -eq "13" ]];
then echo "PLAY"
elif [[ "$CALC" -eq "14" ]];
then echo "PAUSE"
elif [[ "$CALC" -eq "15" ]];
then echo "STOP"
elif [[ "$STATE" -eq "20" ]];
then echo "OFF"
fi

case $BLOCK_BUTTON in
  ## левым кликом поставить на паузу или запустить плеер
  1) deadbeef --play-pause ;;
esac

если в консоли написать

deadbeef --play-pause

, то консоль отдает управление после запуска плеера или ждет завершения работы его?

bvn13 ★★★★★ ()
Ответ на: комментарий от bvn13

Блин, да ведь, в этом дело! Консоль ждёт.
Я сильно чайник, и порой до таких очевидных ходов могу недосообразить, так что спасибо большое, действительно ценную наводку кинул.

Так… а как правильно «отцепить» команду от источника выполнения?
Попробовал сейчас создать отдельный скрипт и его вызвать, но результат тот же. Вероятно есть алгоритм решения, наверняка типичной задачи, но я даже не знаю как её назвать, чтобы загуглить.

Dreamdrawer ()
Ответ на: комментарий от bvn13

Ага, думал было не срабатывает с «&», но оказалось срабатывает, но не с первого раза, и даже не с определённого количества раз. Требуется многократное нажатие (от пяти до пятнадцати) раз, а потом ещё многократно щёлкать, чтобы выполнить команду повторно для установки паузы.
Без этого «&» отрабатывает мгновенно, так что дело не в i3blocks, секция которого у меня выглядит так:

[mediaplayer]
command=bash ~/.config/i3/deadbeef_status
instance=spotify
interval=1
signal=12
separator=false

Но в чём же тогда дело?

Dreamdrawer ()
Ответ на: комментарий от bvn13

Он делает мгновенную перерисовку состояния i3blocks.
Обычно реакция происходит с небольшой задержкой, это ощутимо неприятно особенно при изменении уровня громкости или смене раскладки, когда индикатор отзывается не мгновенно, а по таймеру, который отработает через секунду. Команда делает возможным реагировать индикаторам в реальном времени.

Dreamdrawer ()