Skip to main content

cosmic_client_toolkit/
keyboard_layout.rs

1use cosmic_protocols::keyboard_layout::v1::client::{
2    zcosmic_keyboard_layout_manager_v1, zcosmic_keyboard_layout_v1,
3};
4use sctk::registry::RegistryState;
5use wayland_client::{Connection, Dispatch, QueueHandle, protocol::wl_keyboard};
6
7pub trait KeyboardLayoutHandler: Sized {
8    fn group(
9        &mut self,
10        conn: &Connection,
11        qh: &QueueHandle<Self>,
12        keyboard: &wl_keyboard::WlKeyboard,
13        keyboard_layout: &zcosmic_keyboard_layout_v1::ZcosmicKeyboardLayoutV1,
14        group: u32,
15    );
16}
17
18pub struct KeyboardLayoutState {
19    pub keyboard_layout_manager:
20        Option<zcosmic_keyboard_layout_manager_v1::ZcosmicKeyboardLayoutManagerV1>,
21}
22
23impl KeyboardLayoutState {
24    pub fn new<D>(registry: &RegistryState, qh: &QueueHandle<D>) -> Self
25    where
26        D: Dispatch<zcosmic_keyboard_layout_manager_v1::ZcosmicKeyboardLayoutManagerV1, ()>
27            + 'static,
28    {
29        let keyboard_layout_manager = registry
30            .bind_one::<zcosmic_keyboard_layout_manager_v1::ZcosmicKeyboardLayoutManagerV1, _, _>(
31                qh,
32                1..=1,
33                (),
34            )
35            .ok();
36
37        Self {
38            keyboard_layout_manager,
39        }
40    }
41
42    pub fn get_keyboard_layout<D>(
43        &self,
44        keyboard: &wl_keyboard::WlKeyboard,
45        qh: &QueueHandle<D>,
46    ) -> Option<zcosmic_keyboard_layout_v1::ZcosmicKeyboardLayoutV1>
47    where
48        D: Dispatch<zcosmic_keyboard_layout_v1::ZcosmicKeyboardLayoutV1, KeyboardLayoutUserData>
49            + 'static,
50    {
51        Some(self.keyboard_layout_manager.as_ref()?.get_keyboard_layout(
52            keyboard,
53            qh,
54            KeyboardLayoutUserData {
55                keyboard: keyboard.clone(),
56            },
57        ))
58    }
59}
60
61impl<D> Dispatch<zcosmic_keyboard_layout_manager_v1::ZcosmicKeyboardLayoutManagerV1, (), D>
62    for KeyboardLayoutState
63where
64    D: Dispatch<zcosmic_keyboard_layout_manager_v1::ZcosmicKeyboardLayoutManagerV1, ()>,
65{
66    fn event(
67        _: &mut D,
68        _: &zcosmic_keyboard_layout_manager_v1::ZcosmicKeyboardLayoutManagerV1,
69        event: zcosmic_keyboard_layout_manager_v1::Event,
70        _: &(),
71        _: &Connection,
72        _: &QueueHandle<D>,
73    ) {
74        match event {
75            _ => unreachable!(),
76        }
77    }
78}
79
80#[doc(hidden)]
81pub struct KeyboardLayoutUserData {
82    keyboard: wl_keyboard::WlKeyboard,
83}
84
85impl<D> Dispatch<zcosmic_keyboard_layout_v1::ZcosmicKeyboardLayoutV1, KeyboardLayoutUserData, D>
86    for KeyboardLayoutState
87where
88    D: Dispatch<zcosmic_keyboard_layout_v1::ZcosmicKeyboardLayoutV1, KeyboardLayoutUserData>
89        + KeyboardLayoutHandler,
90{
91    fn event(
92        state: &mut D,
93        keyboard_layout: &zcosmic_keyboard_layout_v1::ZcosmicKeyboardLayoutV1,
94        event: zcosmic_keyboard_layout_v1::Event,
95        data: &KeyboardLayoutUserData,
96        conn: &Connection,
97        qh: &QueueHandle<D>,
98    ) {
99        match event {
100            zcosmic_keyboard_layout_v1::Event::Group { group } => {
101                state.group(conn, qh, &data.keyboard, keyboard_layout, group);
102            }
103            _ => unreachable!(),
104        }
105    }
106}
107
108#[macro_export]
109macro_rules! delegate_keyboard_layout {
110    ($(@<$( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+>)? $ty: ty) => {
111        $crate::wayland_client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
112            $crate::cosmic_protocols::keyboard_layout::v1::client::zcosmic_keyboard_layout_manager_v1::ZcosmicKeyboardLayoutManagerV1: ()
113        ] => $crate::keyboard_layout::KeyboardLayoutState);
114        $crate::wayland_client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
115            $crate::cosmic_protocols::keyboard_layout::v1::client::zcosmic_keyboard_layout_v1::ZcosmicKeyboardLayoutV1: $crate::keyboard_layout::KeyboardLayoutUserData
116        ] => $crate::keyboard_layout::KeyboardLayoutState);
117    };
118}