From c2025c17441236bd2fb2cea16a87587931cc3fb4 Mon Sep 17 00:00:00 2001 From: Dag Wieers Date: Fri, 13 Apr 2018 02:00:30 +0200 Subject: [PATCH] Various improvements This PR includes: - Update to 0.9.0 - Settings includes better feedback to user - Pop-ups include an icon and standad title - Pop-ups remaing for 10 seconds --- addon.xml | 4 +-- resources/language/English/strings.xml | 23 ++++++++++---- resources/settings.xml | 21 ++++++++---- screensaver.py | 44 +++++++++++++++++--------- 4 files changed, 62 insertions(+), 30 deletions(-) diff --git a/addon.xml b/addon.xml index 11a40d1..420346b 100644 --- a/addon.xml +++ b/addon.xml @@ -1,9 +1,9 @@ - + all Screensaver that turns your screen off to save power - The Off screensaver turns your TV, projector or monitor off, so it can actually "save your screen". + The Turn Off screensaver turns your TV, projector or monitor off, like any old fashioned screensaver is intended to do. http://github.com/dagwieers/plugin.screensaver.off GPL3+ dag@wieers.com diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 73c9e93..cf71474 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -5,19 +5,26 @@ Display - Display method - Not all 'Display methods' work on every system. Carefully test. + Pick a method for turning off your display + Display method + Not all 'Display methods' work on every system. Carefully test. + - CEC methods require CEC device support. Check vendor manual. + - No Signal method disables video signal. Device may go to sleep or turn off. + - DPMS methods make use of VESA DPMS capabilities of your monitor. + Press HOME or BACK key on remote to return from screen saver. + NOTE: Not every device can be powered on automatically. Do nothing - CEC Standby (built-in) - Raspberry Pi (using vcgencmd) + CEC (built-in) + No Signal on Raspberry Pi (using vcgencmd) DPMS (built-in) DPMS (using xset) DPMS (using vbetool) DPMS (using xrandr) - Android CEC (kernel) + CEC on Android (kernel) Power - Power method - Don't change this unless you know exactly what you are doing. + Pick a method for turning off your system + Power method + Don't change this unless you know exactly what you are doing. Do nothing Suspend (built-in) Hibernate (built-in) @@ -29,6 +36,8 @@ Options When activating screensaver... Log off user + Useful in case you have parental controls enabled. Mute audio + Ensure no audio is produced inadvertently, e.g. when using A/V receiver. diff --git a/resources/settings.xml b/resources/settings.xml index fe5b375..c6a683a 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -1,16 +1,25 @@ - - + + + + + + + + - - + + + - - + + + + diff --git a/screensaver.py b/screensaver.py index 8a261b0..01b23a8 100644 --- a/screensaver.py +++ b/screensaver.py @@ -6,16 +6,30 @@ import xbmcgui -def _popup(title='', msg='', delay=5000, image= ''): +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(title='', msg='', delay=10000, image=''): + if not title: + title = '%s screensaver failed' % addon_name + if not image: + image = addon_icon xbmc.executebuiltin('XBMC.Notification("%s","%s",%d,"%s")' % (title, msg, delay, image)) + def _run_builtin(builtin): - xbmc.log(msg="[%s] Executing builtin '%s'" % (addon_name, builtin), level=xbmc.LOGNOTICE) + _log_notice(msg="Executing builtin '%s'" % builtin) try: xbmc.executebuiltin(builtin) except Exception as e: - xbmc.log(msg="[%s] Exception executing builtin '%s': %s" % (addon_name, builtin, e), level=xbmc.LOGERROR) - _popup(title='Screensaver failed', msg="[%s] Exception executing builtin '%s': %s" % (addon_name, builtin, 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 @@ -23,20 +37,19 @@ def _run_command(command, shell=False): cmd = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=shell) (out, err) = cmd.communicate() if cmd.returncode == 0: - xbmc.log(msg="[%s] Running command '%s' returned rc=%s" % (addon_name, ' '.join(command), cmd.returncode), level=xbmc.LOGNOTICE) + _log_notice(msg="Running command '%s' returned rc=%s" % (' '.join(command), cmd.returncode)) else: - xbmc.log(msg="[%s] Running command '%s' failed with rc=%s" % (addon_name, ' '.join(command), cmd.returncode), level=xbmc.LOGERROR) + _log_error(msg="Running command '%s' failed with rc=%s" % (' '.join(command), cmd.returncode)) if err: - xbmc.log(msg="[%s] Command '%s' returned on stderr: %s" % (addon_name, command[0], err), level=xbmc.LOGERROR) + _log_error(msg="Command '%s' returned on stderr: %s" % (command[0], err)) if out: - xbmc.log(msg="[%s] Command '%s' returned on stdout: %s " % (addon_name, command[0], out), level=xbmc.LOGERROR) - _popup(title='Screensaver failed', msg="%s\n%s" % (out, err)) + _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: - xbmc.log(msg="[%s] Exception running '%s': %s" % (addon_name, command[0], e), level=xbmc.LOGERROR) - _popup(title='Screensaver failed', msg="Exception running '%s': %s" % (command[0], e)) + _log_error(msg="Exception running '%s': %s" % (command[0], e)) + _popup(msg="Exception running '%s': %s" % (command[0], e)) sys.exit(2) - # TODO: Show pop-up on failure class Screensaver(xbmcgui.WindowXMLDialog): @@ -53,7 +66,7 @@ def onInit(self): self._monitor = self.Monitor(self.exit) # Power off system - xbmc.log(msg='[%s] Turn system off using method %s' % (addon_name, power_method), level=xbmc.LOGNOTICE) + _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': # ShutDown action (built-in) @@ -78,7 +91,7 @@ def exit(self): _run_builtin('Mute') # Turn on display - xbmc.log(msg='[%s] Turn display signal back on using method %s' % (addon_name, display_method), level=xbmc.LOGNOTICE) + _log_notice(msg='Turn display signal back on using method %s' % display_method) if display_method == '1': # CEC Standby (built-in) _run_builtin('CECActivateSource') elif display_method == '2': # Raspberry Pi (using vcgencmd) @@ -104,13 +117,14 @@ def exit(self): addon_name = addon.getAddonInfo('name') addon_path = addon.getAddonInfo('path') + addon_icon = addon.getAddonInfo('icon') display_method = addon.getSetting('display_method') power_method = addon.getSetting('power_method') logoff = addon.getSetting('logoff') mute = addon.getSetting('mute') # Turn off display - xbmc.log(msg='[%s] Turn display signal off using method %s' % (addon_name, display_method), level=xbmc.LOGNOTICE) + _log_notice(msg='Turn display signal off using method %s' % display_method) if display_method == '1': # CEC Standby (built-in) _run_builtin('CECStandby') elif display_method == '2': # Raspberry Pi (using vcgencmd)