From 07e57c29cafb2d225ea8a031311f5252904794a4 Mon Sep 17 00:00:00 2001 From: Sergio Ribera <56278796+SergioRibera@users.noreply.github.com> Date: Sun, 2 Feb 2025 20:44:46 -0400 Subject: [PATCH] feat: support change region for wlr_layer --- src/platform/wayland.rs | 11 +++++++++-- src/platform_impl/linux/wayland/window/mod.rs | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/platform/wayland.rs b/src/platform/wayland.rs index 1aeb1442dc..ed77082095 100644 --- a/src/platform/wayland.rs +++ b/src/platform/wayland.rs @@ -77,9 +77,16 @@ impl EventLoopBuilderExtWayland for EventLoopBuilder { /// Additional methods on [`Window`] that are specific to Wayland. /// /// [`Window`]: crate::window::Window -pub trait WindowExtWayland {} +pub trait WindowExtWayland { + fn set_region(&self, region: Option<(LogicalPosition, LogicalSize)>); +} -impl WindowExtWayland for dyn CoreWindow + '_ {} +impl WindowExtWayland for dyn CoreWindow + '_ { + fn set_region(&self, region: Option<(LogicalPosition, LogicalSize)>) { + let window = self.as_any().downcast_ref::().unwrap(); + window.set_region(region); + } +} /// Additional methods on [`WindowAttributes`] that are specific to Wayland. pub trait WindowAttributesExtWayland { diff --git a/src/platform_impl/linux/wayland/window/mod.rs b/src/platform_impl/linux/wayland/window/mod.rs index a70449fb02..d497eb3129 100644 --- a/src/platform_impl/linux/wayland/window/mod.rs +++ b/src/platform_impl/linux/wayland/window/mod.rs @@ -3,6 +3,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; +use dpi::LogicalPosition; use sctk::compositor::{CompositorState, Region, SurfaceData}; use sctk::reexports::client::protocol::wl_display::WlDisplay; use sctk::reexports::client::protocol::wl_surface::WlSurface; @@ -332,6 +333,22 @@ impl Window { pub fn set_layer(&self, layer: Layer) { self.window.set_layer(layer); } + + #[inline] + pub fn set_region(&self, region: Option<(LogicalPosition, LogicalSize)>) { + match self.window { + WindowShell::WlrLayer { surface } => { + if let Some((pos, size)) = region { + let region = Region::new(self.compositor.as_ref()).unwrap(); + region.add(pos.x, pos.y, size.width, size.height); + surface.set_input_region(Some(region.wl_region())); + } else { + surface.set_input_region(None); + } + }, + WindowShell::Xdg { .. } => warn!("Region is ignored for XDG windows"), + } + } } impl Drop for Window {