Skip to content

Commit

Permalink
overlay-notify: Implement handler
Browse files Browse the repository at this point in the history
  • Loading branch information
wash2 authored and Drakulix committed Nov 27, 2024
1 parent 895261c commit 60558e1
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 2 deletions.
2 changes: 2 additions & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ use anyhow::{Context, Result};
use state::State;
use std::{env, ffi::OsString, os::unix::process::CommandExt, process, sync::Arc};
use tracing::{error, info, warn};
use wayland::protocols::overlap_notify::OverlapNotifyState;

use crate::wayland::handlers::compositor::client_compositor_state;

Expand Down Expand Up @@ -131,6 +132,7 @@ fn main() -> Result<()> {
}
state.common.refresh();
state::Common::refresh_focus(state);
OverlapNotifyState::refresh(state);
state.common.update_x11_stacking_order();

{
Expand Down
5 changes: 5 additions & 0 deletions src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use crate::{
image_source::ImageSourceState,
output_configuration::OutputConfigurationState,
output_power::OutputPowerState,
overlap_notify::OverlapNotifyState,
screencopy::ScreencopyState,
toplevel_info::ToplevelInfoState,
toplevel_management::{ManagementCapabilities, ToplevelManagementState},
Expand Down Expand Up @@ -219,6 +220,7 @@ pub struct Common {
pub viewporter_state: ViewporterState,
pub kde_decoration_state: KdeDecorationState,
pub xdg_decoration_state: XdgDecorationState,
pub overlap_notify_state: OverlapNotifyState,

// shell-related wayland state
pub xdg_shell_state: XdgShellState,
Expand Down Expand Up @@ -499,6 +501,8 @@ impl State {
let output_state = OutputManagerState::new_with_xdg_output::<Self>(dh);
let output_configuration_state = OutputConfigurationState::new(dh, client_is_privileged);
let output_power_state = OutputPowerState::new::<Self, _>(dh, client_is_privileged);
let overlap_notify_state =
OverlapNotifyState::new::<Self, _>(dh, client_has_no_security_context);
let presentation_state = PresentationState::new::<Self>(dh, clock.id() as u32);
let primary_selection_state = PrimarySelectionState::new::<Self>(dh);
let image_source_state = ImageSourceState::new::<Self, _>(dh, client_is_privileged);
Expand Down Expand Up @@ -609,6 +613,7 @@ impl State {
output_state,
output_configuration_state,
output_power_state,
overlap_notify_state,
presentation_state,
primary_selection_state,
data_control_state,
Expand Down
1 change: 1 addition & 0 deletions src/wayland/handlers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
42 changes: 42 additions & 0 deletions src/wayland/handlers/overlap_notify.rs
Original file line number Diff line number Diff line change
@@ -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);
20 changes: 18 additions & 2 deletions src/wayland/protocols/overlap_notify.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ use super::toplevel_info::{
ToplevelHandleState, ToplevelInfoGlobalData, ToplevelInfoHandler, ToplevelState, Window,
};

#[derive(Debug)]
pub struct OverlapNotifyState {
instances: Vec<ZcosmicOverlapNotifyV1>,
global: GlobalId,
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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;

0 comments on commit 60558e1

Please sign in to comment.