# -*- python -*-
import os
import sys
import time
import signal
OUTPUT, HEIGHT, YPOS, TOP = 0, 2 * 12, 0, True
LEFT_BUTTON = 1
MIDDLE_BUTTON = 2
RIGHT_BUTTON = 3
SCROLL_UP = 4
SCROLL_DOWN = 5
SCROLL_LEFT = 6
SCROLL_RIGHT = 7
FORWARD_BUTTON = 8
BACKWARD_BUTTON = 9
path = os.getenv('XDG_RUNTIME_DIR', '/tmp') + '/.xpybar.brilliance'
pid = None
pending = False
def sigchld(*_):
global pid, pending
if pid is not None:
r, _ = os.waitpid(-1, 0)
if r == pid:
pid = None
if pending:
pending = False
set_brilliance()
else:
with open(path, 'wb') as file:
return file.write(('%f' % brilliance).encode('utf-8'))
def get_brilliance():
try:
with open(path, 'rb') as file:
return float(file.read().decode('utf-8', 'strict'))
except:
return 1
def set_brilliance():
global pid, pending
if pid is None:
pid = os.fork()
if not pid:
if brilliance == 1:
os.execlp('cg-brilliance', 'cg-brilliance', '-x')
else:
os.execlp('cg-brilliance', 'cg-brilliance', '--', '%f' % brilliance)
sys.exit(1)
else:
pending = True
signal.signal(signal.SIGCHLD, sigchld)
brilliance = get_brilliance()
def redraw():
x = int(bar.width * brilliance + 0.5)
bar.change_colour(bar.foreground)
bar.window.fill_rectangle(bar.gc, 0, 0, x, HEIGHT)
bar.change_colour(bar.background)
bar.window.fill_rectangle(bar.gc, x, 0, bar.width - x, HEIGHT)
import x as _x
_get_event_mask = _x.get_event_mask
def get_event_mask():
return _get_event_mask() | Xlib.X.ButtonMotionMask
_x.get_event_mask = get_event_mask
def unhandled_event(e):
global brilliance
if isinstance(e, Xlib.protocol.event.ButtonPress):
button, x = e.detail, e.event_x
if button == LEFT_BUTTON:
brilliance = min(max(0, x / bar.width), 1)
set_brilliance()
bar.invalidate()
elif button == SCROLL_UP:
brilliance = min(brilliance + 0.05, 1)
set_brilliance()
bar.invalidate()
elif button == SCROLL_DOWN:
brilliance = max(brilliance - 0.05, 0)
set_brilliance()
bar.invalidate()
elif button in (MIDDLE_BUTTON, RIGHT_BUTTON, FORWARD_BUTTON, BACKWARD_BUTTON):
raise KeyboardInterrupt()
elif isinstance(e, Xlib.protocol.event.MotionNotify):
if e.detail == 0:
brilliance = min(max(0, e.event_x / bar.width), 1)
set_brilliance()
bar.invalidate()