-#!/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"
+