From 21527b3e38f68f8531fefc5712431d98beff75f2 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 11 Mar 2022 23:07:09 +0100 Subject: [PATCH] autocommit 2022-03-11 23:07:09 CET --- src/backends/metal.rs | 2 ++ src/backends/metal/input.rs | 34 ++++++++++++++++++++++++++++++++-- src/backends/metal/monitor.rs | 2 ++ src/libinput/event.rs | 23 ++++++++++++++--------- src/libinput/sys.rs | 3 +++ 5 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/backends/metal.rs b/src/backends/metal.rs index 11d1574e..df914d67 100644 --- a/src/backends/metal.rs +++ b/src/backends/metal.rs @@ -172,6 +172,8 @@ struct MetalInputDevice { removed: Cell, events: SyncQueue, cb: CloneCell>>, + hscroll: Cell, + vscroll: Cell, } #[derive(Clone)] diff --git a/src/backends/metal/input.rs b/src/backends/metal/input.rs index 3fc36bac..7cf8ccca 100644 --- a/src/backends/metal/input.rs +++ b/src/backends/metal/input.rs @@ -1,6 +1,6 @@ use crate::async_engine::FdStatus; -use crate::backend::{InputEvent, KeyState}; -use crate::libinput::consts::LIBINPUT_KEY_STATE_PRESSED; +use crate::backend::{InputEvent, KeyState, ScrollAxis}; +use crate::libinput::consts::{LIBINPUT_BUTTON_STATE_PRESSED, LIBINPUT_KEY_STATE_PRESSED, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL}; use crate::libinput::event::LibInputEvent; use crate::metal::MetalBackend; use crate::ErrorFmt; @@ -71,6 +71,8 @@ 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_BUTTON => self.handle_pointer_button(event), + c::LIBINPUT_EVENT_POINTER_SCROLL_WHEEL => self.handle_pointer_scroll_wheel(event), _ => {} } } @@ -95,6 +97,34 @@ impl MetalBackend { dev.event(InputEvent::Key(event.key(), state)); } + fn handle_pointer_scroll_wheel(self: &Rc, event: LibInputEvent) { + const PX_PER_SCROLL: f64 = 15.0; + const ONE_TWENTRY: f64 = 120.0; + let (event, dev) = unpack!(self, event, pointer_event); + let hscroll = event.scroll_value_v120(LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL) / ONE_TWENTRY + dev.hscroll.get(); + let vscroll = event.scroll_value_v120(LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL) / ONE_TWENTRY + dev.vscroll.get(); + let hscroll_used = (PX_PER_SCROLL * hscroll).round(); + let vscroll_used = (PX_PER_SCROLL * vscroll).round(); + dev.hscroll.set(hscroll - hscroll_used / PX_PER_SCROLL); + dev.vscroll.set(vscroll - vscroll_used / PX_PER_SCROLL); + if hscroll_used != 0.0 { + dev.event(InputEvent::Scroll(hscroll_used as i32, ScrollAxis::Horizontal)); + } + if vscroll_used != 0.0 { + dev.event(InputEvent::Scroll(vscroll_used as i32, ScrollAxis::Vertical)); + } + } + + fn handle_pointer_button(self: &Rc, event: LibInputEvent) { + let (event, dev) = unpack!(self, event, pointer_event); + let state = if event.button_state() == LIBINPUT_BUTTON_STATE_PRESSED { + KeyState::Pressed + } else { + KeyState::Released + }; + dev.event(InputEvent::Button(event.button(), state)); + } + fn handle_pointer_motion(self: &Rc, event: LibInputEvent) { let (event, dev) = unpack!(self, event, pointer_event); dev.event(InputEvent::Motion(event.dx().into(), event.dy().into())); diff --git a/src/backends/metal/monitor.rs b/src/backends/metal/monitor.rs index c80b63a7..6d123fbd 100644 --- a/src/backends/metal/monitor.rs +++ b/src/backends/metal/monitor.rs @@ -274,6 +274,8 @@ impl MetalBackend { removed: Cell::new(false), events: Default::default(), cb: Default::default(), + hscroll: Cell::new(0.0), + vscroll: Cell::new(0.0), }); slots[slot] = Some(dev.clone()); self.device_holder diff --git a/src/libinput/event.rs b/src/libinput/event.rs index 2fbf3a2a..e0643c9a 100644 --- a/src/libinput/event.rs +++ b/src/libinput/event.rs @@ -1,13 +1,6 @@ -use crate::libinput::consts::{EventType, KeyState}; +use crate::libinput::consts::{ButtonState, EventType, KeyState, PointerAxis}; use crate::libinput::device::LibInputDevice; -use crate::libinput::sys::{ - libinput_event, libinput_event_destroy, libinput_event_get_device, - libinput_event_get_keyboard_event, libinput_event_get_pointer_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_dx, libinput_event_pointer_get_dy, - libinput_event_pointer_get_time_usec, -}; +use crate::libinput::sys::{libinput_event, libinput_event_destroy, libinput_event_get_device, libinput_event_get_keyboard_event, libinput_event_get_pointer_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_dy, libinput_event_pointer_get_scroll_value_v120, libinput_event_pointer_get_time_usec}; use std::marker::PhantomData; pub struct LibInputEvent<'a> { @@ -94,6 +87,18 @@ impl<'a> LibInputEventPointer<'a> { unsafe { libinput_event_pointer_get_dy(self.event) } } + pub fn button(&self) -> u32 { + unsafe { libinput_event_pointer_get_button(self.event) } + } + + pub fn button_state(&self) -> ButtonState { + unsafe { ButtonState(libinput_event_pointer_get_button_state(self.event)) } + } + + pub fn scroll_value_v120(&self, axis: PointerAxis) -> f64 { + unsafe { libinput_event_pointer_get_scroll_value_v120(self.event, axis.raw() as _) } + } + #[allow(dead_code)] pub fn time_usec(&self) -> u64 { unsafe { libinput_event_pointer_get_time_usec(self.event) } diff --git a/src/libinput/sys.rs b/src/libinput/sys.rs index 2c15c9dc..e24ff903 100644 --- a/src/libinput/sys.rs +++ b/src/libinput/sys.rs @@ -59,6 +59,9 @@ extern "C" { pub fn libinput_event_pointer_get_time_usec(event: *mut libinput_event_pointer) -> u64; pub fn libinput_event_pointer_get_dx(event: *mut libinput_event_pointer) -> f64; pub fn libinput_event_pointer_get_dy(event: *mut libinput_event_pointer) -> 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) -> libinput_button_state; + pub fn libinput_event_pointer_get_scroll_value_v120(event: *mut libinput_event_pointer, axis: libinput_pointer_axis) -> f64; } #[repr(C)]