From 7305f68909b4d77f6a7ac13379537121f7b771d1 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Thu, 20 Mar 2025 21:09:16 +0100 Subject: [PATCH] all: make scroll axis handling more robust --- src/backend.rs | 2 +- src/cli/seat_test.rs | 16 ++++++++-------- src/ei/ei_ifs/ei_device.rs | 3 ++- src/ei/ei_ifs/ei_scroll.rs | 12 ++++++------ src/ei/ei_ifs/ei_seat.rs | 14 ++++++-------- src/ifs/jay_seat_events.rs | 6 ++++-- src/ifs/wl_seat/event_handling.rs | 4 +++- src/ifs/wl_seat/pointer_owner.rs | 4 +++- src/ifs/wl_seat/wl_pointer.rs | 4 ++-- src/utils/scroller.rs | 6 +++--- 10 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/backend.rs b/src/backend.rs index 227114ee..6831b632 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -280,7 +280,7 @@ pub enum KeyState { Pressed, } -#[derive(Debug, Copy, Clone, Eq, PartialEq)] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Linearize)] pub enum ScrollAxis { Horizontal = HORIZONTAL_SCROLL as _, Vertical = VERTICAL_SCROLL as _, diff --git a/src/cli/seat_test.rs b/src/cli/seat_test.rs index c587a0dc..1788bd47 100644 --- a/src/cli/seat_test.rs +++ b/src/cli/seat_test.rs @@ -190,14 +190,14 @@ async fn run(seat_test: Rc) { let st = seat_test.clone(); AxisFrame::handle(tc, se, ps.clone(), move |ps, ev| { let source = ps.source.take(); - let px_x = ps.px[HORIZONTAL_SCROLL as usize].take(); - let px_y = ps.px[VERTICAL_SCROLL as usize].take(); - let stop_x = ps.stop[HORIZONTAL_SCROLL as usize].take(); - let stop_y = ps.stop[VERTICAL_SCROLL as usize].take(); - let v120_x = ps.v120[HORIZONTAL_SCROLL as usize].take(); - let v120_y = ps.v120[VERTICAL_SCROLL as usize].take(); - let inverted_x = ps.inverted[HORIZONTAL_SCROLL as usize].get(); - let inverted_y = ps.inverted[VERTICAL_SCROLL as usize].get(); + let px_x = ps.px[HORIZONTAL_SCROLL].take(); + let px_y = ps.px[VERTICAL_SCROLL].take(); + let stop_x = ps.stop[HORIZONTAL_SCROLL].take(); + let stop_y = ps.stop[VERTICAL_SCROLL].take(); + let v120_x = ps.v120[HORIZONTAL_SCROLL].take(); + let v120_y = ps.v120[VERTICAL_SCROLL].take(); + let inverted_x = ps.inverted[HORIZONTAL_SCROLL].get(); + let inverted_y = ps.inverted[VERTICAL_SCROLL].get(); if all || ev.seat == seat { if all { print!("Seat: {}, ", st.name(ev.seat)); diff --git a/src/ei/ei_ifs/ei_device.rs b/src/ei/ei_ifs/ei_device.rs index c29e701a..a9b2e39c 100644 --- a/src/ei/ei_ifs/ei_device.rs +++ b/src/ei/ei_ifs/ei_device.rs @@ -21,6 +21,7 @@ use { }, }, }, + linearize::LinearizeExt, std::{cell::Cell, rc::Rc}, thiserror::Error, }; @@ -204,7 +205,7 @@ impl EiDeviceRequestHandler for EiDevice { } { let mut need_frame = false; - for axis in [ScrollAxis::Horizontal, ScrollAxis::Vertical] { + for axis in ScrollAxis::variants() { let idx = axis as usize; if let Some(v120) = self.scroll_v120[idx].take() { need_frame = true; diff --git a/src/ei/ei_ifs/ei_scroll.rs b/src/ei/ei_ifs/ei_scroll.rs index b634c763..aa0efdd1 100644 --- a/src/ei/ei_ifs/ei_scroll.rs +++ b/src/ei/ei_ifs/ei_scroll.rs @@ -66,8 +66,8 @@ impl EiScrollRequestHandler for EiScroll { } fn client_scroll(&self, req: ClientScroll, _slf: &Rc) -> Result<(), Self::Error> { - self.device.scroll_px[HORIZONTAL_SCROLL as usize].set(Some(req.x)); - self.device.scroll_px[VERTICAL_SCROLL as usize].set(Some(req.y)); + self.device.scroll_px[HORIZONTAL_SCROLL].set(Some(req.x)); + self.device.scroll_px[VERTICAL_SCROLL].set(Some(req.y)); Ok(()) } @@ -76,8 +76,8 @@ impl EiScrollRequestHandler for EiScroll { req: ClientScrollDiscrete, _slf: &Rc, ) -> Result<(), Self::Error> { - self.device.scroll_v120[HORIZONTAL_SCROLL as usize].set(Some(req.x)); - self.device.scroll_v120[VERTICAL_SCROLL as usize].set(Some(req.y)); + self.device.scroll_v120[HORIZONTAL_SCROLL].set(Some(req.x)); + self.device.scroll_v120[VERTICAL_SCROLL].set(Some(req.y)); Ok(()) } @@ -86,8 +86,8 @@ impl EiScrollRequestHandler for EiScroll { req: ClientScrollStop, _slf: &Rc, ) -> Result<(), Self::Error> { - self.device.scroll_stop[HORIZONTAL_SCROLL as usize].set(Some(req.x != 0)); - self.device.scroll_stop[VERTICAL_SCROLL as usize].set(Some(req.y != 0)); + self.device.scroll_stop[HORIZONTAL_SCROLL].set(Some(req.x != 0)); + self.device.scroll_stop[VERTICAL_SCROLL].set(Some(req.y != 0)); Ok(()) } } diff --git a/src/ei/ei_ifs/ei_seat.rs b/src/ei/ei_ifs/ei_seat.rs index 9fde3f2a..158248e4 100644 --- a/src/ei/ei_ifs/ei_seat.rs +++ b/src/ei/ei_ifs/ei_seat.rs @@ -166,18 +166,16 @@ impl EiSeat { } if let Some(b) = self.scroll.get() { b.send_scroll( - ps.px[HORIZONTAL_SCROLL as usize].get().unwrap_or_default(), - ps.px[VERTICAL_SCROLL as usize].get().unwrap_or_default(), + ps.px[HORIZONTAL_SCROLL].get().unwrap_or_default(), + ps.px[VERTICAL_SCROLL].get().unwrap_or_default(), ); b.send_scroll_discrete( - ps.v120[HORIZONTAL_SCROLL as usize] - .get() - .unwrap_or_default(), - ps.v120[VERTICAL_SCROLL as usize].get().unwrap_or_default(), + ps.v120[HORIZONTAL_SCROLL].get().unwrap_or_default(), + ps.v120[VERTICAL_SCROLL].get().unwrap_or_default(), ); b.send_scroll_stop( - ps.stop[HORIZONTAL_SCROLL as usize].get(), - ps.stop[VERTICAL_SCROLL as usize].get(), + ps.stop[HORIZONTAL_SCROLL].get(), + ps.stop[VERTICAL_SCROLL].get(), ); b.device.send_frame(self.client.serial(), time_usec); } diff --git a/src/ifs/jay_seat_events.rs b/src/ifs/jay_seat_events.rs index d163b87a..784b55c9 100644 --- a/src/ifs/jay_seat_events.rs +++ b/src/ifs/jay_seat_events.rs @@ -1,6 +1,6 @@ use { crate::{ - backend::{InputDeviceId, KeyState}, + backend::{InputDeviceId, KeyState, ScrollAxis}, client::Client, fixed::Fixed, ifs::wl_seat::{ @@ -15,6 +15,7 @@ use { object::{Object, Version}, wire::{JaySeatEventsId, jay_seat_events::*}, }, + linearize::LinearizeExt, std::{convert::Infallible, rc::Rc}, }; @@ -95,7 +96,8 @@ impl JaySeatEvents { source, }); } - for axis in 0..1 { + for axis in ScrollAxis::variants() { + let axis = axis as usize; if let Some(dist) = ps.v120[axis].get() { self.client.event(Axis120 { self_id: self.id, diff --git a/src/ifs/wl_seat/event_handling.rs b/src/ifs/wl_seat/event_handling.rs index ce1a9532..62428281 100644 --- a/src/ifs/wl_seat/event_handling.rs +++ b/src/ifs/wl_seat/event_handling.rs @@ -54,6 +54,7 @@ use { }, }, kbvm::{ModifierMask, state_machine::Event}, + linearize::LinearizeExt, smallvec::SmallVec, std::{cell::RefCell, collections::hash_map::Entry, mem, rc::Rc}, }; @@ -1173,7 +1174,8 @@ impl WlSeatGlobal { } let time = (event.time_usec.get() / 1000) as _; self.for_each_pointer(Version::ALL, surface.client.id, |p| { - for i in 0..1 { + for i in ScrollAxis::variants() { + let i = i as usize; let axis = i as _; if let Some(delta) = event.v120[i].get() { if p.seat.version >= AXIS_VALUE120_SINCE_VERSION { diff --git a/src/ifs/wl_seat/pointer_owner.rs b/src/ifs/wl_seat/pointer_owner.rs index 5e5c6d01..8d520a01 100644 --- a/src/ifs/wl_seat/pointer_owner.rs +++ b/src/ifs/wl_seat/pointer_owner.rs @@ -21,6 +21,7 @@ use { }, utils::{clonecell::CloneCell, smallmap::SmallMap}, }, + linearize::LinearizeExt, std::{ cell::Cell, rc::{Rc, Weak}, @@ -80,7 +81,8 @@ impl PointerOwnerHolder { pub fn frame(&self, px_per_scroll_wheel: f64, seat: &Rc, time_usec: u64) { self.pending_scroll.time_usec.set(time_usec); let pending = self.pending_scroll.take(); - for axis in 0..2 { + for axis in ScrollAxis::variants() { + let axis = axis as usize; if let Some(dist) = pending.v120[axis].get() { let px = (dist as f64 / AXIS_120 as f64) * px_per_scroll_wheel; pending.px[axis].set(Some(Fixed::from_f64(px))); diff --git a/src/ifs/wl_seat/wl_pointer.rs b/src/ifs/wl_seat/wl_pointer.rs index a3fbfe6d..bb6a3eb6 100644 --- a/src/ifs/wl_seat/wl_pointer.rs +++ b/src/ifs/wl_seat/wl_pointer.rs @@ -18,8 +18,8 @@ const ROLE: u32 = 0; pub(super) const RELEASED: u32 = 0; pub const PRESSED: u32 = 1; -pub const VERTICAL_SCROLL: u32 = 0; -pub const HORIZONTAL_SCROLL: u32 = 1; +pub const VERTICAL_SCROLL: usize = 0; +pub const HORIZONTAL_SCROLL: usize = 1; pub const WHEEL: u32 = 0; pub const FINGER: u32 = 1; diff --git a/src/utils/scroller.rs b/src/utils/scroller.rs index 0fd6d2b6..353e672c 100644 --- a/src/utils/scroller.rs +++ b/src/utils/scroller.rs @@ -17,14 +17,14 @@ pub struct Scroller { impl Scroller { pub fn handle(&self, scroll: &PendingScroll) -> Option { - let n = if let Some(d) = scroll.v120[VERTICAL_SCROLL as usize].get() { + let n = if let Some(d) = scroll.v120[VERTICAL_SCROLL].get() { self.px.set(0.0); let mut v120 = self.v120.get() + d; let discrete = v120 / AXIS_120; v120 -= discrete * AXIS_120; self.v120.set(v120); discrete - } else if let Some(px) = scroll.px[VERTICAL_SCROLL as usize].get() { + } else if let Some(px) = scroll.px[VERTICAL_SCROLL].get() { self.v120.set(0); let mut px = self.px.get() + px.to_f64(); let discrete = (px / PX_PER_SCROLL).trunc(); @@ -34,7 +34,7 @@ impl Scroller { } else { 0 }; - if scroll.stop[VERTICAL_SCROLL as usize].get() { + if scroll.stop[VERTICAL_SCROLL].get() { self.v120.set(0); self.px.set(0.0); }