summaryrefslogtreecommitdiff
path: root/panel.py
diff options
context:
space:
mode:
Diffstat (limited to 'panel.py')
-rwxr-xr-xpanel.py66
1 files changed, 44 insertions, 22 deletions
diff --git a/panel.py b/panel.py
index fdee772..8885d4f 100755
--- a/panel.py
+++ b/panel.py
@@ -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()