Добрый день, дорогие убунтоводы!
Решил побороть надоедливую проблему с отключением экрана посреди просмотра кино

Как обычно, взял для этой цели баш, немного разбавленный седом и, подумав, надумал вот что:
так или иначе, любой проигрыватель мультимедиа это процесс или часть процесса, следовательно,
его активность можно отловить, раз уж система не в состоянии понять что это, как бы поточнее
выразиться... «активная активность», а не «пассивная активность». Таким образом, если написать
демон, настроенный на «отлов» активности плеер-плагинов 3—4 самых распространенных браузеров
и 5—7 самых распространенных же проигрывателей, то получится универсальный сценарий, который
решит проблему (по крайней мере для GNOME).
Провозившись часа 4 я наваял рабочий демон, но предупреждаю он длинноват, вот текст:
#!/bin/bash
# This is a fix for the GNOME sleep-display feature
# it will prevent your screen from going to sleep
# while you are running multimedia on your laptop
# query-related data (this section can be expanded)
# Rl state code is used to determine if multimedia
# is currently playing or paused/stopped
chrom='Rl.*chrome --type=ppapi'
frfox='Rl.*libflashplayer.so'
# foo='Rl.*bar'
# baz='Rl.*quux'
# player plugin activity flag
ppf=0
# retrieving user-specified idle delay values (once)
ssval=`gsettings get \
org.gnome.desktop.session \
idle-delay` \
| grep -o '[0-9]*$'
acval=`gsettings get \
org.gnome.settings-daemon.plugins.power \
sleep-display-ac`
btval=`gsettings get \
org.gnome.settings-daemon.plugins.power \
sleep-display-battery`
while [ "1" -eq "1" ]; do
# player plugin activity detection query
query=`ps -eo "stat,cmd" \
| grep -v "grep" \
| grep -o "$chrom"`
if [ "$query" == "" ]; then
query=`ps -eo "stat,cmd" \
| grep -v "grep" \
| grep -o "$frfox"`
fi
# more matching criteria can be used to expand this query
# if [ "query" == "" ]; then query=`foobar`; fi
# do not forget the Rl code!
# handling player plugin activity flag
prevppf="$ppf"
rpt="5"
if [ "$query" != "" ]; then
let "ppf=1"
let "rpt=30"
else
let "ppf=0"
fi
# execute the flollowing only if flag has changed
if [ "$ppf" -ne "$prevppf" ]; then
# retrieving current idle delay values
ssidl=`gsettings get \
org.gnome.desktop.session \
idle-delay` \
| grep -o '[0-9]*$'
acidl=`gsettings get \
org.gnome.settings-daemon.plugins.power \
sleep-display-ac`
btidl=`gsettings get \
org.gnome.settings-daemon.plugins.power \
sleep-display-battery`
# saving idle delay values in case they have been changed
if [ "$ppf" == "0" ]; then
let "ssval=ssidl"
let "acval=acidl"
let "btval=btidl"
fi
if [ "$ppf" -eq "1" ]; then # setting idle delay to infinite if player plugin is active...
gsettings set \
org.gnome.desktop.session \
idle-delay "0"
gsettings set \
org.gnome.settings-daemon.plugins.power \
sleep-display-ac "0"
gsettings set \
org.gnome.settings-daemon.plugins.power \
sleep-display-battery "0"
else # restoring user-specified idle delay value if not
gsettings set \
org.gnome.desktop.session \
idle-delay "$ssval"
gsettings set \
org.gnome.settings-daemon.plugins.power \
sleep-display-ac "$acval"
gsettings set \
org.gnome.settings-daemon.plugins.power \
sleep-display-battery "$btval"
fi
fi
echo "$ppf" # testing
sleep "$rpt" # repeat interval (5 seconds by default)
done
exit 0
Все работает исправно, нужно только добавить в автозапуск, НО пока только для Firefox и Chrome.
Собственно говоря, у меня обращение к сообществу: если у вас такая же проблема с каким-либо еще
плеером или плеер-плагином, приглашаю присоединиться ко мне и расширить функционал и на них,
в скрипте это раздел про query. Кроме того, если найдутся люди с предложениями по оптимизации
также буду очень благодарен.
Спасибо за внимание
