+#!/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 kscreensaver 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/kscreensaver and PowerManagement.
+mplayer_detection=0
+vlc_detection=0
+firefox_flash_detection=1
+chromium_flash_detection=1
+
+
+# YOU SHOULD NOT NEED TO MODIFY ANYTHING BELOW THIS LINE
+
+[[ $(which xdg-screensaver 2> /dev/null) ]] || { echo "You need to install xdg-utils!"; exit 1; }
+
+# enumerate all the attached screens
+displays=""
+while read id
+do
+ displays="$displays $id"
+done< <(xvinfo | sed -n 's/^screen #\([0-9]\+\)$/\1/p')
+
+delayed=0
+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
+ var=$?
+ if [[ $delayed -eq 0 && $var -eq 1 ]];then
+ delayScreensaver
+ delayed=1
+ elif [[ $delayed -eq 1 && $var -ne 1 ]]; then
+ enableScreensaver
+ delayed=0
+ fi
+
+ 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`
+ 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 -fl "chromium --type=plugin --plugin-path=/usr/lib/mozilla/plugins/libflashplayer.so" | wc -l`
+ 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`
+ 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`
+ if [ $vlc_process -ge 1 ]; then
+ return 1
+ fi
+ fi
+ fi
+
+
+return 0
+}
+
+
+delayScreensaver()
+{
+
+ # reset inactivity time counter so screensaver is not started
+ xdg-screensaver suspend $activ_win_id
+
+ #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
+
+}
+
+enableScreensaver()
+{
+ xdg-screensaver resume $activ_win_id
+}
+
+
+delay=$1
+
+
+# If argument empty, use 50 seconds as default.
+if [ -z "$1" ];then
+ delay=50
+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