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

commit5f6c182ae4199294460ff800733ee42869fc9d40
parentf08ed90c26
authorLucas Galante <[email protected]>
date2026-08-20 12:56
overview: chrome departures never fire the on_app_exit reaction

Dismissing the cce-cloud launcher (Popup) — or any Overlay dock — went
through the same refocus funnel as a real app exit, so on_app_exit
"overview" zoomed the desktop out every time the launcher closed.
Chrome closes as part of USING it: the departing window's mode now
downgrades the camera reaction to Nothing (silent refocus), while
world windows (Floating/Tiled/Fullscreen) keep the configured
behavior.

Shadow-verified: launcher close leaves the mode untouched; a terminal
close still enters overview.

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

 src/server/window_manager.rs | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index 01fa677..a2a65ed 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -2687,7 +2687,22 @@ impl WindowManager {
         // CAMERA does about it is the on_app_exit choice: pan to the
         // fallback (the historic behavior), jump to overview, or stay
         // exactly where the user left it.
-        let behavior = self.on_app_exit;
+        //
+        // Chrome departing is not an app exit: dismissing the cce-cloud
+        // launcher (Popup) or an Overlay dock must never fire the camera
+        // reaction — those close as part of using them.
+        let departing_chrome = match (*seat).focused {
+            crate::seat::Focus::Window(w) if !w.is_null() => matches!(
+                (*w).tiling_mode,
+                crate::tiling::TilingMode::Popup | crate::tiling::TilingMode::Overlay
+            ),
+            _ => false,
+        };
+        let behavior = if departing_chrome {
+            crate::config::OnAppExit::Nothing
+        } else {
+            self.on_app_exit
+        };
         (*seat).suppress_focus_pan = behavior != crate::config::OnAppExit::FocusPrevious;
         if !next.is_null() {
             (*seat).focus(crate::seat::Focus::Window(next));