95 lines
2.1 KiB
Python
95 lines
2.1 KiB
Python
|
#!/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()
|