git.lucas.co / cce-status-interface
status bar
git clone https://git.lucas.co/cce-status-interface.git

commita9f8fa6a30a590c5f5446a2f951291429b365e7a
parent911c5e6d37
authorLucas Galante <lsgalante12@gmail.com>
date2026-09-25 16:28
fix: the status bar waits for the next compositor instead of exiting

It is a systemd user service the compositor does not restore. Rebuilt
against cce-ui 2724002, its modules exited at every logout; the
launcher's backoff grew while nobody was logged in, so the tray module,
which owns the StatusNotifierWatcher, came back seconds after the next
login and Dropbox, starting into the gap, reported no tray. It now opts
into cce-ui's outlives_compositor and rejoins the successor in-process,
the watcher staying on the bus throughout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

 src/main.rs | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/main.rs b/src/main.rs
index 5aad13b..e88968e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1451,6 +1451,15 @@ pub(crate) fn draw_label(prims: &mut Vec<TextPrim>, label: cce_ui::widget::Style
 impl cce_ui::engine::Application for StatusApp {
     type Message = CustomEvent;
 
+    /// The status bar is a systemd user service the compositor does not
+    /// restore, so it waits for the next compositor instead of exiting with
+    /// this one. Exiting took the tray module's StatusNotifierWatcher off the
+    /// bus at every logout, and Dropbox, starting into the gap before the
+    /// launcher's backoff restarted the module, found no tray.
+    fn outlives_compositor(&self) -> bool {
+        true
+    }
+
     fn new(_qh: &wayland_client::QueueHandle<cce_ui::engine::EngineState<Self>>, sender: calloop::channel::Sender<Self::Message>) -> Self {
         let selected_module = parse_selected_module_from_args();