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:
parent
20e60ffde6
commit
ea4f704f0f
3 changed files with 16 additions and 6 deletions
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(®ion));
|
layer_surface.set_input_region(Some(®ion));
|
||||||
region.destroy();
|
region.destroy();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue