winit/wayland: input_zone for layer, instead of pointer_interactivity

This is a more general version of the same thing, at matches what is
used for popups and subsurfaces.
This commit is contained in:
Ian Douglas Scott 2025-09-18 13:14:19 -07:00 committed by Ashley Wulber
parent 20e60ffde6
commit ea4f704f0f
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820
3 changed files with 16 additions and 6 deletions

View file

@ -98,7 +98,7 @@ impl Todos {
get_layer_surface(iced::platform_specific::runtime::wayland::layer_surface::SctkLayerSurfaceSettings {
id: id.clone(),
size: Some((None, Some(500))),
pointer_interactivity: true,
input_zone: None,
keyboard_interactivity: cctk::sctk::shell::wlr_layer::KeyboardInteractivity::OnDemand,
anchor: Anchor::LEFT.union(Anchor::RIGHT).union(Anchor::TOP),
..Default::default()

View file

@ -7,6 +7,7 @@ use cctk::sctk::{
use iced_core::layout::Limits;
use iced_core::window::Id;
use iced_core::Rectangle;
/// output for layer surface
#[derive(Debug, Clone)]
@ -47,8 +48,9 @@ pub struct SctkLayerSurfaceSettings {
pub layer: Layer,
/// keyboard interactivity
pub keyboard_interactivity: KeyboardInteractivity,
/// pointer interactivity
pub pointer_interactivity: bool,
/// input zone
/// None results in accepting all input
pub input_zone: Option<Vec<Rectangle>>,
/// anchor, if a surface is anchored to two opposite edges, it will be stretched to fit between those edges, regardless of the specified size in that dimension.
pub anchor: Anchor,
/// output
@ -72,7 +74,7 @@ impl Default for SctkLayerSurfaceSettings {
id: Id::unique(),
layer: Layer::Top,
keyboard_interactivity: Default::default(),
pointer_interactivity: true,
input_zone: None,
anchor: Anchor::empty(),
output: Default::default(),
namespace: Default::default(),

View file

@ -886,7 +886,7 @@ impl SctkState {
id,
layer,
keyboard_interactivity,
pointer_interactivity,
input_zone,
anchor,
output,
namespace,
@ -941,11 +941,19 @@ impl SctkState {
layer_surface
.set_size(size.0.unwrap_or_default(), size.1.unwrap_or_default());
layer_surface.set_exclusive_zone(exclusive_zone);
if !pointer_interactivity {
if let Some(zone) = &input_zone {
let region = self
.compositor_state
.wl_compositor()
.create_region(&self.queue_handle, ());
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,
);
}
layer_surface.set_input_region(Some(&region));
region.destroy();
}