forked from iye/lightsOn
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathlightsOn.sh
executable file
·377 lines (316 loc) · 12.5 KB
/
lightsOn.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
#!/bin/bash
# lightsOn.sh
# Copyright (c) 2013 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, minitube, and VLC when they are fullscreen too.
# Also, screensaver can be prevented when certain specified programs are running.
# 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, Minitube
# VLC, Firefox, Chrome 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 X seconds.
# Where X is calculated based on your system sleep time, with a minimum of $default_sleep_delay.
#
# An optional array variable exists here to add the names of programs that will delay the screensaver if they're running.
# This can be useful if you want to maintain a view of the program from a distance, like a music playlist for DJing,
# or if the screensaver eats up CPU that chops into any background processes you have running,
# such as realtime music programs like Ardour in MIDI keyboard mode.
# If you use this feature, make sure you use the name of the binary of the program (which may exist, for instance, in /usr/bin).
# DEBUG=0 for no output
# DEBUG=1 for sleep prints
# DEBUG=2 for everything
DEBUG=1
# this is actually the minimum allowed dynamic delay; also the default (if something fails)
default_sleep_delay=50
# Modify these variables if you want this script to detect if Mplayer,
# VLC, Minitube, or Firefox or Chromium Flash Video are Fullscreen and disable
# xscreensaver/kscreensaver and PowerManagement.
mplayer_detection=1
vlc_detection=1
firefox_flash_detection=1
firefox_html5_detection=1
chromium_flash_detection=1
chrome_pepper_flash_detection=1
chrome_html5_detection=1
minitube_detection=0
# Names of programs which, when running, you wish to delay the screensaver.
delay_progs=() # For example ('ardour2' 'gmpc')
# YOU SHOULD NOT NEED TO MODIFY ANYTHING BELOW THIS LINE
log() {
if [ $DEBUG -eq 2 ]; then
echo $@
elif [ $DEBUG -eq 1 ]; then
if [ "$(echo $@ | grep -c "sleeping for")" == "1" ]; then
echo $@
fi
fi
}
# 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, kscreensaver or none)
screensaver=`pgrep -l xscreensaver | grep -wc xscreensaver`
if [ $screensaver -ge 1 ]; then
screensaver=xscreensaver
log "xscreensaver detected"
else
screensaver=`pgrep -l kscreensaver | grep -wc kscreensaver`
if [ $screensaver -ge 1 ]; then
screensaver=kscreensaver
log "kscreensaver detected"
else
screensaver=`pgrep -l xautolock | grep -wc xautolock`
if [ $screensaver -ge 1 ]; then
screensaver=xautolock
log "xautolock detected"
else
screensaver=None
log "No screensaver detected"
fi
fi
fi
checkDelayProgs()
{
log "checkDelayProgs()"
for prog in "${delay_progs[@]}"; do
if [ `pgrep -lfc "$prog"` -ge 1 ]; then
log "checkDelayProgs(): Delaying the screensaver because a program on the delay list, \"$prog\", is running..."
delayScreensaver
break
fi
done
}
checkFullscreen()
{
log "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
if [[ -n $activ_win_id ]]; then
isActivWinFullscreen=`DISPLAY=:0.${display} xprop -id $activ_win_id | grep _NET_WM_STATE_FULLSCREEN`
log "checkFullscreen(): Display: $display isFullScreen: \"$isActivWinFullscreen\""
if [[ "$isActivWinFullscreen" = *NET_WM_STATE_FULLSCREEN* ]];then
log "checkFullscreen(): Fullscreen detected"
isAppRunning
var=$?
if [[ $var -eq 1 ]];then
delayScreensaver
return
fi
isFirefoxFlashRunning
var=$?
if [[ $var -eq 1 ]];then
delayScreensaver
fi
# If no Fullscreen active => set dpms on
else
log "checkFullscreen(): NO fullscreen detected"
xset dpms
fi
fi
done
}
# flash doesn't display as "full screen" on firefox,
# so we treat it as a special case
# We just look for focus
isFirefoxFlashRunning()
{
log "isFirefoxFlashRunning()"
#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
log "isFirefoxFlashRunning(): firefox flash fullscreen detected"
return 1
fi
fi
fi
return 0
}
# 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()
{
log "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 HTML Video fullscreen on Firefox, modify variable firefox_html5_detection if you dont want Firefox detection
if [ $firefox_html5_detection == 1 ];then
if [[ "$activ_win_title" = *Firefox* ]];then
# Check if firefox process is actually running
firefox_process=`pgrep -lfc "firefox"`
if [[ $firefox_process -ge 1 ]];then
log "isAppRunning(): firefox html5 fullscreen detected"
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/Chrome Flash process is running
flash_process=`pgrep -lfc ".*chromium.*flashp.*"`
if [[ $flash_process -ge 1 ]];then
log "isAppRunning(): chromium flash fullscreen detected"
return 1
fi
fi
fi
# Check if user want to detect flash fullscreen on Chrome, modify variable chrome_pepper_flash_detection if you dont want Chrome pepper flash detection.
if [ $chrome_pepper_flash_detection == 1 ];then
if [[ "$activ_win_title" = *google-chrome* ]];then
# Check if Chromium/Chrome Flash process is running
chrome_process=`pgrep -lfc "(c|C)hrome --type=ppapi "`
if [[ $chrome_process -ge 1 ]];then
log "isAppRunning(): chrome fullscreen detected"
return 1
fi
fi
fi
# Check if user want to detect html5 fullscreen on Chrome, modify variable chrome_html5_detection if you dont want Chrome html5 detection.
if [ $chrome_html5_detection == 1 ];then
if [[ "$activ_win_title" = *google-chrome* ]];then
# Check if Chrome html5 process is running
chrome_process=`pgrep -lfc "(c|C)hrome --type=gpu-process "`
if [[ $chrome_process -ge 1 ]];then
log "isAppRunning(): chrome html5 fullscreen detected"
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`
if [ $mplayer_process -ge 1 ]; then
log "isAppRunning(): mplayer fullscreen detected"
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`
if [ $vlc_process -ge 1 ]; then
log "isAppRunning(): vlc fullscreen detected"
return 1
fi
fi
fi
# Check if user want to detect minitube fullscreen, modify variable minitube_detection
if [ $minitube_detection == 1 ];then
if [[ "$activ_win_title" = *minitube* ]];then
#check if minitube is running.
#minitube_process=`pgrep -l minitube | grep -wc minitube`
minitube_process=`pgrep -lc minitube`
if [ $minitube_process -ge 1 ]; then
log "isAppRunning(): minitube fullscreen detected"
return 1
fi
fi
fi
return 0
}
delayScreensaver()
{
# reset inactivity time counter so screensaver is not started
if [ "$screensaver" == "xscreensaver" ]; then
log "delayScreensaver(): delaying xscreensaver..."
xscreensaver-command -deactivate > /dev/null
elif [ "$screensaver" == "kscreensaver" ]; then
log "delayScreensaver(): delaying kscreensaver..."
qdbus org.freedesktop.ScreenSaver /ScreenSaver SimulateUserActivity > /dev/null
elif [ "$screensaver" == "xautolock" ]; then
log "delayScreensaver(): delaying xautolock..."
xautolock -disable
xautolock -enable
else
log "delayScreensaver(): delaying org.gnome.ScreenSaver..."
dbus-send --session --dest=org.gnome.ScreenSaver --type=method_call /org/gnome/ScreenSaver org.gnome.ScreenSaver.SimulateUserActivity
fi
#Check if DPMS is on. If it is, deactivate. If it is not, do nothing.
dpmsStatus=`xset -q | grep -ce 'DPMS is Enabled'`
if [ $dpmsStatus == 1 ];then
xset -dpms
# moved to checkFullscreen().
#xset dpms
fi
}
_sleep()
{
if [ $dynamicDelay -eq 0 ]; then
log "sleeping for $delay"
sleep $delay
else
if [ "$(cat /sys/class/power_supply/AC/online)" == "1" ]; then
system_sleep_delay=$(gsettings get org.gnome.settings-daemon.plugins.power sleep-display-ac 2>/dev/null)
else
system_sleep_delay=$(gsettings get org.gnome.settings-daemon.plugins.power sleep-display-battery 2>/dev/null)
fi
if [ "$(echo $system_sleep_delay | egrep -c "^[0-9]+$")" == "1" ]; then
if [ $system_sleep_delay -le $(($default_sleep_delay+5)) ]; then
sleep_delay=$default_sleep_delay
else
sleep_delay=$(($system_sleep_delay-5))
fi
else
sleep_delay=$default_sleep_delay
fi
log "sleeping for $sleep_delay (system idle timeout is $system_sleep_delay)"
sleep $sleep_delay
fi
}
delay=$1
dynamicDelay=0
# If argument empty, use dynamic delay.
if [ -z "$1" ];then
dynamicDelay=1
log "no delay specified, dynamicDelay=1"
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
checkDelayProgs
checkFullscreen
_sleep $delay
done
exit 0