#!/usr/bin/env python3 import typing import subprocess import time # CORE class Notifier: pass class Section: def __init__(self) -> None: self.text = b"(Loading)" class Module: def __init__(self) -> None: self.bar: "Bar" self.section = Section() self.sections = [self.section] class Alignment: def __init__(self, *modules: Module) -> None: self.bar: "Bar" self.modules = modules for module in modules: module.bar = self.bar class Screen: def __init__(self, left: Alignment = Alignment(), right: Alignment = Alignment()) -> None: self.bar: "Bar" self.left = left self.left.bar = self.bar self.right = right or Alignment() self.right.bar = self.bar class Bar: def __init__(self, *screens: Screen) -> None: self.screens = screens for screen in screens: screen.bar = self self.process = subprocess.Popen(["lemonbar"], stdin=subprocess.PIPE) def display(self) -> None: string = b"" for s, screen in enumerate(self.screens): string += b"%%{S%d}" % s for control, alignment in [(b'%{l}', screen.left), (b'%{r}', screen.right)]: string += control for module in alignment.modules: for section in module.sections: string += b"<%b> |" % section.text string += b"\n" print(string) assert self.process.stdin self.process.stdin.write(string) self.process.stdin.flush() def run(self) -> None: while True: self.display() time.sleep(1) # REUSABLE class ClockNotifier(Notifier): def run(self) -> None: while True: def __init__(self, text: bytes): super().__init__() self.section.text = text class StaticModule(Module): def __init__(self, text: bytes): super().__init__() self.section.text = text # USER if __name__ == "__main__": bar = Bar( Screen(Alignment(StaticModule(b"A"))), Screen(Alignment(StaticModule(b"B"))), ) bar.run()