cosmic_client_toolkit/
toplevel_management.rs

1use 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}