diff --git a/inputremapper/injection/macros/macro.py b/inputremapper/injection/macros/macro.py index 337cbfe8b..48d049e3d 100644 --- a/inputremapper/injection/macros/macro.py +++ b/inputremapper/injection/macros/macro.py @@ -469,11 +469,11 @@ def add_event(self, type_: Union[str, int], code: Union[str, int], value: int): self.tasks.append(lambda handler: handler(type_, code, value)) self.tasks.append(self._keycode_pause) - def add_mouse(self, direction: str, speed: int, accel: Optional[float] = None): + def add_mouse(self, direction: str, speed: int, acceleration: Optional[float] = None): """Move the mouse cursor.""" _type_check(direction, [str], "mouse", 1) speed = _type_check(speed, [int], "mouse", 2) - accel = _type_check(accel, [float, None], "mouse", 3) + acceleration = _type_check(acceleration, [float, None], "mouse", 3) code, value = { "up": (REL_Y, -1), @@ -484,18 +484,24 @@ def add_mouse(self, direction: str, speed: int, accel: Optional[float] = None): async def task(handler: Callable): resolved_speed = _resolve(speed, [int]) - resolved_accel = _resolve(accel, [float, None]) + resolved_accel = _resolve(acceleration, [float, None]) if resolved_accel: current_speed = 0.0 + displacement_accumulator = 0.0 + displacement = 0 else: - current_speed = resolved_speed + displacement = resolved_speed while self.is_holding(): if resolved_accel and current_speed < resolved_speed: current_speed += resolved_accel + current_speed = min(current_speed, resolved_speed) + displacement_accumulator += current_speed + displacement = int(displacement_accumulator) + displacement_accumulator -= displacement - handler(EV_REL, code, value * int(current_speed)) + handler(EV_REL, code, value * displacement) await asyncio.sleep(1 / self.mapping.rel_rate) self.tasks.append(task) diff --git a/readme/macros.md b/readme/macros.md index 31fef0d31..949549ac9 100644 --- a/readme/macros.md +++ b/readme/macros.md @@ -125,10 +125,10 @@ Bear in mind that anti-cheat software might detect macros in games. > Moves the mouse cursor > -> If `accel` is provided then the cursor will accelerate from zero to a maximum speed of `speed`. +> If `acceleration` is provided then the cursor will accelerate from zero to a maximum speed of `speed`. > > ```c# -> mouse(direction: str, speed: int, accel: float | None) +> mouse(direction: str, speed: int, acceleration: float | None) > ``` > > Examples: diff --git a/tests/unit/test_macros.py b/tests/unit/test_macros.py index cf5c2d44e..7994b4083 100644 --- a/tests/unit/test_macros.py +++ b/tests/unit/test_macros.py @@ -1021,8 +1021,7 @@ async def test_mouse_accel(self): await asyncio.sleep(sleep) self.assertTrue(macro_1.is_holding()) macro_1.release_trigger() - - self.assertIn((EV_REL, REL_Y, -5), self.result) + self.assertEqual([(2, 1, 0), (2, 1, -2), (2, 1, -3), (2, 1, -4), (2, 1, -4), (2, 1, -5)], self.result) async def test_event_1(self): macro = parse("e(EV_KEY, KEY_A, 1)", self.context, DummyMapping)