bumblebee-status/modules/core/redshift.py

104 lines
3.2 KiB
Python

# pylint: disable=C0111,R0903
"""Displays the current color temperature of redshift
Requires the following executable:
* redshift
Parameters:
* redshift.location : location provider, either of 'auto' (default), 'geoclue2',
'ipinfo' or 'manual'
'auto' uses whatever redshift is configured to do
* redshift.lat : latitude if location is set to 'manual'
* redshift.lon : longitude if location is set to 'manual'
"""
import re
import threading
import core.module
import core.widget
import core.input
import core.decorators
import util.cli
import util.location
def get_redshift_value(module):
widget = module.widget()
location = module.parameter('location', 'auto')
lat = module.parameter('lat', None)
lon = module.parameter('lon', None)
# 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'
command = ['redshift', '-p']
if location == 'manual':
command.extend(['-l', '{}:{}'.format(lat, lon)])
if location == 'geoclue2':
command.extend(['-l', 'geoclue2'])
try:
res = util.cli.execute(' '.join(command))
except Exception:
res = ''
widget.set('temp', 'n/a')
widget.set('transition', None)
widget.set('state', 'day')
for line in res.split('\n'):
line = line.lower()
if 'temperature' in line:
widget.set('temp', line.split(' ')[2])
if 'period' in line:
state = line.split(' ')[1]
if 'day' in state:
widget.set('state', 'day')
elif 'night' in state:
widget.set('state', 'night')
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)
class Module(core.module.Module):
@core.decorators.every(seconds=10)
def __init__(self, config):
widget = core.widget.Widget(self.text)
super().__init__(config, widget)
self.__thread = None
if self.parameter('location', '') == 'ipinfo':
# override lon/lat with ipinfo
try:
location = util.location.coordinates()
self.set('lat', location[0])
self.set('lon', location[1])
self.set('location', 'manual')
except Exception:
# Fall back to geoclue2.
self.set('location', 'geoclue2')
self._text = ''
def text(self, widget):
val = widget.get('temp', 'n/a')
transition = widget.get('transition', None)
if transition:
val = '{} {}'.format(val, transition)
return val
def update(self):
if self.__thread is not None and self.__thread.isAlive():
return
self.__thread = threading.Thread(target=get_redshift_value, args=(self,))
self.__thread.start()
def state(self, widget):
return widget.get('state', None)
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4