Skip to main content

spell_framework/wayland_adapter/lock/
input.rs

1use 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            // Ignore events for other surfaces
106            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                    // TODO this code is redundent, as it doesn't set the cursor shape.
116                    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                    // debug!("Pointer entered @{:?}", event.position);
140                    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        // if string_val == <slint::platform::Key as Into<SharedString>>::into(Key::Backspace) {
240        //     self.loop_handle.enable(&self.backspace.unwrap()).unwrap();
241        //     self.slint_part.as_ref().unwrap().adapters[0]
242        //         .try_dispatch_event(WindowEvent::KeyPressed { text: string_val })
243        //         .unwrap();
244        // } else {
245        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        //}
250    }
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        // if let Err(err) = self.loop_handle.disable(&self.backspace.unwrap()) {
262        //     warn!("{}", err);
263        // }
264        // let key_sym = Keysym::new(event.raw_code);
265        // event.keysym = key_sym;
266        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    // TODO needs to be implemented to enable functionalities of ctl, shift, alt etc.
273    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    // TODO This method needs to be implemented after the looping mecha is changed to calloop.
297    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}