]> git.donarmstrong.com Git - bin.git/blob - screensaver
add reset usb bus command
[bin.git] / screensaver
1 #!/usr/bin/env python3
2
3 import argparse
4 import sys
5 import psutil
6 import subprocess
7 import os
8
9 screensavers = [
10     # slock
11     {'start': ['xautolock','-locker','slock'],
12      'stop': ['xautolock','-exit'],
13      'test': lambda : cmd_exists('xautolock') and cmd_exists('slock'),
14      'running': 'xautolock',
15     },
16     # xscreensaver
17     {'start' : ['XENVIRONMENT=~/.xscreensaver','/usr/bin/xscreensaver'],
18      'stop' : ['xscreensaver-command','-exit'],
19      'test' : lambda : cmd_exists('xscreensaver'),
20      'running' : 'xscreensaver',
21     },
22     # xautolock
23     {'start': ('xautolock','-notifier','true','-bell','0'),
24      'stop': ('xautolock','-exit'),
25      'test': lambda : cmd_exists('xautolock'),
26      'running' : 'xautolock',
27     },
28 ]
29
30 #' Determine if named command exists on the path and is executable
31 def cmd_exists (cmd):
32     return True
33
34 def cmd_running (cmd):
35     user = os.getuid()
36     for proc in psutil.process_iter():
37         if proc.name() == cmd and proc.is_running() and proc.uids()[0] == user:
38             return True
39     return False
40
41 def parse_arguments():
42     """Parses the arguments for the screensaver command
43     """
44     parser = argparse.ArgumentParser(
45         description="A command to turn on/off screesavers"
46         )
47     parser.add_argument('command',choices=('sleep','off','stop','on','start'))
48     return parser.parse_args()
49
50 def fork(cmd):
51     try: 
52         pid = os.fork() 
53         if pid > 0:
54             # parent process so return
55             return
56     except OSError as e:
57         print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror) 
58         sys.exit(1)
59
60     os.setsid()
61     try: 
62         pid = os.fork() 
63         if pid > 0:
64             # parent process so return
65             return
66     except OSError as e:
67         print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror) 
68         sys.exit(1)
69     subprocess.Popen(cmd)
70     os._exit(os.EX_OK)
71
72 def fork_sleep_and_forget(delay,cmd):
73     sleep(delay)
74     fork(cmd)
75
76     
77 def should_stop(args):
78     if args.command == 'stop' or args.command == 'off':
79         return True
80     return False
81
82 def should_start(args):
83     if args.command == 'start' or args.command == 'on':
84         return True
85     return False
86
87 def should_sleep(args):
88     if args.command == 'sleep' or args.command == 'pause':
89         return True
90     return False
91
92 args = parse_arguments()
93
94 for screensaver in screensavers:
95     if screensaver['test']():
96         if should_stop(args):
97             if cmd_running(screensaver['running']):
98                 fork(screensaver['stop'])
99         elif should_start(args):
100             if not cmd_running(screensaver['running']):
101                 fork(screensaver['start'])
102         elif should_sleep(args):
103             if cmd_running(screensaver['running']):
104                 fork(screensaver['stop'])
105             fork_sleep_and_forget(args.sleep,screensaver['start'])
106         else:
107             print >>sys.stderr,"Unknown command"
108         exit(0)
109         
110 print >> sys.stderr,"No screensaver"
111