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 { get_layer_surface(iced::platform_specific::runtime::wayland::layer_surface::SctkLayerSurfaceSettings {
id: id.clone(), id: id.clone(),
size: Some((None, Some(500))), size: Some((None, Some(500))),
pointer_interactivity: true, input_zone: None,
keyboard_interactivity: cctk::sctk::shell::wlr_layer::KeyboardInteractivity::OnDemand, keyboard_interactivity: cctk::sctk::shell::wlr_layer::KeyboardInteractivity::OnDemand,
anchor: Anchor::LEFT.union(Anchor::RIGHT).union(Anchor::TOP), anchor: Anchor::LEFT.union(Anchor::RIGHT).union(Anchor::TOP),
..Default::default() ..Default::default()

View file

@ -7,6 +7,7 @@ use cctk::sctk::{
use iced_core::layout::Limits; use iced_core::layout::Limits;
use iced_core::window::Id; use iced_core::window::Id;
use iced_core::Rectangle;
/// output for layer surface /// output for layer surface
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -47,8 +48,9 @@ pub struct SctkLayerSurfaceSettings {
pub layer: Layer, pub layer: Layer,
/// keyboard interactivity /// keyboard interactivity
pub keyboard_interactivity: KeyboardInteractivity, pub keyboard_interactivity: KeyboardInteractivity,
/// pointer interactivity /// input zone
pub pointer_interactivity: bool, /// 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. /// 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, pub anchor: Anchor,
/// output /// output
@ -72,7 +74,7 @@ impl Default for SctkLayerSurfaceSettings {
id: Id::unique(), id: Id::unique(),
layer: Layer::Top, layer: Layer::Top,
keyboard_interactivity: Default::default(), keyboard_interactivity: Default::default(),
pointer_interactivity: true, input_zone: None,
anchor: Anchor::empty(), anchor: Anchor::empty(),
output: Default::default(), output: Default::default(),
namespace: Default::default(), namespace: Default::default(),

View file

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