aboutsummaryrefslogtreecommitdiffstats
path: root/xpybar/config/common.py
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2021-06-26 13:18:37 +0200
committerMattias Andrée <maandree@kth.se>2021-06-26 13:18:37 +0200
commit3e21f6d13c0a70db95fec8b5a71b758223ff4293 (patch)
tree6d6d2eddb243935007ce1e316c61470224f93df0 /xpybar/config/common.py
parentAdd inputrc for readline + m (diff)
downloaddotfiles-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.py231
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)