spell_framework/wayland_adapter/lock/
input.rs1use crate::wayland_adapter::{
2 SpellLock,
3 common::{self, get_string},
4};
5use slint::{SharedString, platform::WindowEvent};
6use smithay_client_toolkit::{
7 reexports::{
8 client::{Connection, QueueHandle, protocol::wl_pointer},
9 protocols::wp::cursor_shape::v1::client::wp_cursor_shape_device_v1::Shape,
10 },
11 seat::{
12 keyboard::KeyboardHandler,
13 pointer::{PointerEvent, PointerEventKind, PointerHandler},
14 touch::TouchHandler,
15 },
16};
17use tracing::{info, trace, warn};
18
19impl TouchHandler for SpellLock {
20 fn up(
21 &mut self,
22 _conn: &Connection,
23 _qh: &QueueHandle<Self>,
24 _touch: &smithay_client_toolkit::reexports::client::protocol::wl_touch::WlTouch,
25 _serial: u32,
26 _time: u32,
27 _id: i32,
28 ) {
29 info!("Up event from touch");
30 }
31 fn down(
32 &mut self,
33 _conn: &Connection,
34 _qh: &QueueHandle<Self>,
35 _touch: &smithay_client_toolkit::reexports::client::protocol::wl_touch::WlTouch,
36 _serial: u32,
37 _time: u32,
38 _surface: smithay_client_toolkit::reexports::client::protocol::wl_surface::WlSurface,
39 _id: i32,
40 position: (f64, f64),
41 ) {
42 info!("Down event produced with posaition: {position:?}");
43 }
44
45 fn motion(
46 &mut self,
47 _conn: &Connection,
48 _qh: &QueueHandle<Self>,
49 _touch: &smithay_client_toolkit::reexports::client::protocol::wl_touch::WlTouch,
50 _time: u32,
51 _id: i32,
52 position: (f64, f64),
53 ) {
54 self.slint_part.as_ref().unwrap().adapters[0]
55 .try_dispatch_event(WindowEvent::PointerMoved {
56 position: slint::LogicalPosition {
57 x: position.0 as f32,
58 y: position.1 as f32,
59 },
60 })
61 .unwrap_or_else(|err| warn!("Touch move event failed with error: {:?}", err));
62 }
63
64 fn shape(
65 &mut self,
66 _conn: &Connection,
67 _qh: &QueueHandle<Self>,
68 _touch: &smithay_client_toolkit::reexports::client::protocol::wl_touch::WlTouch,
69 _id: i32,
70 major: f64,
71 minor: f64,
72 ) {
73 info!("Shape data released. Major: {major}, Minor: {minor}");
74 }
75 fn orientation(
76 &mut self,
77 _conn: &Connection,
78 _qh: &QueueHandle<Self>,
79 _touch: &smithay_client_toolkit::reexports::client::protocol::wl_touch::WlTouch,
80 _id: i32,
81 orientation: f64,
82 ) {
83 info!("Orientation data released: {orientation}.")
84 }
85 fn cancel(
86 &mut self,
87 _conn: &Connection,
88 _qh: &QueueHandle<Self>,
89 _touch: &smithay_client_toolkit::reexports::client::protocol::wl_touch::WlTouch,
90 ) {
91 info!("Active touch sequence cancelled");
92 }
93}
94
95impl PointerHandler for SpellLock {
96 fn pointer_frame(
97 &mut self,
98 _conn: &Connection,
99 qh: &QueueHandle<Self>,
100 _pointer: &wl_pointer::WlPointer,
101 events: &[PointerEvent],
102 ) {
103 use PointerEventKind::*;
104 for event in events {
105 for surface in self.lock_surfaces.iter() {
107 if event.surface != *surface.wl_surface() {
108 continue;
109 }
110 }
111 match event.kind {
112 Enter { .. } => {
113 info!("Pointer entered: {:?}", event.position);
114
115 let pointer = &self.pointer_state.pointer.as_ref().unwrap();
117 let serial_no: Option<u32> = self
118 .pointer_state
119 .pointer_data
120 .as_ref()
121 .unwrap()
122 .latest_enter_serial();
123 if let Some(no) = serial_no {
124 self.pointer_state
125 .cursor_shape
126 .get_shape_device(pointer, qh)
127 .set_shape(no, Shape::Pointer);
128 }
129 }
130 Leave { .. } => {
131 info!("Pointer left: {:?}", event.position);
132 self.slint_part.as_ref().unwrap().adapters[0]
133 .try_dispatch_event(WindowEvent::PointerExited)
134 .unwrap_or_else(|err| {
135 warn!("Pointer left event failed with error: {:?}", err)
136 });
137 }
138 Motion { .. } => {
139 self.slint_part.as_ref().unwrap().adapters[0]
141 .try_dispatch_event(WindowEvent::PointerMoved {
142 position: slint::LogicalPosition {
143 x: event.position.0 as f32,
144 y: event.position.1 as f32,
145 },
146 })
147 .unwrap_or_else(|err| {
148 warn!("Pointer move event failed with error: {:?}", err)
149 });
150 }
151 Press { button, .. } => {
152 trace!("Press {:x} @ {:?}", button, event.position);
153
154 self.slint_part.as_ref().unwrap().adapters[0]
155 .try_dispatch_event(WindowEvent::PointerPressed {
156 position: slint::LogicalPosition {
157 x: event.position.0 as f32,
158 y: event.position.1 as f32,
159 },
160 button: common::map_pointer_button(button),
161 })
162 .unwrap_or_else(|err| {
163 warn!("Pointer press event failed with error: {:?}", err)
164 });
165 }
166 Release { button, .. } => {
167 trace!("Release {:x} @ {:?}", button, event.position);
168
169 self.slint_part.as_ref().unwrap().adapters[0]
170 .try_dispatch_event(WindowEvent::PointerReleased {
171 position: slint::LogicalPosition {
172 x: event.position.0 as f32,
173 y: event.position.1 as f32,
174 },
175 button: common::map_pointer_button(button),
176 })
177 .unwrap_or_else(|err| {
178 warn!("Pointer release event failed with error: {:?}", err)
179 });
180 }
181 Axis {
182 horizontal,
183 vertical,
184 ..
185 } => {
186 trace!("Scroll H:{horizontal:?}, V:{vertical:?}");
187 self.slint_part.as_ref().unwrap().adapters[0]
188 .try_dispatch_event(WindowEvent::PointerScrolled {
189 position: slint::LogicalPosition {
190 x: event.position.0 as f32,
191 y: event.position.1 as f32,
192 },
193 delta_x: horizontal.absolute as f32,
194 delta_y: vertical.absolute as f32,
195 })
196 .unwrap_or_else(|err| {
197 warn!("Pointer scroll event failed with error: {:?}", err)
198 });
199 }
200 }
201 }
202 }
203}
204
205impl KeyboardHandler for SpellLock {
206 fn enter(
207 &mut self,
208 _conn: &Connection,
209 _qh: &QueueHandle<Self>,
210 _keyboard: &smithay_client_toolkit::reexports::client::protocol::wl_keyboard::WlKeyboard,
211 _surface: &smithay_client_toolkit::reexports::client::protocol::wl_surface::WlSurface,
212 _serial: u32,
213 _raw: &[u32],
214 _keysyms: &[smithay_client_toolkit::seat::keyboard::Keysym],
215 ) {
216 info!("Keyboard focus entered");
217 }
218
219 fn leave(
220 &mut self,
221 _conn: &Connection,
222 _qh: &QueueHandle<Self>,
223 _keyboard: &smithay_client_toolkit::reexports::client::protocol::wl_keyboard::WlKeyboard,
224 _surface: &smithay_client_toolkit::reexports::client::protocol::wl_surface::WlSurface,
225 _serial: u32,
226 ) {
227 info!("Keyboard focus left");
228 }
229
230 fn press_key(
231 &mut self,
232 _conn: &Connection,
233 _qh: &QueueHandle<Self>,
234 _keyboard: &smithay_client_toolkit::reexports::client::protocol::wl_keyboard::WlKeyboard,
235 _serial: u32,
236 event: smithay_client_toolkit::seat::keyboard::KeyEvent,
237 ) {
238 let string_val: SharedString = get_string(event);
239 info!("Key pressed with value : {:?}", string_val);
246 self.slint_part.as_ref().unwrap().adapters[0]
247 .try_dispatch_event(WindowEvent::KeyPressed { text: string_val })
248 .unwrap_or_else(|err| warn!("Key press event failed with error: {:?}", err));
249 }
251
252 fn release_key(
253 &mut self,
254 _conn: &Connection,
255 _qh: &QueueHandle<Self>,
256 _keyboard: &smithay_client_toolkit::reexports::client::protocol::wl_keyboard::WlKeyboard,
257 _serial: u32,
258 event: smithay_client_toolkit::seat::keyboard::KeyEvent,
259 ) {
260 info!("Key is released");
261 let string_val: SharedString = get_string(event);
267 self.slint_part.as_ref().unwrap().adapters[0]
268 .try_dispatch_event(WindowEvent::KeyReleased { text: string_val })
269 .unwrap_or_else(|err| warn!("Key release event failed with error: {:?}", err));
270 }
271
272 fn update_modifiers(
274 &mut self,
275 _conn: &Connection,
276 _qh: &QueueHandle<Self>,
277 _keyboard: &smithay_client_toolkit::reexports::client::protocol::wl_keyboard::WlKeyboard,
278 _serial: u32,
279 _modifiers: smithay_client_toolkit::seat::keyboard::Modifiers,
280 _raw_modifiers: smithay_client_toolkit::seat::keyboard::RawModifiers,
281 _layout: u32,
282 ) {
283 trace!("Updated modifiers");
284 }
285
286 fn repeat_key(
287 &mut self,
288 _conn: &Connection,
289 _qh: &QueueHandle<Self>,
290 _keyboard: &smithay_client_toolkit::reexports::client::protocol::wl_keyboard::WlKeyboard,
291 _serial: u32,
292 _event: smithay_client_toolkit::seat::keyboard::KeyEvent,
293 ) {
294 trace!("Repeated key entered");
295 }
296 fn update_repeat_info(
298 &mut self,
299 _conn: &Connection,
300 _qh: &QueueHandle<Self>,
301 _keyboard: &smithay_client_toolkit::reexports::client::protocol::wl_keyboard::WlKeyboard,
302 _info: smithay_client_toolkit::seat::keyboard::RepeatInfo,
303 ) {
304 trace!("Repeat info updation called");
305 }
306}