# -*- python -*- import os import pwd import sys import time import threading import subprocess from util import * from __main__ import Bar import Xlib.X, Xlib.XK, Xlib.protocol.event class Globals: def __init__(self): self.globals = None @property def bar(self): return self.globals['bar'] @property def display(self): return self.globals['display'] @property def OUTPUT(self): return self.globals['OUTPUT'] @property def HEIGHT_PER_LINE(self): return self.globals['HEIGHT_PER_LINE'] @property def YPOS(self): return self.globals['YPOS'] @property def TOP(self): return self.globals['TOP'] @property def HEIGHT(self): return self.globals['HEIGHT'] @OUTPUT.setter def OUTPUT(self, value): self.globals['OUTPUT'] = value @HEIGHT_PER_LINE.setter def HEIGHT_PER_LINE(self, value): self.globals['HEIGHT_PER_LINE'] = value @YPOS.setter def YPOS(self, value): self.globals['YPOS'] = value @TOP.setter def TOP(self, value): self.globals['TOP'] = value @HEIGHT.setter def HEIGHT(self, value): self.globals['HEIGHT'] = value G = Globals() LEFT_BUTTON = 1 MIDDLE_BUTTON = 2 RIGHT_BUTTON = 3 SCROLL_UP = 4 SCROLL_DOWN = 5 SCROLL_LEFT = 6 SCROLL_RIGHT = 7 FORWARD_BUTTON = 8 # X1 BACKWARD_BUTTON = 9 # X2 limited = lambda v : min(max(int(v + 0.5), 0), 100) def t_(f): try: f() except Exception as e: time.sleep(1) t = lambda f : (lambda : t_(f)) def pdeath(signal, *command): try: path = os.environ['PATH'].split(':') for p in path: p += '/pdeath' if os.access(p, os.X_OK, effective_ids = True): return (p, signal, *command) except: pass return command HOME = pwd.getpwuid(os.getuid()).pw_dir SEPARATOR = ' │ ' def invalidate(): try: G.bar.invalidate() except: pass mqueue_map = {} class Entry: def __init__(self, wrap = None, left = True, line = 0, prev = None): self.left = left self.line = line self.prev = prev self.width = 0 self.offset = 0 self.last_text = None self.short_layout = None self.wrapped = self.function if wrap is None else wrap(self.function) def invalidate(self): wrapper = self.wrapped if isinstance(wrapper, Clocked): wrapper = wrapper.sometimes if isinstance(wrapper, Sometimes): wrapper.counter = 0 invalidate() def action(self, col, button, x, y): pass def click(self, row, lcol, rcol, button, x, y): if row == self.line: col = (lcol if self.left else rcol) - self.offset if 0 <= col < self.width: if self.left: x -= self.offset * G.bar.font_width else: col = self.width - 1 - col x = G.bar.width - x x -= self.offset * G.bar.font_width x = self.width * G.bar.font_width - x y -= self.line * G.HEIGHT_PER_LINE try: self.action(col, button, x, y) except Exception as err: print(str(err), file = sys.stderr, flush = True) return True return False def function(self): return SEPARATOR def __call__(self, *args, **kwargs): try: text = self.wrapped(*args, **kwargs) if text is not self.last_text: self.width = Bar.coloured_length(text) self.last_text = text return text except Exception as err: print(err, file = sys.stderr, flush = True) def update_position(self): if self.prev is not None: self.prev.update_position() self.offset = self.prev.offset + self.prev.width class Group: def __init__(self, functions): self.pattern = '' self.posupdate = [] left = None right = None lineno = 0 atleft = True newline = False lastright = None new_functions = [] separator = None for entry in functions: if entry is None: newline = not atleft lineno += 1 if newline else 0 atleft = not atleft continue entry.left = atleft entry.line = lineno if newline: self.pattern += '\n' newline = False if left is not None: self.posupdate.append(left) if right is not None: self.posupdate.append(right) left = None right = None lastright = None if entry.left: if left is not None: separator = Entry(left = True) new_functions.append(separator) self.pattern += '%s' separator.prev = left left = separator entry.prev = left left = entry elif right is None: if left is not None: self.pattern += '\0 ' right = entry lastright = entry else: separator = Entry(left = False) new_functions.append(separator) self.pattern += '%s' lastright.prev = separator separator.prev = entry lastright = entry new_functions.append(entry) self.pattern += '%s' if left is not None: self.posupdate.append(left) if right is not None: self.posupdate.append(right) height = (lineno + 1) * G.HEIGHT_PER_LINE if G.HEIGHT < height: G.HEIGHT = height self.functions = new_functions def colour_interpol(low, high, weight): rl, rh = (low >> 16) & 255, (high >> 16) & 255 gl, gh = (low >> 8) & 255, (high >> 8) & 255 bl, bh = (low >> 0) & 255, (high >> 0) & 255 r = int(rl * (1 - weight) + rh * weight) g = int(gl * (1 - weight) + gh * weight) b = int(bl * (1 - weight) + bh * weight) return '38;2;%i;%i;%i' % (r, g, b)