Introduced asynchronous plugins that gather their data on different intervals than the mainloop. Here it is used for the modsde plugin. The statushandler has a new class Module, which acts as documentation for the API These changes let the output evenly flow, even if an async plugin hangs due to network problems or similiar issues.
86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
#!/usr/bin/env python
|
|
|
|
import sys
|
|
import json
|
|
import urllib.request, urllib.error, urllib.parse
|
|
|
|
class Module(object):
|
|
output = None
|
|
async = False
|
|
|
|
def registered(self, status_handler):
|
|
"""Called when this module is registered with a status handler"""
|
|
|
|
def run(self):
|
|
"""Only called if self.async == False. Called once per tick"""
|
|
|
|
class I3statusHandler(object):
|
|
modules = []
|
|
|
|
def __init__(self):
|
|
pass
|
|
|
|
def register_module(self, module):
|
|
"""Register a new module."""
|
|
|
|
# check if module implemented the
|
|
# correct functions
|
|
#if not hasattr(module, 'output'):
|
|
# raise Exception("Module %s does not implement \
|
|
# all the needed functions!".format(module))
|
|
|
|
self.modules.append(module)
|
|
|
|
def print_line(self, message):
|
|
"""Unbuffered printing to stdout."""
|
|
|
|
sys.stdout.write(message + '\n')
|
|
sys.stdout.flush()
|
|
|
|
def read_line(self):
|
|
"""Interrupted respecting reader for stdin."""
|
|
|
|
# try reading a line, removing any extra whitespace
|
|
try:
|
|
line = sys.stdin.readline().strip()
|
|
# i3status sends EOF, or an empty line
|
|
if not line:
|
|
sys.exit(3)
|
|
return line
|
|
# exit on ctrl-c
|
|
except KeyboardInterrupt:
|
|
sys.exit()
|
|
|
|
def run(self):
|
|
self.print_line(self.read_line())
|
|
self.print_line(self.read_line())
|
|
|
|
while True:
|
|
line, prefix = self.read_line(), ''
|
|
|
|
# ignore comma at start of lines
|
|
if line.startswith(','):
|
|
line, prefix = line[1:], ','
|
|
|
|
j = [] #json.loads(line)
|
|
|
|
for module in self.modules:
|
|
if not module.async:
|
|
module.tick()
|
|
|
|
output = module.output
|
|
|
|
if output:
|
|
j.insert(0, output)
|
|
|
|
# and echo back new encoded json
|
|
self.print_line(prefix+json.dumps(j))
|
|
|
|
|
|
def has_internet_connection():
|
|
try:
|
|
response=urllib2.urlopen('http://173.194.69.94',timeout=1)
|
|
return True
|
|
except urllib2.URLError as err: pass
|
|
return False
|