cosmic_client_toolkit/
keyboard_layout.rs1use 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}