Parent
#6
What to build
Keep the control surface in sync with desktop lock/suspend state. The daemon subscribes to two D-Bus signals and pushes StateMessage to all connected clients.
org.gnome.ScreenSaver.ActiveChanged(bool) on the session bus → push StateMessage(locked=True) on lock, StateMessage(locked=False) + current LayoutMessage on unlock.
org.freedesktop.login1.Manager.PrepareForSleep(bool) on the system bus → same locked/unlocked sequence on suspend/wake.
The client already has a StateMessage type; it should render a "desktop locked" overlay when locked=True and suppress input.
Acceptance criteria
Blocked by
Parent
#6
What to build
Keep the control surface in sync with desktop lock/suspend state. The daemon subscribes to two D-Bus signals and pushes
StateMessageto all connected clients.org.gnome.ScreenSaver.ActiveChanged(bool)on the session bus → pushStateMessage(locked=True)on lock,StateMessage(locked=False)+ currentLayoutMessageon unlock.org.freedesktop.login1.Manager.PrepareForSleep(bool)on the system bus → same locked/unlocked sequence on suspend/wake.The client already has a
StateMessagetype; it should render a "desktop locked" overlay whenlocked=Trueand suppress input.Acceptance criteria
StateMessage(locked=True/False)is the only new protocol message; client suppresses widget input while lockedStateMessageis pushed with correct valueBlocked by