Skip to content

Commit 8e44c85

Browse files
Merge pull request #260 from askui/fix/SOLENG-332-scroll-scaling
fix: remove incorrect coordinate scaling from mouse scroll deltas (SO…
2 parents 0bef7a1 + 7779be2 commit 8e44c85

6 files changed

Lines changed: 41 additions & 29 deletions

File tree

src/askui/computer_agent.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,15 +231,15 @@ def mouse_move(
231231
@validate_call
232232
def mouse_scroll(
233233
self,
234-
x: int,
235-
y: int,
234+
dx: int,
235+
dy: int,
236236
) -> None:
237237
"""
238238
Simulates scrolling the mouse wheel by the specified horizontal and vertical amounts.
239239
240240
Args:
241-
x (int): The horizontal scroll amount. Positive values typically scroll right, negative values scroll left.
242-
y (int): The vertical scroll amount. Positive values typically scroll down, negative values scroll up.
241+
dx (int): The horizontal scroll amount. Positive values typically scroll right, negative values scroll left.
242+
dy (int): The vertical scroll amount. Positive values typically scroll down, negative values scroll up.
243243
244244
Note:
245245
The actual scroll direction depends on the operating system's configuration.
@@ -258,8 +258,8 @@ def mouse_scroll(
258258
agent.mouse_scroll(3, 0) # Usually scrolls right 3 units
259259
```
260260
"""
261-
self._reporter.add_message("User", f'mouse_scroll: "{x}", "{y}"')
262-
self.tools.os.mouse_scroll(x, y)
261+
self._reporter.add_message("User", f'mouse_scroll: "{dx}", "{dy}"')
262+
self.tools.os.mouse_scroll(dx, dy)
263263

264264
@telemetry.record_call(exclude={"text", "locator"})
265265
@validate_call(config=ConfigDict(arbitrary_types_allowed=True))

src/askui/tools/agent_os.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -319,14 +319,14 @@ def mouse_up(self, button: MouseButton = "left") -> None:
319319
raise NotImplementedError
320320

321321
@abstractmethod
322-
def mouse_scroll(self, x: int, y: int) -> None:
322+
def mouse_scroll(self, dx: int, dy: int) -> None:
323323
"""
324324
Simulates scrolling the mouse wheel.
325325
326326
Args:
327-
x (int): The horizontal scroll amount. Positive values scroll right,
327+
dx (int): The horizontal scroll amount. Positive values scroll right,
328328
negative values scroll left.
329-
y (int): The vertical scroll amount. Positive values scroll down,
329+
dy (int): The vertical scroll amount. Positive values scroll down,
330330
negative values scroll up.
331331
"""
332332
raise NotImplementedError

src/askui/tools/askui/askui_controller.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -503,37 +503,37 @@ def mouse_up(self, button: Literal["left", "middle", "right"] = "left") -> None:
503503

504504
@telemetry.record_call()
505505
@override
506-
def mouse_scroll(self, x: int, y: int) -> None:
506+
def mouse_scroll(self, dx: int, dy: int) -> None:
507507
"""
508508
Scroll the mouse wheel.
509509
510510
Args:
511-
x (int): The horizontal scroll amount. Positive values scroll right,
511+
dx (int): The horizontal scroll amount. Positive values scroll right,
512512
negative values scroll left.
513-
y (int): The vertical scroll amount. Positive values scroll down,
513+
dy (int): The vertical scroll amount. Positive values scroll down,
514514
negative values scroll up.
515515
"""
516-
self._reporter.add_message("AgentOS", f"mouse_scroll({x}, {y})")
517-
if x != 0:
516+
self._reporter.add_message("AgentOS", f"mouse_scroll({dx}, {dy})")
517+
if dx != 0:
518518
self._run_recorder_action(
519519
acion_class_id=controller_v1_pbs.ActionClassID_MouseWheelScroll,
520520
action_parameters=controller_v1_pbs.ActionParameters(
521521
mouseWheelScroll=controller_v1_pbs.ActionParameters_MouseWheelScroll(
522522
direction=controller_v1_pbs.MouseWheelScrollDirection.MouseWheelScrollDirection_Horizontal,
523523
deltaType=controller_v1_pbs.MouseWheelDeltaType.MouseWheelDelta_Raw,
524-
delta=x,
524+
delta=dx,
525525
milliseconds=50,
526526
)
527527
),
528528
)
529-
if y != 0:
529+
if dy != 0:
530530
self._run_recorder_action(
531531
acion_class_id=controller_v1_pbs.ActionClassID_MouseWheelScroll,
532532
action_parameters=controller_v1_pbs.ActionParameters(
533533
mouseWheelScroll=controller_v1_pbs.ActionParameters_MouseWheelScroll(
534534
direction=controller_v1_pbs.MouseWheelScrollDirection.MouseWheelScrollDirection_Vertical,
535535
deltaType=controller_v1_pbs.MouseWheelDeltaType.MouseWheelDelta_Raw,
536-
delta=y,
536+
delta=dy,
537537
milliseconds=50,
538538
)
539539
),

src/askui/tools/computer/mouse_scroll_tool.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,37 @@ class ComputerMouseScrollTool(ComputerBaseTool):
88
def __init__(self, agent_os: ComputerAgentOsFacade | None = None) -> None:
99
super().__init__(
1010
name="mouse_scroll",
11-
description="Scroll the mouse wheel at the current position.",
11+
description=(
12+
"Scroll the mouse wheel at the current "
13+
"position. The scroll amount depends on "
14+
"the operating system. Start with "
15+
"dy=150 or dy=-150 for a normal scroll "
16+
"and adjust based on the result. "
17+
"On Windows, positive dy scrolls down. "
18+
"On macOS (default settings), negative "
19+
"dy scrolls down. If scrolling moves in "
20+
"the opposite direction than expected, "
21+
"invert the values."
22+
),
1223
input_schema={
1324
"type": "object",
1425
"properties": {
1526
"dx": {
1627
"type": "integer",
1728
"description": (
1829
"The horizontal scroll amount. "
19-
"Positive values scroll right, negative values scroll left."
30+
"Positive values scroll right, "
31+
"negative values scroll left. "
32+
"Use 0 if no horizontal "
33+
"scrolling is needed."
2034
),
2135
},
2236
"dy": {
2337
"type": "integer",
2438
"description": (
2539
"The vertical scroll amount. "
26-
"Positive values scroll down, negative values scroll up."
40+
"Positive values scroll down, negative values scroll up. "
41+
"Use 0 if no vertical scrolling is needed."
2742
),
2843
},
2944
},

src/askui/tools/computer_agent_os_facade.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,8 @@ def mouse_down(self, button: MouseButton = "left") -> None:
8484
def mouse_up(self, button: MouseButton = "left") -> None:
8585
self._agent_os.mouse_up(button)
8686

87-
def mouse_scroll(self, x: int, y: int) -> None:
88-
scaled_x, scaled_y = self._scale_coordinates_back(
89-
x, y, check_coordinates_in_bounds=False
90-
)
91-
self._agent_os.mouse_scroll(scaled_x, scaled_y)
87+
def mouse_scroll(self, dx: int, dy: int) -> None:
88+
self._agent_os.mouse_scroll(dx, dy)
9289

9390
def keyboard_pressed(
9491
self, key: PcKey | ModifierKey, modifier_keys: list[ModifierKey] | None = None

src/askui/tools/playwright/agent_os.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,21 +259,21 @@ def mouse_up(self, button: Literal["left", "middle", "right"] = "left") -> None:
259259
self._page.mouse.up(button=button)
260260

261261
@override
262-
def mouse_scroll(self, x: int, y: int) -> None:
262+
def mouse_scroll(self, dx: int, dy: int) -> None:
263263
"""
264264
Simulates scrolling the mouse wheel.
265265
266266
Args:
267-
x (int): The horizontal scroll amount. Positive values scroll right,
267+
dx (int): The horizontal scroll amount. Positive values scroll right,
268268
negative values scroll left.
269-
y (int): The vertical scroll amount. Positive values scroll down,
269+
dy (int): The vertical scroll amount. Positive values scroll down,
270270
negative values scroll up.
271271
"""
272272
if not self._page:
273273
error_msg = "No active page. Call connect() first."
274274
raise RuntimeError(error_msg)
275275

276-
self._page.mouse.wheel(delta_x=x, delta_y=y)
276+
self._page.mouse.wheel(delta_x=dx, delta_y=dy)
277277

278278
@override
279279
def keyboard_pressed(

0 commit comments

Comments
 (0)