cosmic_client_toolkit/
toplevel_management.rs1use cosmic_protocols::toplevel_management::v1::client::zcosmic_toplevel_manager_v1;
2use sctk::registry::RegistryState;
3use wayland_client::{Connection, Dispatch, QueueHandle, WEnum};
4
5use crate::GlobalData;
6
7pub struct ToplevelManagerState {
8 pub manager: zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1,
9}
10
11impl ToplevelManagerState {
12 pub fn try_new<D>(registry: &RegistryState, qh: &QueueHandle<D>) -> Option<Self>
13 where
14 D: Dispatch<zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1, GlobalData> + 'static,
15 {
16 let manager = registry
17 .bind_one::<zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1, _, _>(
18 qh,
19 1..=4,
20 GlobalData,
21 )
22 .ok()?;
23
24 Some(Self { manager })
25 }
26
27 pub fn new<D>(registry: &RegistryState, qh: &QueueHandle<D>) -> Self
28 where
29 D: Dispatch<zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1, GlobalData> + 'static,
30 {
31 Self::try_new(registry, qh).unwrap()
32 }
33}
34
35impl<D> Dispatch<zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1, GlobalData, D>
36 for ToplevelManagerState
37where
38 D: Dispatch<zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1, GlobalData>
39 + Dispatch<zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1, GlobalData>
40 + ToplevelManagerHandler
41 + 'static,
42{
43 fn event(
44 state: &mut D,
45 _proxy: &zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1,
46 event: <zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1 as wayland_client::Proxy>::Event,
47 _data: &GlobalData,
48 conn: &wayland_client::Connection,
49 qhandle: &QueueHandle<D>,
50 ) {
51 match event {
52 zcosmic_toplevel_manager_v1::Event::Capabilities { capabilities } => {
53 let capabilities = capabilities
54 .chunks(4)
55 .map(|chunk| WEnum::from(u32::from_ne_bytes(chunk.try_into().unwrap())))
56 .collect();
57 state.capabilities(conn, qhandle, capabilities)
58 }
59 _ => unimplemented!(),
60 }
61 }
62}
63
64pub trait ToplevelManagerHandler: Sized {
65 fn toplevel_manager_state(&mut self) -> &mut ToplevelManagerState;
66
67 fn capabilities(
68 &mut self,
69 conn: &Connection,
70 qh: &QueueHandle<Self>,
71 capabilities: Vec<
72 WEnum<zcosmic_toplevel_manager_v1::ZcosmicToplelevelManagementCapabilitiesV1>,
73 >,
74 );
75}
76
77#[macro_export]
78macro_rules! delegate_toplevel_manager {
79 ($(@<$( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+>)? $ty: ty) => {
80 $crate::wayland_client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
81 $crate::cosmic_protocols::toplevel_management::v1::client::zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1: $crate::GlobalData
82 ] => $crate::toplevel_management::ToplevelManagerState);
83 };
84}