diff options
author | Mattias Andrée <maandree@kth.se> | 2021-06-26 13:18:37 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2021-06-26 13:18:37 +0200 |
commit | 3e21f6d13c0a70db95fec8b5a71b758223ff4293 (patch) | |
tree | 6d6d2eddb243935007ce1e316c61470224f93df0 /xpybar/config/common.py | |
parent | Add inputrc for readline + m (diff) | |
download | dotfiles-3e21f6d13c0a70db95fec8b5a71b758223ff4293.tar.gz dotfiles-3e21f6d13c0a70db95fec8b5a71b758223ff4293.tar.bz2 dotfiles-3e21f6d13c0a70db95fec8b5a71b758223ff4293.tar.xz |
Add xpybar
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'xpybar/config/common.py')
-rw-r--r-- | xpybar/config/common.py | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/xpybar/config/common.py b/xpybar/config/common.py new file mode 100644 index 0000000..fca2b73 --- /dev/null +++ b/xpybar/config/common.py @@ -0,0 +1,231 @@ +# -*- 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) |