From 3e21f6d13c0a70db95fec8b5a71b758223ff4293 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sat, 26 Jun 2021 13:18:37 +0200 Subject: Add xpybar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- xpybar/config/myii.py | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 xpybar/config/myii.py (limited to 'xpybar/config/myii.py') diff --git a/xpybar/config/myii.py b/xpybar/config/myii.py new file mode 100644 index 0000000..77bf813 --- /dev/null +++ b/xpybar/config/myii.py @@ -0,0 +1,113 @@ +# -*- python -*- +from plugins.ii import II + +from common import * + +class MyII(Entry): + def __init__(self, *args, channel = None, prefix = None, display = None, backlog = None, watch = None, **kwargs): + self.semaphore = threading.Semaphore() + self.log = [] + self.text = '' + self.ii = II(channel, prefix = prefix) + self.display = display + self.backlog = backlog + self.watch = (lambda s : False) if watch is None else watch + self.show_line = 0 + Entry.__init__(self, *args, **kwargs) + + def start(self): + xasync(self.wait, name = 'ii') + + def wait(self): + self.refresh() + def refresh_(): + time.sleep(0.1) + self.refresh() + while True: + xasync(refresh_, name = 'ii') + try: + self.ii.wait() + except: + time.sleep(5) + self.refresh() + + def refresh(self): + on_last = False + highlighted = 0 + self.semaphore.acquire() + try: + new = self.ii.read() + if self.backlog is not None: + new = new[-(self.backlog):] + self.backlog = None + for i in range(len(new)): + if self.watch(new[i]): + new[i] = (new[i], True) + highlighted += 1 + else: + new[i] = (new[i], False) + on_last = self.show_line >= len(self.log) - 1 + self.log.extend(new) + if on_last and len(new) > 0: + self.show_line = len(self.log) - 1 + text = self.log[self.show_line][0] + if self.log[self.show_line][1]: + text = '\033[33m%s\033[39m' % text + self.text = text + finally: + self.semaphore.release() + if len(new) > 0: + if on_last: + self.invalidate() + if highlighted > 0 and self.display is not None: + self.display.adjust(highlighted) + + def action(self, col, button, x, y): + if len(self.log) == 0: + return + update = False + self.semaphore.acquire() + try: + if button == LEFT_BUTTON: + if self.log[self.show_line][1]: + self.log[self.show_line] = (self.log[self.show_line][0], False) + self.text = self.log[self.show_line][0] + update = True + if self.display is not None: + self.display.adjust(-1) + elif self.watch(self.log[self.show_line][0]): + self.log[self.show_line] = (self.log[self.show_line][0], True) + self.text = '\033[33m%s\033[39m' % self.log[self.show_line][0] + update = True + if self.display is not None: + self.display.adjust(-1) + elif button == MIDDLE_BUTTON: + adj = 0 + for i in range(self.show_line): + if self.log[i][1]: + adj -= 1 + self.log = self.log[self.show_line:] + self.show_line = 0 + if adj != 0: + self.display.adjust(adj) + elif button == RIGHT_BUTTON: + for i, (text, marked) in enumerate(self.log): + if marked: + self.show_line = i + self.text = '\033[33m%s\033[39m' % text if marked else text + update = True + break + elif button in (SCROLL_UP, SCROLL_DOWN): + line = self.show_line + (-1 if button == SCROLL_UP else +1) + if 0 <= line < len(self.log): + self.show_line = line + (text, marked) = self.log[line] + self.text = '\033[33m%s\033[39m' % text if marked else text + update = True + finally: + self.semaphore.release() + if update: + self.invalidate() + + def function(self): + return self.text -- cgit v1.2.3-70-g09d2