overlay-notify: Implement handler

This commit is contained in:
Ashley Wulber 2024-11-22 19:10:58 -05:00 committed by Victoria Brekenfeld
parent 895261c2bf
commit 60558e18fd
5 changed files with 68 additions and 2 deletions

View file

@ -21,6 +21,7 @@ pub mod layer_shell;
pub mod output;
pub mod output_configuration;
pub mod output_power;
pub mod overlap_notify;
pub mod pointer_constraints;
pub mod pointer_gestures;
pub mod presentation;

View file

@ -0,0 +1,42 @@
use smithay::{
desktop::{layer_map_for_output, LayerSurface, WindowSurfaceType},
output::Output,
reexports::wayland_protocols_wlr::layer_shell::v1::server::zwlr_layer_surface_v1::ZwlrLayerSurfaceV1,
};
use crate::{
state::State,
wayland::protocols::overlap_notify::{
delegate_overlap_notify, OverlapNotifyHandler, OverlapNotifyState,
},
};
impl OverlapNotifyHandler for State {
fn overlap_notify_state(&mut self) -> &mut OverlapNotifyState {
&mut self.common.overlap_notify_state
}
fn layer_surface_from_resource(&self, resource: ZwlrLayerSurfaceV1) -> Option<LayerSurface> {
self.common
.layer_shell_state
.layer_surfaces()
.find(|l| l.shell_surface() == &resource)
.and_then(|l| {
let shell = self.common.shell.read().unwrap();
let outputs = shell.outputs();
let ret = outputs.map(|o| layer_map_for_output(o)).find_map(|s| {
s.layer_for_surface(l.wl_surface(), WindowSurfaceType::ALL)
.cloned()
});
drop(shell);
ret
})
}
fn outputs(&self) -> impl Iterator<Item = Output> {
let shell = self.common.shell.read().unwrap();
shell.outputs().cloned().collect::<Vec<_>>().into_iter()
}
}
delegate_overlap_notify!(State);

View file

@ -36,6 +36,7 @@ use super::toplevel_info::{
ToplevelHandleState, ToplevelInfoGlobalData, ToplevelInfoHandler, ToplevelState, Window,
};
#[derive(Debug)]
pub struct OverlapNotifyState {
instances: Vec<ZcosmicOverlapNotifyV1>,
global: GlobalId,
@ -82,7 +83,7 @@ impl OverlapNotifyState {
W: Window + 'static,
{
for output in state.outputs() {
let map = layer_map_for_output(output);
let map = layer_map_for_output(&output);
for layer_surface in map.layers() {
if let Some(data) = layer_surface
.user_data()
@ -144,7 +145,7 @@ impl OverlapNotifyState {
pub trait OverlapNotifyHandler: ToplevelInfoHandler {
fn overlap_notify_state(&mut self) -> &mut OverlapNotifyState;
fn layer_surface_from_resource(&self, resource: ZwlrLayerSurfaceV1) -> Option<LayerSurface>;
fn outputs(&self) -> impl Iterator<Item = &Output>;
fn outputs(&self) -> impl Iterator<Item = Output>;
}
pub struct OverlapNotifyGlobalData {
@ -428,3 +429,18 @@ where
}
}
}
macro_rules! delegate_overlap_notify {
($(@<$( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+>)? $ty: ty) => {
smithay::reexports::wayland_server::delegate_global_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
cosmic_protocols::overlap_notify::v1::server::zcosmic_overlap_notify_v1::ZcosmicOverlapNotifyV1: $crate::wayland::protocols::overlap_notify::OverlapNotifyGlobalData
] => $crate::wayland::protocols::overlap_notify::OverlapNotifyState);
smithay::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
cosmic_protocols::overlap_notify::v1::server::zcosmic_overlap_notify_v1::ZcosmicOverlapNotifyV1: ()
] => $crate::wayland::protocols::overlap_notify::OverlapNotifyState);
smithay::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
cosmic_protocols::overlap_notify::v1::server::zcosmic_overlap_notification_v1::ZcosmicOverlapNotificationV1: ()
] => $crate::wayland::protocols::overlap_notify::OverlapNotifyState);
};
}
pub(crate) use delegate_overlap_notify;