git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit289d1d1b10fa594c2454fb572cfda152af251c95
parentb5820cad16
authorLucas Galante <[email protected]>
date2026-08-01 23:44
fix: honor the window-management popup flag over the cce-cloud app_id heuristic

get_mode_for_window force-classified every cce-cloud* toplevel as Overlay,
ignoring the set_popup request the launcher makes through the cce
window-management protocol. Overlay's fresh-slot placement is a full-height
dock strip, so --json popups (which size themselves once, then obey the
configure) opened as a monitor-tall panel. An explicitly popup-flagged
toplevel now resolves to Popup mode, which sizes from the window's own
geometry/min-size. Focus-history transparency is unaffected: is_overlay_ui
matches the cce-cloud app_id independently of tiling mode.

Co-Authored-By: Claude Fable 5 <[email protected]>

 src/server/window_manager.rs | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index bad0306..99bc071 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -1478,6 +1478,13 @@ impl WindowManager {
         if app_id.as_deref() == Some("cce-notifier") || app_id.as_deref() == Some("cce-notification-daemon") || app_id.as_deref() == Some("clear-notification-daemon") {
             return crate::tiling::TilingMode::Popup;
         }
+        // An explicit set_popup via the cce window-management protocol beats the
+        // app_id heuristic below: a cce-cloud toplevel that flagged itself a popup
+        // sizes itself (dmenu-style) instead of taking the overlay dock's
+        // full-height fresh slot.
+        if (*win).tiling_mode == crate::tiling::TilingMode::Popup {
+            return crate::tiling::TilingMode::Popup;
+        }
         if app_id.as_deref().map_or(false, |id| id.starts_with("cce-cloud")) {
             return crate::tiling::TilingMode::Overlay;
         }