1
0
Fork 0
forked from wry/wry

metal: handle absolute motion events

This commit is contained in:
Julian Orth 2025-07-27 11:33:55 +02:00
parent 9bfebe4c42
commit dc9a3c20ea
5 changed files with 62 additions and 8 deletions

View file

@ -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,

View file

@ -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<Self>, 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<Self>, event: LibInputEvent) {
let (event, dev) = unpack!(self, event, gesture_event);
dev.event(InputEvent::SwipeBegin {

View file

@ -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<Self>,
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<Self>, time_usec: u64, button: u32, state: KeyState) {
self.for_each_ei_seat(|ei_seat| {
ei_seat.handle_button(time_usec, button, state);

View file

@ -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) }
}

View file

@ -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,