bumblebee-status/bumblebee_status/modules/core/redshift.py

121 lines
3.8 KiB
Python
Raw Normal View History

2020-03-07 14:06:01 +01:00
# pylint: disable=C0111,R0903
"""Displays the current color temperature of redshift
2020-03-07 14:06:01 +01:00
Requires the following executable:
* redshift
Parameters:
* redshift.location : location provider, either of 'auto' (default), 'geoclue2',
2020-05-06 12:57:38 +02:00
'ipinfo' or 'manual'
'auto' uses whatever redshift is configured to do
2020-03-07 14:06:18 +01:00
* redshift.lat : latitude if location is set to 'manual'
* redshift.lon : longitude if location is set to 'manual'
* redshift.show_transition: information about the transitions (x% day) defaults to True
* redshift.adjust: set this to 'true' (defaults to false) to let bumblebee-status adjust color temperature, instead of just showing the current settings
"""
2020-03-07 14:06:01 +01:00
import re
2020-03-07 14:06:01 +01:00
import threading
import core.module
import core.widget
import core.input
import core.decorators
2020-03-07 14:06:01 +01:00
import util.cli
import util.format
import util.location
2020-03-07 14:06:01 +01:00
2020-04-12 20:28:11 +02:00
def get_redshift_value(module):
widget = module.widget()
location = module.parameter("location", "auto")
lat = module.parameter("lat", None)
lon = module.parameter("lon", None)
2020-04-12 20:28:11 +02:00
# Even if location method is set to manual, if we have no lat or lon,
# fall back to the geoclue2 method.
if location == "manual" and (lat is None or lon is None):
location = "geoclue2"
2020-04-12 20:28:11 +02:00
command = ["redshift"]
if util.format.asbool(module.parameter("adjust", "false")) == True:
command.extend(["-o", "-v"])
else:
command.append("-p")
if location == "manual":
command.extend(["-l", "{}:{}".format(lat, lon)])
if location == "geoclue2":
command.extend(["-l", "geoclue2"])
2020-04-12 20:28:11 +02:00
try:
res = util.cli.execute(" ".join(command))
2020-04-12 20:28:11 +02:00
except Exception:
res = ""
widget.set("temp", "n/a")
widget.set("transition", "")
widget.set("state", "day")
for line in res.split("\n"):
2020-04-12 20:28:11 +02:00
line = line.lower()
if "temperature" in line:
widget.set("temp", line.split(" ")[2].upper())
if "period" in line:
state = line.split(" ")[1]
if "day" in state:
widget.set("state", "day")
elif "night" in state:
widget.set("state", "night")
2020-04-12 20:28:11 +02:00
else:
widget.set("state", "transition")
match = re.search(r"(\d+)\.\d+% ([a-z]+)", line)
widget.set(
"transition", "({}% {})".format(match.group(1), match.group(2))
)
core.event.trigger("update", [widget.module.id], redraw_only=True)
2020-03-07 14:06:01 +01:00
class Module(core.module.Module):
@core.decorators.every(seconds=10)
def __init__(self, config, theme):
super().__init__(config, theme, core.widget.Widget(self.text))
2020-03-07 14:06:01 +01:00
self.__thread = None
self.show_transition = util.format.asbool(
self.parameter("show_transition", True)
)
2020-03-07 14:06:01 +01:00
if self.parameter("location", "") == "ipinfo":
2020-04-12 20:28:11 +02:00
# override lon/lat with ipinfo
2020-03-07 14:06:01 +01:00
try:
location = util.location.coordinates()
self.set("lat", location[0])
self.set("lon", location[1])
self.set("location", "manual")
2020-03-07 14:06:01 +01:00
except Exception:
# Fall back to geoclue2.
self.set("location", "geoclue2")
2020-03-07 14:06:01 +01:00
self._text = ""
2020-03-07 14:06:01 +01:00
def text(self, widget):
val = widget.get("temp", "n/a")
transition = widget.get("transition", "")
if transition and self.show_transition:
val = "{} {}".format(val, transition)
2020-04-12 20:28:11 +02:00
return val
def update(self):
if self.__thread is not None and self.__thread.is_alive():
2020-04-12 20:28:11 +02:00
return
self.__thread = threading.Thread(target=get_redshift_value, args=(self,))
2020-04-12 20:28:11 +02:00
self.__thread.start()
2020-03-07 14:06:01 +01:00
def state(self, widget):
return widget.get("state", None)
2020-03-07 14:06:01 +01:00
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4