diff --git a/src/ifs/wl_seat/event_handling.rs b/src/ifs/wl_seat/event_handling.rs index 6eda45e5..8b46b083 100644 --- a/src/ifs/wl_seat/event_handling.rs +++ b/src/ifs/wl_seat/event_handling.rs @@ -1459,7 +1459,11 @@ impl WlSeatGlobal { if p.seat.version >= AXIS_VALUE120_SINCE_VERSION { p.send_axis_value120(axis, delta); } else if p.seat.version >= AXIS_DISCRETE_SINCE_VERSION { - p.send_axis_discrete(axis, delta / AXIS_120); + let mut accumulator = p.v120_accumulator[i].get(); + accumulator += delta; + p.send_axis_discrete(axis, accumulator / AXIS_120); + accumulator %= AXIS_120; + p.v120_accumulator[i].set(accumulator); } } if let Some(delta) = event.px[i].get() { diff --git a/src/ifs/wl_seat/wl_pointer.rs b/src/ifs/wl_seat/wl_pointer.rs index bb6a3eb6..affb2ac0 100644 --- a/src/ifs/wl_seat/wl_pointer.rs +++ b/src/ifs/wl_seat/wl_pointer.rs @@ -74,6 +74,7 @@ pub struct WlPointer { pub seat: Rc, pub tracker: Tracker, last_motion: Cell<(Fixed, Fixed)>, + pub v120_accumulator: [Cell; 2], } impl WlPointer { @@ -83,6 +84,7 @@ impl WlPointer { seat: seat.clone(), tracker: Default::default(), last_motion: Default::default(), + v120_accumulator: Default::default(), } }