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