forked from add-ons/screensaver.turnoff
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscreensaver.py
171 lines (141 loc) · 6.57 KB
/
screensaver.py
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
import sys
import subprocess
import xbmc
import xbmcaddon
import xbmcgui
import time
def log_error(msg='', level=xbmc.LOGERROR):
xbmc.log(msg='[%s] %s' % (addon_name, msg), level=level)
def log_notice(msg='', level=xbmc.LOGNOTICE):
xbmc.log(msg='[%s] %s' % (addon_name, msg), level=level)
def popup(heading='', msg='', delay=10000, icon=''):
if not heading:
heading = '%s screensaver failed' % addon_name
if not icon:
icon = addon_icon
xbmcgui.Dialog().notification(heading, msg, icon, delay)
def run_builtin(builtin):
log_notice(msg="Executing builtin '%s'" % builtin)
try:
xbmc.executebuiltin(builtin)
except Exception as e:
log_error(msg="Exception executing builtin '%s': %s" % (builtin, e))
popup(msg="Exception executing builtin '%s': %s" % (builtin, e))
def run_command(command, shell=False):
# TODO: Add options for running using su or sudo
try:
cmd = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=shell)
(out, err) = cmd.communicate()
if cmd.returncode == 0:
log_notice(msg="Running command '%s' returned rc=%s" % (' '.join(command), cmd.returncode))
else:
log_error(msg="Running command '%s' failed with rc=%s" % (' '.join(command), cmd.returncode))
if err:
log_error(msg="Command '%s' returned on stderr: %s" % (command[0], err))
if out:
log_error(msg="Command '%s' returned on stdout: %s " % (command[0], out))
popup(msg="%s\n%s" % (out, err))
sys.exit(1)
except Exception as e:
log_error(msg="Exception running '%s': %s" % (command[0], e))
popup(msg="Exception running '%s': %s" % (command[0], e))
sys.exit(2)
class Screensaver(xbmcgui.WindowXMLDialog):
class Monitor(xbmc.Monitor):
def __init__(self, callback):
self._callback = callback
def onScreensaverDeactivated(self):
self._callback()
def __init__(self, *args, **kwargs):
pass
def onInit(self):
self._monitor = self.Monitor(self.exit)
# Turn off display
if display_method != 0:
log_notice(msg='Turn display signal off using method %s' % display_method)
if display_method == '1': # CEC (built-in)
run_builtin('CECStandby')
elif display_method == '2': # No Signal on Raspberry Pi (using vcgencmd)
run_command(['vcgencmd', 'display_power', '0'])
elif display_method == '3': # DPMS (built-in)
run_builtin('ToggleDPMS')
elif display_method == '4': # DPMS (using xset)
run_command(['xset', 'dpms', 'force', 'off'])
elif display_method == '5': # DPMS (using vbetool)
run_command(['vbetool', 'dpms', 'off'])
elif display_method == '6': # DPMS (using xrandr)
# NOTE: This needs more outside testing
run_command(['xrandr', '--output CRT-0', 'off'])
elif display_method == '7': # CEC on Android (kernel)
# NOTE: This needs more outside testing
run_command(['su', '-c', 'echo 0 >/sys/devices/virtual/graphics/fb0/cec'], shell=True)
# FIXME: Screensaver always seems to lock when started, requires unlock and re-login
# Log off user
if logoff == 'true':
run_builtin('System.Logoff()')
# Mute audio
if mute == 'true':
run_builtin('Mute')
# Power off system
if power_method != 0:
log_notice(msg='Turn system off using method %s' % power_method)
if power_method == '1': # Suspend (built-in)
run_builtin('Suspend')
elif power_method == '2': # Hibernate (built-in)
run_builtin('Hibernate')
elif power_method == '3': # Quit (built-in)
run_builtin('Quit')
elif power_method == '4': # ShutDown action (built-in)
run_builtin('ShutDown')
elif power_method == '5': # Reboot (built-in)
run_builtin('Reboot')
elif power_method == '6': # PowerDown (built-in)
run_builtin('PowerDown')
elif power_method == '7': # Android POWER key event (using input)
run_command(['su', '-c', 'input keyevent KEYCODE_POWER'], shell=True)
def onAction(self, action):
self.exit()
def exit(self):
# Unmute audio
if mute == 'true':
run_builtin('Mute')
# Turn on display
if display_method != 0:
log_notice(msg='Turn display signal back on using method %s' % display_method)
if display_method == '1': # CEC (built-in)
cec_timeout_number = int(cec_timeout)
if cec_timeout_message== 'true' and cec_timeout_number > 0: popup(msg="Cec activation delayed by %s s" % (cec_timeout_number),heading="Delayed activation")
time.sleep(cec_timeout_number)
if cec_timeout_message== 'true' and cec_timeout_number > 0: popup(msg="Cec activated",heading="Delayed activation")
run_builtin('CECActivateSource')
elif display_method == '2': # No Signal on Raspberry Pi (using vcgencmd)
run_command(['vcgencmd', 'display_power', '1'])
elif display_method == '3': # DPMS (built-in)
run_builtin('ToggleDPMS')
elif display_method == '4': # DPMS (using xset)
run_command(['xset', 'dpms', 'force', 'on'])
elif display_method == '5': # DPMS (using vbetool)
run_command(['vbetool', 'dpms', 'on'])
elif display_method == '6': # DPMS (using xrandr)
# NOTE: This needs more outside testing
run_command(['xrandr', '--output CRT-0', 'on'])
elif display_method == '7': # CEC on Android (kernel)
# NOTE: This needs more outside testing
run_command(['su', '-c', 'echo 1 >/sys/devices/virtual/graphics/fb0/cec'], shell=True)
del self._monitor
self.close()
if __name__ == '__main__':
addon = xbmcaddon.Addon()
addon_name = addon.getAddonInfo('name')
addon_path = addon.getAddonInfo('path')
addon_icon = addon.getAddonInfo('icon')
display_method = addon.getSetting('display_method')
cec_timeout = addon.getSetting('cec_timeout')
cec_timeout_message = addon.getSetting('cec_timeout_message')
power_method = addon.getSetting('power_method')
logoff = addon.getSetting('logoff')
mute = addon.getSetting('mute')
# Do not start screensaver when command fails
screensaver = Screensaver('screensaver-turnoff.xml', addon_path, 'default')
screensaver.doModal()
del screensaver