//! Handlers for KDE decoration events. use tracing::trace; use wayland_protocols_misc::server_decoration::server::org_kde_kwin_server_decoration::{ OrgKdeKwinServerDecoration, Request, }; use wayland_protocols_misc::server_decoration::server::org_kde_kwin_server_decoration_manager::{ OrgKdeKwinServerDecorationManager, Request as ManagerRequest, }; use wayland_server::protocol::wl_surface::WlSurface; use wayland_server::{Client, DataInit, Dispatch, DisplayHandle, GlobalDispatch, New, Resource}; use crate::wayland::shell::kde::decoration::{KdeDecorationHandler, KdeDecorationState}; use super::decoration::KdeDecorationManagerGlobalData; impl GlobalDispatch for KdeDecorationState where D: GlobalDispatch + Dispatch + Dispatch + KdeDecorationHandler + 'static, { fn bind( state: &mut D, _dh: &DisplayHandle, _client: &Client, resource: New, _global_data: &KdeDecorationManagerGlobalData, data_init: &mut DataInit<'_, D>, ) { let kde_decoration_manager = data_init.init(resource, ()); // Set default decoration mode. let default_mode = state.kde_decoration_state().default_mode; kde_decoration_manager.default_mode(default_mode); trace!("Bound decoration manager global"); } fn can_view(client: Client, global_data: &KdeDecorationManagerGlobalData) -> bool { (global_data.filter)(&client) } } impl Dispatch for KdeDecorationState where D: Dispatch + Dispatch + Dispatch + KdeDecorationHandler + 'static, { fn request( state: &mut D, _client: &Client, _kde_decoration_manager: &OrgKdeKwinServerDecorationManager, request: ManagerRequest, _data: &(), _dh: &DisplayHandle, data_init: &mut DataInit<'_, D>, ) { let (id, surface) = match request { ManagerRequest::Create { id, surface } => (id, surface), _ => unreachable!(), }; let kde_decoration = data_init.init(id, surface); let surface = kde_decoration.data().unwrap(); state.new_decoration(surface, &kde_decoration); trace!(surface = ?surface, "Created decoration object for surface"); } } impl Dispatch for KdeDecorationState where D: Dispatch + KdeDecorationHandler + 'static, { fn request( state: &mut D, _client: &Client, kde_decoration: &OrgKdeKwinServerDecoration, request: Request, surface: &WlSurface, _dh: &DisplayHandle, _data_init: &mut DataInit<'_, D>, ) { trace!( surface = ?surface, request = ?request, "Decoration request for surface" ); match request { Request::RequestMode { mode } => state.request_mode(surface, kde_decoration, mode), Request::Release => state.release(kde_decoration, surface), _ => unreachable!(), } } }