From 507b0a43df682bcaac2a7a30dbb8aab6d8cf912c Mon Sep 17 00:00:00 2001 From: Don Armstrong Date: Sun, 5 Aug 2018 18:40:23 -0700 Subject: [PATCH] switch screensaver control to python --- screensaver | 173 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 111 insertions(+), 62 deletions(-) diff --git a/screensaver b/screensaver index a0c1942..8a867f8 100755 --- a/screensaver +++ b/screensaver @@ -1,62 +1,111 @@ -#!/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" + -- 2.39.2