feat: round bar on smart corners
also take in the i3 ipc code to support custom messages
This commit is contained in:
48
sims/services/smart_corners.py
Normal file
48
sims/services/smart_corners.py
Normal file
@@ -0,0 +1,48 @@
|
||||
"""Smart-corners IPC subscriber.
|
||||
|
||||
Listens to fenster's `:smart_corners` event and emits a per-output signal
|
||||
when the WM's smart-corners state flips. Caches the latest state per output
|
||||
so widgets created after the event can ask for the current value.
|
||||
"""
|
||||
from fabric.core.service import Service, Signal
|
||||
from loguru import logger
|
||||
|
||||
from sims.services.fenster import get_i3_connection
|
||||
|
||||
|
||||
_service: "SmartCornersService | None" = None
|
||||
|
||||
|
||||
class SmartCornersService(Service):
|
||||
@Signal
|
||||
def state_changed(self, output: str, active: bool) -> None:
|
||||
"""Emitted when a fenster output flips smart-corners state."""
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self._state: dict[str, bool] = {}
|
||||
i3 = get_i3_connection()
|
||||
i3.connect("event::smart_corners", self._on_event)
|
||||
|
||||
def get(self, output: str) -> bool:
|
||||
"""Latest known state for an output, or False if unseen."""
|
||||
return self._state.get(output, False)
|
||||
|
||||
def _on_event(self, _i3, event):
|
||||
change = event.data.get("change")
|
||||
output = event.data.get("output")
|
||||
if not isinstance(output, str) or change not in ("active", "inactive"):
|
||||
logger.warning(f"[SmartCorners] unexpected event payload: {event.data!r}")
|
||||
return
|
||||
active = change == "active"
|
||||
if self._state.get(output) == active:
|
||||
return
|
||||
self._state[output] = active
|
||||
self.state_changed(output, active)
|
||||
|
||||
|
||||
def get_smart_corners_service() -> SmartCornersService:
|
||||
global _service
|
||||
if _service is None:
|
||||
_service = SmartCornersService()
|
||||
return _service
|
||||
Reference in New Issue
Block a user