summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xsrc/__main__.py122
-rw-r--r--src/blueshift_randr.pyx6
-rw-r--r--src/curve.py19
-rw-r--r--src/monitor.py7
4 files changed, 90 insertions, 64 deletions
diff --git a/src/__main__.py b/src/__main__.py
index 083d0b0..45ba7db 100755
--- a/src/__main__.py
+++ b/src/__main__.py
@@ -23,7 +23,9 @@ import datetime
## Set global variables
global DATADIR, i_size, o_size, r_curve, g_curve, b_curve, clip_result
-global periodically, wait_period, monitor_controller, running
+global periodically, wait_period, fadein_time, fadeout_time, fadein_steps, fadeout_steps
+global monitor_controller, running, continuous_run
+global signal_SIGTERM
from solar import *
@@ -40,6 +42,7 @@ def periodically(year, month, day, hour, minute, second, weekday, fade):
fadeout_time = None
fadein_steps = 100
fadeout_steps = 100
+ start_over()
if fade is None:
negative(False, False, False)
temperature(6500, lambda T : divide_by_maximum(series_d(T)))
@@ -103,22 +106,22 @@ monitor_controller = lambda : randr()
:()→void Function used by Blueshift on exit to apply reset colour curves
'''
-fadein_time = 10
+fadein_time = 2
'''
:float? The number of seconds used to fade in on start, `None` for no fading
'''
-fadeout_time = 10
+fadeout_time = 2
'''
:float? The number of seconds used to fade out on exit, `None` for no fading
'''
-fadein_steps = 100
+fadein_steps = 10
'''
:int The number of steps in the fade in phase, if any
'''
-fadeout_steps = 100
+fadeout_steps = 10
'''
:int The number of steps in the fade out phase, if any
'''
@@ -129,52 +132,33 @@ running = True
'''
-## Load extension and configurations via blueshiftrc
-if config_file is None:
- for file in ('$XDG_CONFIG_HOME/%/%rc', '$HOME/.config/%/%rc', '$HOME/.%rc', '/etc/%rc'):
- file = file.replace('%', 'blueshift')
- for arg in ('XDG_CONFIG_HOME', 'HOME'):
- if '$' + arg in file:
- if arg in os.environ:
- file = file.replace('$' + arg, os.environ[arg].replace('$', '\0'))
- else:
- file = None
- break
- if file is not None:
- file = file.replace('\0', '$')
- if os.path.exists(file):
- config_file = file
- break
-if config_file is not None:
- code = None
- with open(file, 'rb') as script:
- code = script.read()
- code = code.decode('utf8', 'error') + '\n'
- code = compile(code, file, 'exec')
- g, l = globals(), dict(locals())
- for key in l:
- g[key] = l[key]
- exec(code, g)
-else:
- print('No configuration file found')
- sys.exit(1)
-
-## Run periodically if configured to
-if periodically is not None:
+def signal_SIGTERM(signum, frame):
+ global running
+ if not running:
+ running = False
+ start_over()
+ monitor_controller()
+ close_c_bindings()
+ sys.exit(0)
+ running = False
+
+
+def continuous_run():
+ '''
+ Invoked to run continuously if `periodically` is not `None`
+ '''
+ global running, wait_period, fadein_time, fadeout_time, fadein_steps, fadeout_steps
def p(t, fade = None):
wd = t.isocalendar()[2]
periodically(t.year, t.month, t.day, t.hour, t.minute, t.second, wd, fade)
+ def sleep(seconds):
+ try:
+ time.sleep(seconds)
+ except KeyboardInterrupt:
+ signal_SIGTERM(0, None)
- ## Catch TERM signal
- def signal_SIGTERM(signum, frame):
- if not running:
- running = False
- start_over()
- monitor_controller()
- close_c_bindings()
- sys.exit(0)
- running = False
+ ## Catch signals
signal.signal(signal.SIGTERM, signal_SIGTERM)
## Fade in
@@ -182,33 +166,73 @@ if periodically is not None:
ftime = 0
if fadein_time is not None:
dtime = fadein_time / fadein_steps
+ df = 1 / fadein_steps
while running:
- ftime += dtime
+ ftime += df
if ftime > 1:
break
p(datetime.datetime.now(), ftime)
+ sleep(dtime)
## Run periodically
if not early_exit:
while running:
p(datetime.datetime.now(), None)
if running:
- time.sleep(wait_period)
+ sleep(wait_period)
## Fade out
if fadeout_time is not None:
dtime = fadeout_time / fadeout_steps
+ df = 1 / fadeout_steps
if early_exit:
ftime = 1
while True:
- ftime -= dtime
+ ftime -= df
if ftime <= 0:
break
p(datetime.datetime.now(), -ftime)
+ sleep(dtime)
## Reset
start_over()
monitor_controller()
+
+## Load extension and configurations via blueshiftrc
+if config_file is None:
+ for file in ('$XDG_CONFIG_HOME/%/%rc', '$HOME/.config/%/%rc', '$HOME/.%rc', '/etc/%rc'):
+ file = file.replace('%', 'blueshift')
+ for arg in ('XDG_CONFIG_HOME', 'HOME'):
+ if '$' + arg in file:
+ if arg in os.environ:
+ file = file.replace('$' + arg, os.environ[arg].replace('$', '\0'))
+ else:
+ file = None
+ break
+ if file is not None:
+ file = file.replace('\0', '$')
+ if os.path.exists(file):
+ config_file = file
+ break
+if config_file is not None:
+ code = None
+ with open(file, 'rb') as script:
+ code = script.read()
+ code = code.decode('utf8', 'error') + '\n'
+ code = compile(code, file, 'exec')
+ g, l = globals(), dict(locals())
+ for key in l:
+ g[key] = l[key]
+ exec(code, g)
+else:
+ print('No configuration file found')
+ sys.exit(1)
+
+
+## Run periodically if configured to
+if periodically is not None:
+ continuous_run()
+
close_c_bindings()
diff --git a/src/blueshift_randr.pyx b/src/blueshift_randr.pyx
index e022714..d5e13b6 100644
--- a/src/blueshift_randr.pyx
+++ b/src/blueshift_randr.pyx
@@ -25,9 +25,9 @@ def randr_apply(unsigned long long use_crtcs, r_curve, g_curve, b_curve):
if (r is NULL) or (g is NULL) or (b is NULL):
raise MemoryError()
for i in range(256):
- r[i] = r_curve[i]
- g[i] = g_curve[i]
- b[i] = b_curve[i]
+ r[i] = r_curve[i] & 0xFFFF
+ g[i] = g_curve[i] & 0xFFFF
+ b[i] = b_curve[i] & 0xFFFF
rc = blueshift_randr_apply(use_crtcs, r, g, b)
free(r)
free(g)
diff --git a/src/curve.py b/src/curve.py
index 4c05822..ece5885 100644
--- a/src/curve.py
+++ b/src/curve.py
@@ -115,11 +115,11 @@ def cmf_2deg(temperature):
temp = min(max(1000, temperature), 40000)
x, y = 0, 0
if (temp % 100) == 0:
- (x, y) = cmf_2deg_cache[(temp - 1000) // 100]
+ (x, y) = cmf_2deg_cache[int((temp - 1000) // 100)]
else:
temp -= 1000
- (x1, y1) = cmf_2deg_cache[temp // 100]
- (x2, y2) = cmf_2deg_cache[temp // 100 + 1]
+ (x1, y1) = cmf_2deg_cache[int(temp // 100)]
+ (x2, y2) = cmf_2deg_cache[int(temp // 100 + 1)]
temp = (temp % 100) / 100
x = x1 * temp + x2 * (1 - temp)
y = y1 * temp + y2 * (1 - temp)
@@ -146,11 +146,11 @@ def cmf_10deg(temperature):
temp = min(max(1000, temperature), 40000)
x, y = 0, 0
if (temp % 100) == 0:
- (x, y) = cmf_10deg_cache[(temp - 1000) // 100]
+ (x, y) = cmf_10deg_cache[int((temp - 1000) // 100)]
else:
temp -= 1000
- (x1, y1) = cmf_10deg_cache[temp // 100]
- (x2, y2) = cmf_10deg_cache[temp // 100 + 1]
+ (x1, y1) = cmf_10deg_cache[int(temp // 100)]
+ (x2, y2) = cmf_10deg_cache[int(temp // 100 + 1)]
temp = (temp % 100) / 100
x = x1 * temp + x2 * (1 - temp)
y = y1 * temp + y2 * (1 - temp)
@@ -189,11 +189,11 @@ def redshift(temperature, old_version = False, linear_interpolation = False):
temp = min(max(1000, temperature), 10000 if old_version else 25100)
r, g, b = 1, 1, 1
if (temp % 100) == 0:
- (r, g, b) = cache[(temp - 1000) // 100]
+ (r, g, b) = cache[int((temp - 1000) // 100)]
else:
temp -= 1000
- (r1, g1, b1) = cache[temp // 100]
- (r2, g2, b2) = cache[temp // 100 + 1]
+ (r1, g1, b1) = cache[int(temp // 100)]
+ (r2, g2, b2) = cache[int(temp // 100 + 1)]
temp = (temp % 100) / 100
if linear_interpolation:
(r, g, b) = standard_to_linear(r, g, b)
@@ -216,7 +216,6 @@ def temperature(temperature, algorithm):
if temperature == 6500:
return
(r, g, b) = algorithm(temperature)
- print(r, g, b)
rgb_brightness(r, g, b)
diff --git a/src/monitor.py b/src/monitor.py
index b2bfa84..52bc220 100644
--- a/src/monitor.py
+++ b/src/monitor.py
@@ -66,8 +66,11 @@ def randr(*crtcs):
randr_opened = True
else:
sys.exit(1)
- if not randr_apply(crtcs, R_curve, G_curve, B_curve) == 0:
- sys.exit(1)
+ try:
+ if not randr_apply(crtcs, R_curve, G_curve, B_curve) == 0:
+ sys.exit(1)
+ except OverflowError:
+ pass # Happens on exit by TERM signal
def print_curves(*crtcs):