From 20e60ffde665599d8c2f441cdf0e4d37c6984f66 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Thu, 18 Sep 2025 13:05:18 -0700 Subject: [PATCH] winit/wayland: Allow `Vec` for `input_zone` --- .../src/platform_specific/wayland/popup.rs | 2 +- .../platform_specific/wayland/subsurface.rs | 2 +- .../wayland/event_loop/state.rs | 32 +++++++++++-------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/runtime/src/platform_specific/wayland/popup.rs b/runtime/src/platform_specific/wayland/popup.rs index 46dc310a..e0475eb8 100644 --- a/runtime/src/platform_specific/wayland/popup.rs +++ b/runtime/src/platform_specific/wayland/popup.rs @@ -27,7 +27,7 @@ pub struct SctkPopupSettings { pub close_with_children: bool, /// input zone /// None results in accepting all input - pub input_zone: Option, + pub input_zone: Option>, } impl Hash for SctkPopupSettings { diff --git a/runtime/src/platform_specific/wayland/subsurface.rs b/runtime/src/platform_specific/wayland/subsurface.rs index 5d9edbdd..f174b0a5 100644 --- a/runtime/src/platform_specific/wayland/subsurface.rs +++ b/runtime/src/platform_specific/wayland/subsurface.rs @@ -35,7 +35,7 @@ pub struct SctkSubsurfaceSettings { /// input zone /// None results in accepting all input - pub input_zone: Option, + pub input_zone: Option>, } impl Hash for SctkSubsurfaceSettings { diff --git a/winit/src/platform_specific/wayland/event_loop/state.rs b/winit/src/platform_specific/wayland/event_loop/state.rs index 467d98f9..90da2603 100644 --- a/winit/src/platform_specific/wayland/event_loop/state.rs +++ b/winit/src/platform_specific/wayland/event_loop/state.rs @@ -729,17 +729,19 @@ impl SctkState { let wl_surface = self.compositor_state.create_surface(&self.queue_handle); _ = self.id_map.insert(wl_surface.id(), settings.id.clone()); - if let Some(z) = settings.input_zone { + if let Some(zone) = &settings.input_zone { let region = self .compositor_state .wl_compositor() .create_region(&self.queue_handle, ()); - region.add( - z.x.round() as i32, - z.y.round() as i32, - z.width.round() as i32, - z.height.round() as i32, - ); + for rect in zone { + region.add( + rect.x.round() as i32, + rect.y.round() as i32, + rect.width.round() as i32, + rect.height.round() as i32, + ); + } wl_surface.set_input_region(Some(®ion)); } let (toplevel, popup) = match &parent { @@ -1684,17 +1686,19 @@ impl SctkState { ); wl_subsurface.set_position(bounds.x as i32, bounds.y as i32); _ = wl_surface.frame(&self.queue_handle, wl_surface.clone()); - if let Some(zone) = settings.input_zone { + if let Some(zone) = &settings.input_zone { let region = self .compositor_state .wl_compositor() .create_region(&self.queue_handle, ()); - region.add( - zone.x.round() as i32, - zone.y.round() as i32, - zone.width.round() as i32, - zone.height.round() as i32, - ); + for rect in zone { + region.add( + rect.x.round() as i32, + rect.y.round() as i32, + rect.width.round() as i32, + rect.height.round() as i32, + ); + } wl_surface.set_input_region(Some(®ion)); region.destroy(); }