diff options
Diffstat (limited to 'panel.py')
| -rwxr-xr-x | panel.py | 66 |
1 files changed, 44 insertions, 22 deletions
@@ -284,7 +284,8 @@ class ModHLWMTitle(ModHLWMBase): self.repaint() class ModInputAvail(Mod): - def __init__(self, path, + def __init__( + self, path, avail_text=None, avail_bg='#207000', unavail_text=None, unavail_bg='#a03000', **kwargs): @@ -425,8 +426,9 @@ class IntervalTimer(): class ModInterval(Mod): timer = IntervalTimer() - def __init__(self, interval=1, **kwargs): + def __init__(self, label=None, interval=1, **kwargs): super().__init__(**kwargs) + self.label = label self.timer.func_intervals[self.work] = interval def run(self): @@ -434,16 +436,22 @@ class ModInterval(Mod): def work(self): self.refreshing = True - self.refresh() + try: + self.refresh() + except: + self.set_error() self.refreshing = False self.repaint() + def set_error(self): + self.out = Fmt.labelled(self.label, Fmt.bg('#a03000', ' error ')) + class ModNetIf(ModInterval): - def __init__(self, ifname, label=None, regex=False, **kwargs): + def __init__(self, ifname, regex=False, **kwargs): + kwargs.setdefault('label', ifname) super().__init__(**kwargs) self.ifname = ifname self.regex = regex - self.label = label or ifname def refresh(self): stats = psutil.net_if_stats() @@ -455,24 +463,34 @@ class ModNetIf(ModInterval): self.out = Fmt.labelled(self.label, state) class ModCPU(ModInterval): + def __init__(self, **kwargs): + kwargs.setdefault('label', 'CPU') + super().__init__(**kwargs) + def refresh(self): percent = psutil.cpu_percent() buf = f'{percent:.0f}%%' if percent > 75: buf = Fmt.fg('#ff4000', buf) - self.out = Fmt.labelled('CPU', buf) + self.out = Fmt.labelled(self.label, buf) class ModMem(ModInterval): + def __init__(self, **kwargs): + kwargs.setdefault('label', 'MEM') + super().__init__(**kwargs) + def refresh(self): percent = psutil.virtual_memory().percent buf = f'{percent:.0f}%%' if percent > 75: buf = Fmt.fg('#ff4000', buf) - self.out = Fmt.labelled('MEM', buf) + self.out = Fmt.labelled(self.label, buf) class ModPWVol(ModInterval): - def __init__(self, sink='@DEFAULT_AUDIO_SINK@', step='0.05', limit=None, + def __init__( + self, sink='@DEFAULT_AUDIO_SINK@', step='0.05', limit=None, **kwargs): + kwargs.setdefault('label', 'VOL') super().__init__(**kwargs) self.sink = sink self.step = step @@ -482,14 +500,13 @@ class ModPWVol(ModInterval): res = subprocess.run( ('wpctl', 'get-volume', self.sink), stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True) - if (m := re.match('Volume: ([0-9.]*)( \[MUTED\])?', res.stdout)): - vol = float(m.group(1)) * 100 - buf = f'{vol:.0f}%%' - buf = (Fmt.fg('#777777', buf + ' [muted]') if m.group(2) - else Fmt.fg('#ff4000', buf) if vol > 100 - else buf) - else: - buf = Fmt.bg('#a03000', ' error ') + if not (m := re.match(r'Volume: ([0-9.]*)( \[MUTED\])?', res.stdout)): + raise RuntimeException + vol = float(m.group(1)) * 100 + buf = f'{vol:.0f}%%' + buf = (Fmt.fg('#777777', buf + ' [muted]') if m.group(2) + else Fmt.fg('#ff4000', buf) if vol > 100 + else buf) self.out = Fmt.clickable( 4, f'{id(self)} set {self.step}+', @@ -497,7 +514,7 @@ class ModPWVol(ModInterval): 5, f'{id(self)} set {self.step}-', Fmt.clickable( '', f'{id(self)} toggle-mute', - Fmt.labelled('VOL', buf)))) + Fmt.labelled(self.label, buf)))) def process_cmd(self, cmd): if cmd == 'toggle-mute': @@ -514,11 +531,13 @@ class Panel: def __init__(self, *mods, max_paint_delay=0, width=1920, height=22): self.e_repaint = threading.Event() self.e_flush = threading.Event() + self.mods = mods for m in self.mods: m.e_repaint = self.e_repaint m.e_flush = self.e_flush self.mod_by_id = {id(m): m for m in self.mods} + self.max_paint_delay = max_paint_delay self.width = width self.height = height @@ -538,10 +557,12 @@ class Panel: self.panel = subprocess.Popen( ('/home/david/dev/lemonbar-xft/lemonbar', - '-bf', 'Monospace:size=10:dpi=96', + '-f', 'Monospace:size=10:dpi=96', '-f', 'Monospace:size=10:dpi=96:bold', + '-b', '-g', f'{self.width}x{self.height}', - '-u', '2', '-a', '100'), + '-u', '2', + '-a', '100'), stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True) @@ -564,7 +585,8 @@ class Panel: if self.e_flush.is_set(): break self.e_flush.clear() - print(''.join([s for m in self.mods if (s := m.to_paint())]), + print( + ''.join([s for m in self.mods if (s := m.to_paint())]), file=self.panel.stdin, flush=True) Panel( @@ -574,7 +596,7 @@ Panel( ModInputAvail( '/dev/input/by-id/usb-HID_Keyboard_HID_Keyboard-event-kbd', unavail_text='NO KEYBOARD'), - ModNetIf('wg(?!0$).*', regex=True, label='wg*'), + ModNetIf(r'wg(?!0$).*', regex=True, label='wg*'), ModPWVol(limit=1.5), ModCPU(interval=0.5), ModMem(interval=0.5), @@ -583,6 +605,6 @@ Panel( tzs=({'id': None}, {'id': 'UTC'}, {'id': 'Asia/Yerevan', 'label': 'AMT'})), max_paint_delay=0.01, - width=(re.match('[0-9]+', HLWMClient.exec('attr', 'monitors.0.geometry')) + width=(re.match(r'[0-9]+', HLWMClient.exec('attr', 'monitors.0.geometry')) .group()) ).run() |
