From 5474980b11ab20e8706cf57d98a1f684e9c11c4e Mon Sep 17 00:00:00 2001 From: enkore Date: Fri, 22 Feb 2013 21:23:58 +0100 Subject: [PATCH] Support for standalone operation Specify standalone=True to the I3statushandler constructor to run i3pystatus without i3status in the background. i3pystatus won't read input from stdin or any other file object specified with input_stream. The keyword argument interval specifies how often output should be generated. The default is 1 (second). Sorry guys for changing the way i3pystatus "way of operation" is set so often. If you're want the "self-contained" mode (you execute i3pystatus, i3pystatus automatically starts i3status), don't set the file attribute, but pass the file descriptor of the pipe as input_stream like this: process = subprocess.Popen(["i3status", "-c", "~/.i3/status"], stdout=subprocess.PIPE, universal_newlines=True) status = i3pystatus(input_stream=process.stdout) On a side note: The main class name has been changed to i3pystatus, but I3statusHandler is still available as an alias. Use whichever you prefer :-) (Linux is about choice after all) --- i3pystatus/__init__.py | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/i3pystatus/__init__.py b/i3pystatus/__init__.py index 92467c4..a58c8e3 100644 --- a/i3pystatus/__init__.py +++ b/i3pystatus/__init__.py @@ -68,6 +68,34 @@ class IOHandler: raise EOFError() return line +class StandaloneIO(IOHandler): + """ + I/O handler for standalone usage of i3pystatus (w/o i3status) + + writing as usual, reading will always return a empty JSON array, + and the i3bar protocol header + """ + + n = -1 + def __init__(self, interval=1): + super().__init__() + self.interval = interval + + def read(self): + while True: + yield self.read_line() + time.sleep(self.interval) + + def read_line(self): + self.n += 1 + + if self.n == 0: + return '{"version": 1}' + elif self.n == 1: + return "[" + else: + return ",[]" + class JSONIO: def __init__(self, io): self.io = io @@ -97,9 +125,14 @@ class JSONIO: yield j self.io.write_line(prefix + json.dumps(j)) -class I3statusHandler: +class i3pystatus: modules = [] - file = sys.stdin + + def __init__(self, standalone=False, interval=1, input_stream=sys.stdin): + if standalone: + self.io = StandaloneIO(interval) + else: + self.io = IOHandler(input_stream) def register(self, module, position=0): """Register a new module.""" @@ -109,6 +142,8 @@ class I3statusHandler: module.registered(self) def run(self): - for j in JSONIO(IOHandler(self.file)).read(): + for j in JSONIO(self.io).read(): for module in self.modules: j.insert(module.position, module.output) + +I3statusHandler = i3pystatus