Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
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
};