aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-08-09 15:15:06 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-08-10 14:50:51 +0400
commitec1a888386261bf8cd4f5dd9a272d329bb05e110 (patch)
tree963ccbf800566ebbd896ea925c19a87e029c9245
parent0047272673f8cc3679299b2626a526b9a329b7de (diff)
downloadniri-ec1a888386261bf8cd4f5dd9a272d329bb05e110.tar.gz
niri-ec1a888386261bf8cd4f5dd9a272d329bb05e110.tar.bz2
niri-ec1a888386261bf8cd4f5dd9a272d329bb05e110.zip
input: Handle relative pointer motion
-rw-r--r--src/input.rs40
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();