diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-08-09 15:15:06 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-08-10 14:50:51 +0400 |
| commit | ec1a888386261bf8cd4f5dd9a272d329bb05e110 (patch) | |
| tree | 963ccbf800566ebbd896ea925c19a87e029c9245 | |
| parent | 0047272673f8cc3679299b2626a526b9a329b7de (diff) | |
| download | niri-ec1a888386261bf8cd4f5dd9a272d329bb05e110.tar.gz niri-ec1a888386261bf8cd4f5dd9a272d329bb05e110.tar.bz2 niri-ec1a888386261bf8cd4f5dd9a272d329bb05e110.zip | |
input: Handle relative pointer motion
| -rw-r--r-- | src/input.rs | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/input.rs b/src/input.rs index f2a91082..b7b1959b 100644 --- a/src/input.rs +++ b/src/input.rs @@ -1,9 +1,9 @@ use smithay::backend::input::{ AbsolutePositionEvent, Axis, AxisSource, ButtonState, Event, InputBackend, InputEvent, - KeyboardKeyEvent, PointerAxisEvent, PointerButtonEvent, + KeyboardKeyEvent, PointerAxisEvent, PointerButtonEvent, PointerMotionEvent, }; use smithay::input::keyboard::{keysyms, FilterResult}; -use smithay::input::pointer::{AxisFrame, ButtonEvent, MotionEvent}; +use smithay::input::pointer::{AxisFrame, ButtonEvent, MotionEvent, RelativeMotionEvent}; use smithay::reexports::wayland_server::protocol::wl_surface::WlSurface; use smithay::utils::SERIAL_COUNTER; @@ -55,7 +55,41 @@ impl Niri { } } } - InputEvent::PointerMotion { .. } => {} + InputEvent::PointerMotion { event, .. } => { + let serial = SERIAL_COUNTER.next_serial(); + + let pointer = self.seat.get_pointer().unwrap(); + let mut pointer_location = pointer.current_location(); + + pointer_location += event.delta(); + + let output = self.space.outputs().next().unwrap(); + let output_geo = self.space.output_geometry(output).unwrap(); + + pointer_location.x = pointer_location.x.clamp(0., output_geo.size.w as f64); + pointer_location.y = pointer_location.y.clamp(0., output_geo.size.h as f64); + + let under = self.surface_under_pointer(&pointer); + pointer.motion( + self, + under.clone(), + &MotionEvent { + location: pointer_location, + serial, + time: event.time_msec(), + }, + ); + + pointer.relative_motion( + self, + under, + &RelativeMotionEvent { + delta: event.delta(), + delta_unaccel: event.delta_unaccel(), + utime: event.time(), + }, + ); + } InputEvent::PointerMotionAbsolute { event, .. } => { let output = self.space.outputs().next().unwrap(); |
