overlay-notify: Implement handler
This commit is contained in:
parent
895261c2bf
commit
60558e18fd
5 changed files with 68 additions and 2 deletions
|
|
@ -12,6 +12,7 @@ use anyhow::{Context, Result};
|
||||||
use state::State;
|
use state::State;
|
||||||
use std::{env, ffi::OsString, os::unix::process::CommandExt, process, sync::Arc};
|
use std::{env, ffi::OsString, os::unix::process::CommandExt, process, sync::Arc};
|
||||||
use tracing::{error, info, warn};
|
use tracing::{error, info, warn};
|
||||||
|
use wayland::protocols::overlap_notify::OverlapNotifyState;
|
||||||
|
|
||||||
use crate::wayland::handlers::compositor::client_compositor_state;
|
use crate::wayland::handlers::compositor::client_compositor_state;
|
||||||
|
|
||||||
|
|
@ -131,6 +132,7 @@ fn main() -> Result<()> {
|
||||||
}
|
}
|
||||||
state.common.refresh();
|
state.common.refresh();
|
||||||
state::Common::refresh_focus(state);
|
state::Common::refresh_focus(state);
|
||||||
|
OverlapNotifyState::refresh(state);
|
||||||
state.common.update_x11_stacking_order();
|
state.common.update_x11_stacking_order();
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ use crate::{
|
||||||
image_source::ImageSourceState,
|
image_source::ImageSourceState,
|
||||||
output_configuration::OutputConfigurationState,
|
output_configuration::OutputConfigurationState,
|
||||||
output_power::OutputPowerState,
|
output_power::OutputPowerState,
|
||||||
|
overlap_notify::OverlapNotifyState,
|
||||||
screencopy::ScreencopyState,
|
screencopy::ScreencopyState,
|
||||||
toplevel_info::ToplevelInfoState,
|
toplevel_info::ToplevelInfoState,
|
||||||
toplevel_management::{ManagementCapabilities, ToplevelManagementState},
|
toplevel_management::{ManagementCapabilities, ToplevelManagementState},
|
||||||
|
|
@ -219,6 +220,7 @@ pub struct Common {
|
||||||
pub viewporter_state: ViewporterState,
|
pub viewporter_state: ViewporterState,
|
||||||
pub kde_decoration_state: KdeDecorationState,
|
pub kde_decoration_state: KdeDecorationState,
|
||||||
pub xdg_decoration_state: XdgDecorationState,
|
pub xdg_decoration_state: XdgDecorationState,
|
||||||
|
pub overlap_notify_state: OverlapNotifyState,
|
||||||
|
|
||||||
// shell-related wayland state
|
// shell-related wayland state
|
||||||
pub xdg_shell_state: XdgShellState,
|
pub xdg_shell_state: XdgShellState,
|
||||||
|
|
@ -499,6 +501,8 @@ impl State {
|
||||||
let output_state = OutputManagerState::new_with_xdg_output::<Self>(dh);
|
let output_state = OutputManagerState::new_with_xdg_output::<Self>(dh);
|
||||||
let output_configuration_state = OutputConfigurationState::new(dh, client_is_privileged);
|
let output_configuration_state = OutputConfigurationState::new(dh, client_is_privileged);
|
||||||
let output_power_state = OutputPowerState::new::<Self, _>(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 presentation_state = PresentationState::new::<Self>(dh, clock.id() as u32);
|
||||||
let primary_selection_state = PrimarySelectionState::new::<Self>(dh);
|
let primary_selection_state = PrimarySelectionState::new::<Self>(dh);
|
||||||
let image_source_state = ImageSourceState::new::<Self, _>(dh, client_is_privileged);
|
let image_source_state = ImageSourceState::new::<Self, _>(dh, client_is_privileged);
|
||||||
|
|
@ -609,6 +613,7 @@ impl State {
|
||||||
output_state,
|
output_state,
|
||||||
output_configuration_state,
|
output_configuration_state,
|
||||||
output_power_state,
|
output_power_state,
|
||||||
|
overlap_notify_state,
|
||||||
presentation_state,
|
presentation_state,
|
||||||
primary_selection_state,
|
primary_selection_state,
|
||||||
data_control_state,
|
data_control_state,
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ pub mod layer_shell;
|
||||||
pub mod output;
|
pub mod output;
|
||||||
pub mod output_configuration;
|
pub mod output_configuration;
|
||||||
pub mod output_power;
|
pub mod output_power;
|
||||||
|
pub mod overlap_notify;
|
||||||
pub mod pointer_constraints;
|
pub mod pointer_constraints;
|
||||||
pub mod pointer_gestures;
|
pub mod pointer_gestures;
|
||||||
pub mod presentation;
|
pub mod presentation;
|
||||||
|
|
|
||||||
42
src/wayland/handlers/overlap_notify.rs
Normal file
42
src/wayland/handlers/overlap_notify.rs
Normal 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);
|
||||||
|
|
@ -36,6 +36,7 @@ use super::toplevel_info::{
|
||||||
ToplevelHandleState, ToplevelInfoGlobalData, ToplevelInfoHandler, ToplevelState, Window,
|
ToplevelHandleState, ToplevelInfoGlobalData, ToplevelInfoHandler, ToplevelState, Window,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct OverlapNotifyState {
|
pub struct OverlapNotifyState {
|
||||||
instances: Vec<ZcosmicOverlapNotifyV1>,
|
instances: Vec<ZcosmicOverlapNotifyV1>,
|
||||||
global: GlobalId,
|
global: GlobalId,
|
||||||
|
|
@ -82,7 +83,7 @@ impl OverlapNotifyState {
|
||||||
W: Window + 'static,
|
W: Window + 'static,
|
||||||
{
|
{
|
||||||
for output in state.outputs() {
|
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() {
|
for layer_surface in map.layers() {
|
||||||
if let Some(data) = layer_surface
|
if let Some(data) = layer_surface
|
||||||
.user_data()
|
.user_data()
|
||||||
|
|
@ -144,7 +145,7 @@ impl OverlapNotifyState {
|
||||||
pub trait OverlapNotifyHandler: ToplevelInfoHandler {
|
pub trait OverlapNotifyHandler: ToplevelInfoHandler {
|
||||||
fn overlap_notify_state(&mut self) -> &mut OverlapNotifyState;
|
fn overlap_notify_state(&mut self) -> &mut OverlapNotifyState;
|
||||||
fn layer_surface_from_resource(&self, resource: ZwlrLayerSurfaceV1) -> Option<LayerSurface>;
|
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 {
|
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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue