smithay/wayland/virtual_keyboard/
mod.rs
1use wayland_protocols_misc::zwp_virtual_keyboard_v1::server::{
55 zwp_virtual_keyboard_manager_v1::{self, ZwpVirtualKeyboardManagerV1},
56 zwp_virtual_keyboard_v1::ZwpVirtualKeyboardV1,
57};
58use wayland_server::{backend::GlobalId, Client, DataInit, Dispatch, DisplayHandle, GlobalDispatch, New};
59
60use crate::input::{Seat, SeatHandler};
61
62use self::virtual_keyboard_handle::VirtualKeyboardHandle;
63
64const MANAGER_VERSION: u32 = 1;
65
66mod virtual_keyboard_handle;
67
68pub use virtual_keyboard_handle::VirtualKeyboardUserData;
69
70#[derive(Debug)]
72pub struct VirtualKeyboardManagerState {
73 global: GlobalId,
74}
75
76#[allow(missing_debug_implementations)]
78pub struct VirtualKeyboardManagerGlobalData {
79 filter: Box<dyn for<'c> Fn(&'c Client) -> bool + Send + Sync>,
80}
81
82fn create_global_with_filter<D, F>(display: &DisplayHandle, filter: F) -> GlobalId
83where
84 D: GlobalDispatch<ZwpVirtualKeyboardManagerV1, VirtualKeyboardManagerGlobalData> + 'static,
85 F: for<'c> Fn(&'c Client) -> bool + Send + Sync + 'static,
86{
87 let data = VirtualKeyboardManagerGlobalData {
88 filter: Box::new(filter),
89 };
90
91 display.create_global::<D, ZwpVirtualKeyboardManagerV1, _>(MANAGER_VERSION, data)
92}
93
94impl VirtualKeyboardManagerState {
95 pub fn new<D, F>(display: &DisplayHandle, filter: F) -> Self
97 where
98 D: GlobalDispatch<ZwpVirtualKeyboardManagerV1, VirtualKeyboardManagerGlobalData>,
99 D: Dispatch<ZwpVirtualKeyboardManagerV1, ()>,
100 D: Dispatch<ZwpVirtualKeyboardV1, VirtualKeyboardUserData<D>>,
101 D: SeatHandler,
102 D: 'static,
103 F: for<'c> Fn(&'c Client) -> bool + Send + Sync + 'static,
104 {
105 let global = create_global_with_filter::<D, F>(display, filter);
106
107 Self { global }
108 }
109
110 pub fn global(&self) -> GlobalId {
112 self.global.clone()
113 }
114}
115
116impl<D> GlobalDispatch<ZwpVirtualKeyboardManagerV1, VirtualKeyboardManagerGlobalData, D>
117 for VirtualKeyboardManagerState
118where
119 D: GlobalDispatch<ZwpVirtualKeyboardManagerV1, VirtualKeyboardManagerGlobalData>,
120 D: Dispatch<ZwpVirtualKeyboardManagerV1, ()>,
121 D: Dispatch<ZwpVirtualKeyboardV1, VirtualKeyboardUserData<D>>,
122 D: SeatHandler,
123 D: 'static,
124{
125 fn bind(
126 _: &mut D,
127 _: &DisplayHandle,
128 _: &Client,
129 resource: New<ZwpVirtualKeyboardManagerV1>,
130 _: &VirtualKeyboardManagerGlobalData,
131 data_init: &mut DataInit<'_, D>,
132 ) {
133 data_init.init(resource, ());
134 }
135
136 fn can_view(client: Client, global_data: &VirtualKeyboardManagerGlobalData) -> bool {
137 (global_data.filter)(&client)
138 }
139}
140
141impl<D> Dispatch<ZwpVirtualKeyboardManagerV1, (), D> for VirtualKeyboardManagerState
142where
143 D: Dispatch<ZwpVirtualKeyboardManagerV1, ()>,
144 D: Dispatch<ZwpVirtualKeyboardV1, VirtualKeyboardUserData<D>>,
145 D: SeatHandler,
146 D: 'static,
147{
148 fn request(
149 _state: &mut D,
150 _client: &Client,
151 _resource: &ZwpVirtualKeyboardManagerV1,
152 request: zwp_virtual_keyboard_manager_v1::Request,
153 _data: &(),
154 _handle: &DisplayHandle,
155 data_init: &mut DataInit<'_, D>,
156 ) {
157 match request {
158 zwp_virtual_keyboard_manager_v1::Request::CreateVirtualKeyboard { seat, id } => {
159 let seat = Seat::<D>::from_resource(&seat).unwrap();
160 let user_data = seat.user_data();
161 user_data.insert_if_missing(VirtualKeyboardHandle::default);
162 let virtual_keyboard_handle = user_data.get::<VirtualKeyboardHandle>().unwrap();
163 data_init.init(
164 id,
165 VirtualKeyboardUserData {
166 handle: virtual_keyboard_handle.clone(),
167 seat: seat.clone(),
168 },
169 );
170 }
171 _ => unreachable!(),
172 }
173 }
174}
175
176#[allow(missing_docs)] #[macro_export]
178macro_rules! delegate_virtual_keyboard_manager {
179 ($(@<$( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+>)? $ty: ty) => {
180 $crate::reexports::wayland_server::delegate_global_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
181 $crate::reexports::wayland_protocols_misc::zwp_virtual_keyboard_v1::server::zwp_virtual_keyboard_manager_v1::ZwpVirtualKeyboardManagerV1: $crate::wayland::virtual_keyboard::VirtualKeyboardManagerGlobalData
182 ] => $crate::wayland::virtual_keyboard::VirtualKeyboardManagerState);
183
184 $crate::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
185 $crate::reexports::wayland_protocols_misc::zwp_virtual_keyboard_v1::server::zwp_virtual_keyboard_manager_v1::ZwpVirtualKeyboardManagerV1: ()
186 ] => $crate::wayland::virtual_keyboard::VirtualKeyboardManagerState);
187
188 $crate::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
189 $crate::reexports::wayland_protocols_misc::zwp_virtual_keyboard_v1::server::zwp_virtual_keyboard_v1::ZwpVirtualKeyboardV1: $crate::wayland::virtual_keyboard::VirtualKeyboardUserData<Self>
190 ] => $crate::wayland::virtual_keyboard::VirtualKeyboardManagerState);
191 };
192}