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

commit592b6e297e92dc60e64399a988b349189a8b6064
parent410735c10f
authorLucas Galante <[email protected]>
date2026-06-27 19:05
Bypass overview input blocking for cce-cloud layer shell surface

 src/server/cursor.rs         | 48 ++++++++++++++++++++++++++++++++++++++++++++
 src/server/keyboard_group.rs | 12 +++++++++++
 2 files changed, 60 insertions(+)

diff --git a/src/server/cursor.rs b/src/server/cursor.rs
index 5d77bd7..452b827 100644
--- a/src/server/cursor.rs
+++ b/src/server/cursor.rs
@@ -588,6 +588,18 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
                     }
                 }
             }
+            SceneNodeDataVal::LayerSurface(layer_surface) => {
+                if !layer_surface.is_null() {
+                    is_app_surface = true;
+                    let wlr_layer_surface = (*layer_surface).wlr_layer_surface;
+                    if !wlr_layer_surface.is_null() && !(*wlr_layer_surface).namespace.is_null() {
+                        let ns = std::ffi::CStr::from_ptr((*wlr_layer_surface).namespace).to_string_lossy();
+                        if ns == "cce-cloud" {
+                            is_overlay_window = true;
+                        }
+                    }
+                }
+            }
             SceneNodeDataVal::ShellSurface(_) | SceneNodeDataVal::OverrideRedirect(_) => {
                 is_app_surface = true;
             }
@@ -1265,6 +1277,18 @@ unsafe extern "C" fn handle_touch_down(listener: *mut ffi::wl_listener, data: *m
                     }
                 }
             }
+            SceneNodeDataVal::LayerSurface(layer_surface) => {
+                if !layer_surface.is_null() {
+                    is_app_surface = true;
+                    let wlr_layer_surface = (*layer_surface).wlr_layer_surface;
+                    if !wlr_layer_surface.is_null() && !(*wlr_layer_surface).namespace.is_null() {
+                        let ns = std::ffi::CStr::from_ptr((*wlr_layer_surface).namespace).to_string_lossy();
+                        if ns == "cce-cloud" {
+                            is_overlay_window = true;
+                        }
+                    }
+                }
+            }
             SceneNodeDataVal::ShellSurface(_) | SceneNodeDataVal::OverrideRedirect(_) => {
                 is_app_surface = true;
             }
@@ -1322,6 +1346,18 @@ unsafe extern "C" fn handle_touch_motion(listener: *mut ffi::wl_listener, data:
                         }
                     }
                 }
+                SceneNodeDataVal::LayerSurface(layer_surface) => {
+                    if !layer_surface.is_null() {
+                        is_app_surface = true;
+                        let wlr_layer_surface = (*layer_surface).wlr_layer_surface;
+                        if !wlr_layer_surface.is_null() && !(*wlr_layer_surface).namespace.is_null() {
+                            let ns = std::ffi::CStr::from_ptr((*wlr_layer_surface).namespace).to_string_lossy();
+                            if ns == "cce-cloud" {
+                                is_overlay_window = true;
+                            }
+                        }
+                    }
+                }
                 SceneNodeDataVal::ShellSurface(_) | SceneNodeDataVal::OverrideRedirect(_) => {
                     is_app_surface = true;
                 }
@@ -1363,6 +1399,18 @@ unsafe extern "C" fn handle_touch_up(listener: *mut ffi::wl_listener, data: *mut
                         }
                     }
                 }
+                SceneNodeDataVal::LayerSurface(layer_surface) => {
+                    if !layer_surface.is_null() {
+                        is_app_surface = true;
+                        let wlr_layer_surface = (*layer_surface).wlr_layer_surface;
+                        if !wlr_layer_surface.is_null() && !(*wlr_layer_surface).namespace.is_null() {
+                            let ns = std::ffi::CStr::from_ptr((*wlr_layer_surface).namespace).to_string_lossy();
+                            if ns == "cce-cloud" {
+                                is_overlay_window = true;
+                            }
+                        }
+                    }
+                }
                 SceneNodeDataVal::ShellSurface(_) | SceneNodeDataVal::OverrideRedirect(_) => {
                     is_app_surface = true;
                 }
diff --git a/src/server/keyboard_group.rs b/src/server/keyboard_group.rs
index 7c0b6d5..7cd2784 100644
--- a/src/server/keyboard_group.rs
+++ b/src/server/keyboard_group.rs
@@ -447,6 +447,18 @@ unsafe extern "C" fn handle_group_key(listener: *mut ffi::wl_listener, data: *mu
                 } else {
                     false
                 }
+            } else if let crate::seat::Focus::LayerSurface(focused_layer) = (*group.seat).focused {
+                if !focused_layer.is_null() {
+                    let wlr_layer_surface = crate::ffi::wlr_layer_surface_v1_try_from_wlr_surface(focused_layer);
+                    if !wlr_layer_surface.is_null() && !(*wlr_layer_surface).namespace.is_null() {
+                        let ns = std::ffi::CStr::from_ptr((*wlr_layer_surface).namespace).to_string_lossy();
+                        ns == "cce-cloud"
+                    } else {
+                        false
+                    }
+                } else {
+                    false
+                }
             } else {
                 false
             };