]> git.donarmstrong.com Git - bin.git/commitdiff
switch screensaver control to python
authorDon Armstrong <don@donarmstrong.com>
Mon, 6 Aug 2018 01:40:23 +0000 (18:40 -0700)
committerDon Armstrong <don@donarmstrong.com>
Mon, 6 Aug 2018 01:40:23 +0000 (18:40 -0700)
screensaver

index a0c194220b63b1494ef4b0d83477942a8db873f9..8a867f89bde0081cf1b233473c0849d0d236b4e8 100755 (executable)
-#!/bin/sh
-
-cmd_exists () {
-    if which "$1" >/dev/null 2>&1; then
-        return 0;
-    else
-        return 1;
-    fi;
-}
-
-fork () {
-    ( "$@" >/dev/null 2>&1 & )
-}
-
-cmd_running () {
-    if pkill -0 -u "$(id -u)" "$1"; then
-        return 0;
-    else
-        return 1;
-    fi;
-}
-
-should_stop () {
-    if [ "x$1" = "xoff" ] || [ "x$1" = "xstop" ] ; then
-        return 0;
-    else
-        return 1;
-    fi;
-}
-
-
-if cmd_exists slock && cmd_exists xautolock; then
-    if cmd_running "xautolock"; then
-        if should_stop "$1"; then
-            xautolock -exit;
-        fi;
-    else
-        if ! should_stop "$1"; then
-            fork xautolock -notifier true -bell 0 -locker slock;
-        fi;
-    fi;
-elif cmd_exists xscreensaver && [ -e ~/.xscreensaver ]; then
-    if cmd_running "xscreensaver"; then
-        if should_stop "$1"; then
-            xscreensaver-command -exit;
-        fi;
-    else
-        if ! should_stop "$1"; then
-            fork XENVIRONMENT=~/.xscreensaver /usr/bin/xscreensaver;
-        fi;
-    fi;
-elif cmd_exists xautolock; then
-    if cmd_running "xautolock"; then
-        if should_stop "$1"; then
-            xautolock -exit;
-        fi;
-    else
-        if ! should_stop "$1"; then
-            fork xautolock -notifier true -bell 0;
-        fi;
-    fi;
-fi;
+#!/usr/bin/env python3
+
+import argparse
+import sys
+import psutil
+import subprocess
+import os
+
+screensavers = [
+    # slock
+    {'start': ['xautolock','-locker','slock'],
+     'stop': ['xautolock','-exit'],
+     'test': lambda : cmd_exists('xautolock') and cmd_exists('slock'),
+     'running': 'xautolock',
+    },
+    # xscreensaver
+    {'start' : ['XENVIRONMENT=~/.xscreensaver','/usr/bin/xscreensaver'],
+     'stop' : ['xscreensaver-command','-exit'],
+     'test' : lambda : cmd_exists('xscreensaver'),
+     'running' : 'xscreensaver',
+    },
+    # xautolock
+    {'start': ('xautolock','-notifier','true','-bell','0'),
+     'stop': ('xautolock','-exit'),
+     'test': lambda : cmd_exists('xautolock'),
+     'running' : 'xautolock',
+    },
+]
+
+#' Determine if named command exists on the path and is executable
+def cmd_exists (cmd):
+    return True
+
+def cmd_running (cmd):
+    user = os.getuid()
+    for proc in psutil.process_iter():
+        if proc.name() == cmd and proc.is_running() and proc.uids()[0] == user:
+            return True
+    return False
+
+def parse_arguments():
+    """Parses the arguments for the screensaver command
+    """
+    parser = argparse.ArgumentParser(
+        description="A command to turn on/off screesavers"
+        )
+    parser.add_argument('command',choices=('sleep','off','stop','on','start'))
+    return parser.parse_args()
+
+def fork(cmd):
+    try: 
+        pid = os.fork() 
+        if pid > 0:
+            # parent process so return
+            return
+    except OSError as e:
+        print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror) 
+        sys.exit(1)
+
+    os.setsid()
+    try: 
+        pid = os.fork() 
+        if pid > 0:
+            # parent process so return
+            return
+    except OSError as e:
+        print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror) 
+        sys.exit(1)
+    subprocess.Popen(cmd)
+    os._exit(os.EX_OK)
+
+def fork_sleep_and_forget(delay,cmd):
+    sleep(delay)
+    fork(cmd)
+
+    
+def should_stop(args):
+    if args.command == 'stop' or args.command == 'off':
+        return True
+    return False
+
+def should_start(args):
+    if args.command == 'start' or args.command == 'on':
+        return True
+    return False
+
+def should_sleep(args):
+    if args.command == 'sleep' or args.command == 'pause':
+        return True
+    return False
+
+args = parse_arguments()
+
+for screensaver in screensavers:
+    if screensaver['test']():
+        if should_stop(args):
+            if cmd_running(screensaver['running']):
+                fork(screensaver['stop'])
+        elif should_start(args):
+            if not cmd_running(screensaver['running']):
+                fork(screensaver['start'])
+        elif should_sleep(args):
+            if cmd_running(screensaver['running']):
+                fork(screensaver['stop'])
+            fork_sleep_and_forget(args.sleep,screensaver['start'])
+        else:
+            print >>sys.stderr,"Unknown command"
+        exit(0)
+        
+print >> sys.stderr,"No screensaver"
+