Форум русскоязычного сообщества Ubuntu


Автор Тема: Скрипт для отключения хранителя экрана при просмотре flash - lightsOn  (Прочитано 2241 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн vmlinuz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
  • ПОТС ЗОХВАЧЕН11 Ъеччожа
    • Просмотр профиля
Всем привет.
Многие наверное знают, что есть такой прекрасный скрипт, под названием lightsOn, который блокирует запуск хранителя экрана при запущенном flash в полном экране.
Так вот, если запускать этот скрипт ручками из консоли, то всё прекрасно работает, а вот если его добавить в автозапуск гнома, то скрипт как бы запускается, циклы в нем выполняются, но команда, которая посылает симуляцию активности пользователя скринсейверу - не работает.
Как это побороть? Буду весьма признателен дельным советам.
 :idiot2:
« Последнее редактирование: 21 Март 2012, 13:59:50 от vmlinuz »
Вдруг из маминой из спальни ОЛОЛО ПЫЩ ПЫЩЬ РИАЛЬНИ

Оффлайн MEXAHOTABOP

  • Активист
  • *
  • Сообщений: 902
    • Просмотр профиля
Re: lightsOn
« Ответ #1 : 19 Март 2012, 17:53:41 »
gnome-terminal -x "lightsOn.sh"
поделись ссылкой на скрипт плз
http://fonline.ru/ заходите

Оффлайн vmlinuz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
  • ПОТС ЗОХВАЧЕН11 Ъеччожа
    • Просмотр профиля
Re: lightsOn
« Ответ #2 : 19 Март 2012, 18:27:17 »
gnome-terminal -x "lightsOn.sh" запускает оконо терминала, а хотелось, бы, что бы оно работало "как бы в фоне"

удалено

и, кстати, предложенный вариант тоже не работает, скринсейвер все равно включается.
« Последнее редактирование: 19 Март 2012, 19:50:05 от vmlinuz »
Вдруг из маминой из спальни ОЛОЛО ПЫЩ ПЫЩЬ РИАЛЬНИ

Оффлайн MEXAHOTABOP

  • Активист
  • *
  • Сообщений: 902
    • Просмотр профиля
Re: lightsOn
« Ответ #3 : 19 Март 2012, 18:41:58 »
для скрытия можно использовать screen
но то что даже через просто вызов терминала не работает немного сбивает с толку как она работает если ввести руками и почему не работает если сделать тоже самое только через команду
http://fonline.ru/ заходите

Оффлайн vmlinuz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
  • ПОТС ЗОХВАЧЕН11 Ъеччожа
    • Просмотр профиля
Re: lightsOn
« Ответ #4 : 19 Март 2012, 19:54:06 »
разобрался
проблема была в том, что скрипт запускался перед скринсейвером.

решение:
создаём 3 файла

/home/user/lightsOn.sh
#!/bin/bash
# lightsOn.sh

# Copyright (c) 2011 iye.cba at gmail com
# url: https://github.com/iye/lightsOn
# This script is licensed under GNU GPL version 2.0 or above

# Description: Bash script that prevents the screensaver and display power
# management (DPMS) to be activated when you are watching Flash Videos
# fullscreen on Firefox and Chromium.
# Can detect mplayer and VLC when they are fullscreen too but I have disabled
# this by default.
# lightsOn.sh needs xscreensaver or gnome-screensaver to work.

# HOW TO USE: Start the script with the number of seconds you want the checks
# for fullscreen to be done. Example:
# "./lightsOn.sh 120 &" will Check every 120 seconds if Mplayer,
# VLC, Firefox or Chromium are fullscreen and delay screensaver and Power Management if so.
# You want the number of seconds to be ~10 seconds less than the time it takes
# your screensaver or Power Management to activate.
# If you don't pass an argument, the checks are done every 50 seconds.


# Modify these variables if you want this script to detect if Mplayer,
# VLC or Firefox Flash Video are Fullscreen and disable
# xscreensaver/gnome-screensaver and PowerManagement.
mplayer_detection=1
vlc_detection=1
firefox_flash_detection=1
chromium_flash_detection=1


# YOU SHOULD NOT NEED TO MODIFY ANYTHING BELOW THIS LINE


# enumerate all the attached screens
displays=""
while read id
do
    displays="$displays $id"
done< <(xvinfo | sed -n 's/^screen #\([0-9]\+\)$/\1/p')

# Detect screensaver been used (xscreensaver, gnome-screensaver or none)
screensaver=`pgrep -l xscreensaver | grep -wc xscreensaver`
if [ $screensaver -ge 1 ]; then
    screensaver=xscreensaver
else
    screensaver=`pgrep -lf gnome-screensaver | grep -wc gnome-screensaver`
    if [ $screensaver -ge 2 ]; then
        screensaver=gnome-screensaver
        echo "gnome-screensaver"
    else
        screensaver=None
        echo "No screensaver detected"
    fi
fi


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#*# } #gives error if xprop returns extra ", 0x0" (happens on some distros)
        activ_win_id=${activ_win_id:40:9}

        # Skip invalid window ids (commented as I could not reproduce a case
        # where invalid id was returned, plus if id invalid
        # isActivWinFullscreen will fail anyway.)
        #if [ "$activ_win_id" = "0x0" ]; then
        #     continue
        #fi

        # 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
                isAppRunning
                echo "delay"
                delayScreensaver
            fi
    done
}



# check if active windows is mplayer, vlc or firefox
#TODO only window name in the variable activ_win_id, not whole line.
#Then change IFs to detect more specifically the apps "<vlc>" and if process name exist

isAppRunning()
{
    #Get title of active window
    activ_win_title=`xprop -id $activ_win_id | grep "WM_CLASS(STRING)"`   # I used WM_NAME(STRING) before, WM_CLASS more accurate.



    # Check if user want to detect Video fullscreen on Firefox, modify variable firefox_flash_detection if you dont want Firefox detection
    if [ $firefox_flash_detection == 1 ];then
        if [[ "$activ_win_title" = *unknown* || "$activ_win_title" = *plugin-container* ]];then
        # Check if plugin-container process is running
            flash_process=`pgrep -l plugin-containe | grep -wc plugin-containe`
            #(why was I using this line avobe? delete if pgrep -lc works ok)
            #flash_process=`pgrep -lc plugin-containe`
            echo "firefox flash"
            if [[ $flash_process -ge 1 ]];then
                return 1
            fi
        fi
    fi


    # Check if user want to detect Video fullscreen on Chromium, modify variable chromium_flash_detection if you dont want Chromium detection
    if [ $chromium_flash_detection == 1 ];then
        if [[ "$activ_win_title" = *exe* ]];then   
        # Check if Chromium Flash process is running
            flash_process=`pgrep -lfc "chromium-browser --type=plugin --plugin-path=/usr/lib/adobe-flashplugin"`
            #flash_process=`pgrep -lfc "chromium-browser --type=plugin --plugin-path=/usr/lib/flashplugin-installer/libflashplayer.so"`
            echo "chrome flash"
            if [[ $flash_process -ge 1 ]];then
                return 1
            fi
        fi
    fi


    #check if user want to detect mplayer fullscreen, modify variable mplayer_detection
    if [ $mplayer_detection == 1 ];then 
        if [[ "$activ_win_title" = *mplayer* || "$activ_win_title" = *MPlayer* ]];then
            #check if mplayer is running.
            #mplayer_process=`pgrep -l mplayer | grep -wc mplayer`
            mplayer_process=`pgrep -lc mplayer`
            echo "mplayer"
            if [ $mplayer_process -ge 1 ]; then
                return 1
            fi
        fi
    fi


    # Check if user want to detect vlc fullscreen, modify variable vlc_detection
    if [ $vlc_detection == 1 ];then 
        if [[ "$activ_win_title" = *vlc* ]];then
            #check if vlc is running.
            #vlc_process=`pgrep -l vlc | grep -wc vlc`
            vlc_process=`pgrep -lc vlc`
            echo "vlc"
            if [ $vlc_process -ge 1 ]; then
                return 1
            fi
        fi
    fi


return 0
}


delayScreensaver()
{

    # reset inactivity time counter so screensaver is not started
    if [ "$screensaver" == "xscreensaver" ]; then
    xscreensaver-command -deactivate > /dev/null
    elif [ "$screensaver" == "gnome-screensaver" ]; then
qdbus org.gnome.ScreenSaver / org.gnome.ScreenSaver.SimulateUserActivity > /dev/null
    fi


    #Check if DPMS is on. If it is, deactivate and reactivate again. If it is not, do nothing.   
    dpmsStatus=`xset -q | grep -ce 'DPMS is Enabled'`
    if [ $dpmsStatus == 1 ];then
        xset -dpms
        xset dpms
fi

}



delay=$1


# If argument empty, use 50 seconds as default.
if [ -z "$1" ];then
    delay=40
fi


# If argument is not integer quit.
if [[ $1 = *[^0-9]* ]]; then
    echo "The Argument \"$1\" is not valid, not an integer"
    echo "Please use the time in seconds you want the checks to repeat."
    echo "You want it to be ~10 seconds less than the time it takes your screensaver or DPMS to activate"
    exit 1
fi


while true
do
    checkFullscreen
    sleep $delay
done


exit 0

/home/user/lo_start.sh
#!/bin/bash
sleep 30
/home/user/lightsOn.sh

/home/user/lo_stop.sh
#!/bin/bash
kill -9 `pgrep -f /home/user/lightsOn.sh`

и добавляем в /etc/gdm/PostSession/Default строчку перед exit 0
Цитировать
/home/user/lo_stop.sh

ну и не забываем сделать chmod +x трём созданным файлам.
/home/user меняем на путь к своему домашнему каталогу
« Последнее редактирование: 19 Март 2012, 19:56:35 от vmlinuz »
Вдруг из маминой из спальни ОЛОЛО ПЫЩ ПЫЩЬ РИАЛЬНИ

Оффлайн MEXAHOTABOP

  • Активист
  • *
  • Сообщений: 902
    • Просмотр профиля
Re: lightsOn
« Ответ #5 : 19 Март 2012, 20:30:20 »
/home/user замени на ~
просто вставь в шапку скрипта что то типо такого
if ["start"=="$2"]
then
    sleep=30
    ~/lightsOn.sh
    exit 0
fi
if ["stop"=="$2"]
killall lightsOn.sh
exit 0
fi
почему второй потому что первый аргумент занят таймаутами
ток мне кажется что это какой то быдлокод выходит
« Последнее редактирование: 19 Март 2012, 20:39:35 от MEXAHOTABOP »
http://fonline.ru/ заходите

Оффлайн vmlinuz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
  • ПОТС ЗОХВАЧЕН11 Ъеччожа
    • Просмотр профиля
Re: lightsOn
« Ответ #6 : 19 Март 2012, 22:16:35 »
быдлокод - наше всё  ;D
в общем буду работать в сторону нормальной оптимизации скрипта, на всё времени не хватает :)
Вдруг из маминой из спальни ОЛОЛО ПЫЩ ПЫЩЬ РИАЛЬНИ

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: lightsOn
« Ответ #7 : 21 Март 2012, 09:16:35 »
Измените название темы на более информативное, иначе тема будет закрыта.

Оффлайн vmlinuz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
  • ПОТС ЗОХВАЧЕН11 Ъеччожа
    • Просмотр профиля
Измените название темы на более информативное, иначе тема будет закрыта.
изменил
Вдруг из маминой из спальни ОЛОЛО ПЫЩ ПЫЩЬ РИАЛЬНИ

Оффлайн acehd

  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
Насколько я понял, ligthsOn отключает скринсейвер только в fullscreen. Часто смотрю в обычном режиме, поэтому своял костыль:

#!/bin/bash


resetScreensaver()
{
dbus-send --session --type=method_call --dest=org.gnome.ScreenSaver --reply-timeout=20000 /org/gnome/ScreenSaver org.gnome.ScreenSaver.SimulateUserActivity > /dev/null

}

while true
do
isRunning=`pgrep -l plugin-containe | grep -wc plugin-containe`
if [ $isRunning -ge 1 ]; then

nowTime=`ps -o time $(pgrep plugin-containe)`
if [ "$nowTime" != "$lastTime" ]; then
resetScreensaver
lastTime=$nowTime
fi

fi

sleep 140
done


exit 0

Скрипт каждые 140 секунд (заставка у меня 5 минут) проверяет наличие процесса plugin-containe и если его время изменяется (идет просмотр), то симулируется активность через dbus. Работает только с gnome-screensaver и firefox.

 

Страница сгенерирована за 0.105 секунд. Запросов: 25.