From dc9a3c20eaaa3598bab4b41d7d11c51ac2240371 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sun, 27 Jul 2025 11:33:55 +0200 Subject: [PATCH] metal: handle absolute motion events --- src/backend.rs | 5 +++++ src/backends/metal/input.rs | 10 ++++++++++ src/ifs/wl_seat/event_handling.rs | 21 +++++++++++++++++++++ src/libinput/event.rs | 26 ++++++++++++++++++-------- src/libinput/sys.rs | 8 ++++++++ 5 files changed, 62 insertions(+), 8 deletions(-) diff --git a/src/backend.rs b/src/backend.rs index 49320aff..7c2e18ae 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -348,6 +348,11 @@ pub enum InputEvent { dx_unaccelerated: Fixed, dy_unaccelerated: Fixed, }, + MotionAbsolute { + time_usec: u64, + x_normed: f32, + y_normed: f32, + }, Button { time_usec: u64, button: u32, diff --git a/src/backends/metal/input.rs b/src/backends/metal/input.rs index 4456ede6..58fdc569 100644 --- a/src/backends/metal/input.rs +++ b/src/backends/metal/input.rs @@ -95,6 +95,7 @@ impl MetalBackend { c::LIBINPUT_EVENT_DEVICE_REMOVED => self.handle_li_device_removed(event), c::LIBINPUT_EVENT_KEYBOARD_KEY => self.handle_keyboard_key(event), c::LIBINPUT_EVENT_POINTER_MOTION => self.handle_pointer_motion(event), + c::LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE => self.handle_pointer_motion_absolute(event), c::LIBINPUT_EVENT_POINTER_BUTTON => self.handle_pointer_button(event), c::LIBINPUT_EVENT_POINTER_SCROLL_WHEEL => { self.handle_pointer_axis(event, AxisSource::Wheel) @@ -248,6 +249,15 @@ impl MetalBackend { }); } + fn handle_pointer_motion_absolute(self: &Rc, event: LibInputEvent) { + let (event, dev) = unpack!(self, event, pointer_event); + dev.event(InputEvent::MotionAbsolute { + time_usec: event.time_usec(), + x_normed: event.x_transformed(1) as f32, + y_normed: event.y_transformed(1) as f32, + }); + } + fn handle_gesture_swipe_begin(self: &Rc, event: LibInputEvent) { let (event, dev) = unpack!(self, event, gesture_event); dev.event(InputEvent::SwipeBegin { diff --git a/src/ifs/wl_seat/event_handling.rs b/src/ifs/wl_seat/event_handling.rs index 42586ed2..7f2010e5 100644 --- a/src/ifs/wl_seat/event_handling.rs +++ b/src/ifs/wl_seat/event_handling.rs @@ -310,6 +310,7 @@ impl WlSeatGlobal { InputEvent::Key { time_usec, .. } | InputEvent::ConnectorPosition { time_usec, .. } | InputEvent::Motion { time_usec, .. } + | InputEvent::MotionAbsolute { time_usec, .. } | InputEvent::Button { time_usec, .. } | InputEvent::AxisFrame { time_usec, .. } | InputEvent::SwipeBegin { time_usec, .. } @@ -350,6 +351,7 @@ impl WlSeatGlobal { match event { InputEvent::ConnectorPosition { .. } | InputEvent::Motion { .. } + | InputEvent::MotionAbsolute { .. } | InputEvent::Button { .. } | InputEvent::AxisFrame { .. } | InputEvent::SwipeBegin { .. } @@ -406,6 +408,13 @@ impl WlSeatGlobal { dy_unaccelerated, time_usec, } => self.motion_event(time_usec, dx, dy, dx_unaccelerated, dy_unaccelerated), + InputEvent::MotionAbsolute { + time_usec, + x_normed, + y_normed, + } => { + self.motion_absolute_event(time_usec, dev.get_rect(&self.state), x_normed, y_normed) + } InputEvent::Button { time_usec, button, @@ -651,6 +660,18 @@ impl WlSeatGlobal { self.cursor_moved(time_usec, false); } + fn motion_absolute_event( + self: &Rc, + time_usec: u64, + rect: Rect, + x_normed: f32, + y_normed: f32, + ) { + let x = Fixed::from_f32(rect.x1() as f32 + x_normed * rect.width() as f32); + let y = Fixed::from_f32(rect.y1() as f32 + y_normed * rect.height() as f32); + self.motion_event_abs(time_usec, x, y, false); + } + pub fn button_event(self: &Rc, time_usec: u64, button: u32, state: KeyState) { self.for_each_ei_seat(|ei_seat| { ei_seat.handle_button(time_usec, button, state); diff --git a/src/libinput/event.rs b/src/libinput/event.rs index 8af7ff4a..ed8b362b 100644 --- a/src/libinput/event.rs +++ b/src/libinput/event.rs @@ -19,14 +19,16 @@ use { libinput_event_get_touch_event, libinput_event_get_type, libinput_event_keyboard, libinput_event_keyboard_get_key, libinput_event_keyboard_get_key_state, libinput_event_keyboard_get_time_usec, libinput_event_pointer, - libinput_event_pointer_get_button, libinput_event_pointer_get_button_state, - libinput_event_pointer_get_dx, libinput_event_pointer_get_dx_unaccelerated, - libinput_event_pointer_get_dy, libinput_event_pointer_get_dy_unaccelerated, - libinput_event_pointer_get_scroll_value, libinput_event_pointer_get_scroll_value_v120, - libinput_event_pointer_get_time_usec, libinput_event_pointer_has_axis, - libinput_event_switch, libinput_event_switch_get_switch, - libinput_event_switch_get_switch_state, libinput_event_switch_get_time_usec, - libinput_event_tablet_pad, libinput_event_tablet_pad_get_button_number, + libinput_event_pointer_get_absolute_x_transformed, + libinput_event_pointer_get_absolute_y_transformed, libinput_event_pointer_get_button, + libinput_event_pointer_get_button_state, libinput_event_pointer_get_dx, + libinput_event_pointer_get_dx_unaccelerated, libinput_event_pointer_get_dy, + libinput_event_pointer_get_dy_unaccelerated, libinput_event_pointer_get_scroll_value, + libinput_event_pointer_get_scroll_value_v120, libinput_event_pointer_get_time_usec, + libinput_event_pointer_has_axis, libinput_event_switch, + libinput_event_switch_get_switch, libinput_event_switch_get_switch_state, + libinput_event_switch_get_time_usec, libinput_event_tablet_pad, + libinput_event_tablet_pad_get_button_number, libinput_event_tablet_pad_get_button_state, libinput_event_tablet_pad_get_dial_delta_v120, libinput_event_tablet_pad_get_dial_number, libinput_event_tablet_pad_get_mode, @@ -186,6 +188,14 @@ impl<'a> LibInputEventKeyboard<'a> { } impl<'a> LibInputEventPointer<'a> { + pub fn x_transformed(&self, width: u32) -> f64 { + unsafe { libinput_event_pointer_get_absolute_x_transformed(self.event, width) } + } + + pub fn y_transformed(&self, height: u32) -> f64 { + unsafe { libinput_event_pointer_get_absolute_y_transformed(self.event, height) } + } + pub fn dx(&self) -> f64 { unsafe { libinput_event_pointer_get_dx(self.event) } } diff --git a/src/libinput/sys.rs b/src/libinput/sys.rs index e849d0f2..2de8d416 100644 --- a/src/libinput/sys.rs +++ b/src/libinput/sys.rs @@ -155,6 +155,14 @@ unsafe extern "C" { pub fn libinput_event_pointer_get_dy(event: *mut libinput_event_pointer) -> f64; pub fn libinput_event_pointer_get_dx_unaccelerated(event: *mut libinput_event_pointer) -> f64; pub fn libinput_event_pointer_get_dy_unaccelerated(event: *mut libinput_event_pointer) -> f64; + pub fn libinput_event_pointer_get_absolute_x_transformed( + event: *mut libinput_event_pointer, + width: u32, + ) -> f64; + pub fn libinput_event_pointer_get_absolute_y_transformed( + event: *mut libinput_event_pointer, + height: u32, + ) -> f64; pub fn libinput_event_pointer_get_button(event: *mut libinput_event_pointer) -> u32; pub fn libinput_event_pointer_get_button_state( event: *mut libinput_event_pointer,