#!/usr/bin/env python3
# -*- python -*-
copyright='''
Copyright © 2014 Mattias Andrée (maandree@member.fsf.org)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
'''
import os
import sys
import threading
from subprocess import Popen, PIPE
PROGRAM_NAME = 'nightshift'
PROGRAM_VERSION = '1.0'
for arg in sys.argv[1:]:
if arg in ('-v', '--version'):
print('%s %s' % (PROGRAM_NAME, PROGRAM_VERSION))
Popen(['redshift', '-V'], stdout = sys.stdout).wait()
sys.exit(0)
elif arg in ('-c', '--copyright'):
print(copyright[1 : -1])
sys.exit(0)
elif arg in ('-w', '--warranty'):
print(copyright.split('\n\n')[-2])
sys.exit(0)
elif arg in ('-h', '--help'):
text = '''USAGE: nightshift
terminal user interface for redshift, a program for
setting the colour temperature of the display according
to the time of day.
-h --help Display this help message
-v --version Show program version
-c --copyright Show program copyright information
-w --warranty Show program warrantly disclaimer
Please report bugs to
'''
text = text.split('\n')[:-1]
indent = min([len(line) - len(line.lstrip()) for line in text if line.rstrip().startswith(' ')])
print('\n'.join([line[indent:] if line.startswith(' ') else line for line in text]))
sys.exit(0)
else:
sys.stderr.write('%s: error: unrecognised option: %s\n' % (sys.argv[0], arg))
sys.exit(1)
proc = Popen(['redshift', '-v'], stdout = PIPE, stderr = open(os.devnull))
red_brightness, red_period, red_temperature, red_running = 1, 1, 6500, True
red_condition = threading.Condition()
def read_status():
global red_brightness, red_period, red_temperature, red_running
while True:
got = proc.stdout.readline()
if (got is None) or (len(got) == 0):
break
got = got.decode('utf-8', 'replace')[:-1]
(key, value) = got.split(': ')
red_condition.acquire()
try:
if key == 'Brightness':
red_brightness = float(value)
elif key == 'Period':
if value == 'Night':
red_period = 0
elif value == 'Daytime':
red_period = 1
else:
red_period = float(value.split(' ')[1][1 : -1]) / 100
elif key == 'Color temperature':
red_temperature = float(value[:-1])
except:
pass
red_condition.notify()
red_condition.release()
red_running = False
thread = threading.Thread(target = read_status)
thread.setDaemon(True)
thread.start()
while red_running:
red_condition.acquire()
red_condition.wait()
print('%f: %f, %f' % (red_period, red_temperature, red_brightness))
red_condition.release()