8f44a1bf63
Redshift might block when no network connectivity is available (if it tries to determine the location automatically). To avoid this blocking the whole status line, immediately release the lock in the query thread.
83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
# pylint: disable=C0111,R0903
|
|
|
|
"""Displays the current color temperature of redshift
|
|
|
|
Requires the following executable:
|
|
* redshift
|
|
"""
|
|
|
|
import threading
|
|
|
|
import bumblebee.input
|
|
import bumblebee.output
|
|
import bumblebee.engine
|
|
|
|
def is_terminated():
|
|
for thread in threading.enumerate():
|
|
if thread.name == "MainThread" and not thread.is_alive():
|
|
return True
|
|
return False
|
|
|
|
def get_redshift_value(widget):
|
|
while True:
|
|
if is_terminated():
|
|
return
|
|
widget.get("condition").acquire()
|
|
while True:
|
|
try:
|
|
widget.get("condition").wait(1)
|
|
except RuntimeError:
|
|
continue
|
|
break
|
|
widget.get("condition").release()
|
|
|
|
try:
|
|
res = bumblebee.util.execute("redshift -p")
|
|
except Exception:
|
|
res = ""
|
|
widget.set("temp", "n/a")
|
|
widget.set("transition", None)
|
|
for line in res.split("\n"):
|
|
if "temperature" in line.lower():
|
|
widget.set("temp", line.split(" ")[2])
|
|
if "period" in line.lower():
|
|
state = line.split(" ")[1].lower()
|
|
if "day" in state:
|
|
widget.set("state", "day")
|
|
elif "night" in state:
|
|
widget.set("state", "night")
|
|
else:
|
|
widget.set("state", "transition")
|
|
widget.set("transition", " ".join(line.split(" ")[2:]))
|
|
|
|
class Module(bumblebee.engine.Module):
|
|
def __init__(self, engine, config):
|
|
widget = bumblebee.output.Widget(full_text=self.text)
|
|
super(Module, self).__init__(engine, config, widget)
|
|
self._text = ""
|
|
self._condition = threading.Condition()
|
|
widget.set("condition", self._condition)
|
|
self._thread = threading.Thread(target=get_redshift_value, args=(widget,))
|
|
self._thread.start()
|
|
self._condition.acquire()
|
|
self._condition.notify()
|
|
self._condition.release()
|
|
|
|
def text(self, widget):
|
|
return "{}".format(self._text)
|
|
|
|
def update(self, widgets):
|
|
widget = widgets[0]
|
|
self._condition.acquire()
|
|
self._condition.notify()
|
|
self._condition.release()
|
|
temp = widget.get("temp", "n/a")
|
|
self._text = temp
|
|
transition = widget.get("transition", None)
|
|
if transition:
|
|
self._text = "{} {}".format(temp, transition)
|
|
|
|
def state(self, widget):
|
|
return widget.get("state", None)
|
|
|
|
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|