diff --git a/ahk/_async/engine.py b/ahk/_async/engine.py index 4634d6e..33e664f 100644 --- a/ahk/_async/engine.py +++ b/ahk/_async/engine.py @@ -109,6 +109,8 @@ ], ] +SendMode: TypeAlias = Literal['Event', 'Input', 'InputThenPlay', 'Play', ''] + AsyncPropertyReturnTupleIntInt: TypeAlias = Coroutine[None, None, Tuple[int, int]] # unasync: remove SyncPropertyReturnTupleIntInt: TypeAlias = Tuple[int, int] @@ -372,6 +374,15 @@ async def get_coord_mode(self, target: CoordModeTargets) -> str: resp = await self._transport.function_call('AHKGetCoordMode', args) return resp + async def set_send_mode(self, mode: SendMode) -> None: + args = [str(mode)] + await self._transport.function_call('AHKSetSendMode', args) + return None + + async def get_send_mode(self) -> str: + resp = await self._transport.function_call('AHKGetSendMode') + return resp + # fmt: off @overload async def control_click(self, button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L', click_count: int = 1, options: str = '', control: str = '', title: str = '', text: str = '', exclude_title: str = '', exclude_text: str = '', *, title_match_mode: Optional[TitleMatchMode] = None, detect_hidden_windows: Optional[bool] = None) -> None: ... @@ -769,13 +780,13 @@ def mouse_position(self, new_position: Tuple[int, int]) -> None: # fmt: off @overload - async def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, speed: Optional[int] = None, relative: bool = False) -> None: ... + async def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, speed: Optional[int] = None, relative: bool = False, send_mode: Optional[SendMode] = None) -> None: ... @overload - async def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, blocking: Literal[True], speed: Optional[int] = None, relative: bool = False) -> None: ... + async def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, blocking: Literal[True], speed: Optional[int] = None, relative: bool = False, send_mode: Optional[SendMode] = None) -> None: ... @overload - async def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, blocking: Literal[False], speed: Optional[int] = None, relative: bool = False, ) -> AsyncFutureResult[None]: ... + async def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, blocking: Literal[False], speed: Optional[int] = None, relative: bool = False, send_mode: Optional[SendMode] = None) -> AsyncFutureResult[None]: ... @overload - async def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, speed: Optional[int] = None, relative: bool = False, blocking: bool = True) -> Union[None, AsyncFutureResult[None]]: ... + async def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, speed: Optional[int] = None, relative: bool = False, blocking: bool = True, send_mode: Optional[SendMode] = None) -> Union[None, AsyncFutureResult[None]]: ... # fmt: on async def mouse_move( self, @@ -784,6 +795,7 @@ async def mouse_move( *, speed: Optional[int] = None, relative: bool = False, + send_mode: Optional[SendMode] = None, blocking: bool = True, ) -> Union[None, AsyncFutureResult[None]]: """ @@ -804,6 +816,11 @@ async def mouse_move( args.append('R') else: args.append('') + if send_mode: + args.append(send_mode) + else: + args.append('') + resp = await self._transport.function_call('AHKMouseMove', args, blocking=blocking) return resp @@ -1173,13 +1190,13 @@ async def get_send_level(self) -> int: # fmt: off @overload - async def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None) -> None: ... + async def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, send_mode: Optional[SendMode] = None) -> None: ... @overload - async def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, blocking: Literal[True]) -> None: ... + async def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, send_mode: Optional[SendMode] = None, blocking: Literal[True]) -> None: ... @overload - async def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, blocking: Literal[False]) -> AsyncFutureResult[None]: ... + async def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, send_mode: Optional[SendMode] = None, blocking: Literal[False]) -> AsyncFutureResult[None]: ... @overload - async def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, blocking: bool = True) -> Union[None, AsyncFutureResult[None]]: ... + async def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, send_mode: Optional[SendMode] = None, blocking: bool = True) -> Union[None, AsyncFutureResult[None]]: ... # fmt: on async def send( self, @@ -1188,6 +1205,7 @@ async def send( raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, + send_mode: Optional[SendMode] = None, blocking: bool = True, ) -> Union[None, AsyncFutureResult[None]]: """ @@ -1202,6 +1220,10 @@ async def send( args.append(str(key_press_duration)) else: args.append('') + if send_mode: + args.append(send_mode) + else: + args.append('') if raw: raw_resp = await self._transport.function_call('AHKSendRaw', args=args, blocking=blocking) @@ -2754,13 +2776,13 @@ async def win_set_trans_color( # fmt: off @overload - async def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, coord_mode: Optional[CoordModeRelativeTo] = None) -> None: ... + async def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> None: ... @overload - async def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[True], coord_mode: Optional[CoordModeRelativeTo] = None) -> None: ... + async def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[True], coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> None: ... @overload - async def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[False], coord_mode: Optional[CoordModeRelativeTo] = None) -> AsyncFutureResult[None]: ... + async def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[False], coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> AsyncFutureResult[None]: ... @overload - async def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None) -> Union[None, AsyncFutureResult[None]]: ... + async def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> Union[None, AsyncFutureResult[None]]: ... # fmt: on async def right_click( self, @@ -2772,6 +2794,7 @@ async def right_click( relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, ) -> Union[None, AsyncFutureResult[None]]: button = 'R' return await self.click( @@ -2783,17 +2806,18 @@ async def right_click( relative=relative, blocking=blocking, coord_mode=coord_mode, + send_mode=send_mode, ) # fmt: off @overload - async def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, coord_mode: Optional[CoordModeRelativeTo] = None) -> None: ... + async def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> None: ... @overload - async def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[True], coord_mode: Optional[CoordModeRelativeTo] = None) -> None: ... + async def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[True], coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> None: ... @overload - async def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[False], coord_mode: Optional[CoordModeRelativeTo] = None) -> AsyncFutureResult[None]: ... + async def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[False], coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> AsyncFutureResult[None]: ... @overload - async def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None) -> Union[None, AsyncFutureResult[None]]: ... + async def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> Union[None, AsyncFutureResult[None]]: ... # fmt: on async def click( self, @@ -2806,6 +2830,7 @@ async def click( relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, ) -> Union[None, AsyncFutureResult[None]]: """ Analog for `Click `_ @@ -2825,7 +2850,9 @@ async def click( r = '' if coord_mode is None: coord_mode = '' - args = [str(x), str(y), button, str(click_count), direction or '', r, coord_mode] + if send_mode is None: + send_mode = '' + args = [str(x), str(y), button, str(click_count), direction or '', r, coord_mode, str(send_mode)] resp = await self._transport.function_call('AHKClick', args, blocking=blocking) return resp @@ -2894,6 +2921,48 @@ async def image_search( resp = await self._transport.function_call('AHKImageSearch', args, blocking=blocking) return resp + @overload + async def mouse_drag( + self, + x: int, + y: int, + *, + from_position: Optional[Tuple[int, int]] = None, + speed: Optional[int] = None, + button: Optional[Union[MouseButton, str]] = None, + relative: Optional[bool] = None, + coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, + ) -> None: ... + @overload + async def mouse_drag( + self, + x: int, + y: int, + *, + from_position: Optional[Tuple[int, int]] = None, + speed: Optional[int] = None, + button: Optional[Union[MouseButton, str]] = None, + relative: Optional[bool] = None, + coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, + blocking: Literal[False], + ) -> AsyncFutureResult[None]: ... + @overload + async def mouse_drag( + self, + x: int, + y: int, + *, + from_position: Optional[Tuple[int, int]] = None, + speed: Optional[int] = None, + button: Optional[Union[MouseButton, str]] = None, + relative: Optional[bool] = None, + coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, + blocking: Literal[True], + ) -> None: ... + @overload async def mouse_drag( self, x: int, @@ -2905,7 +2974,21 @@ async def mouse_drag( relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None, - ) -> None: + send_mode: Optional[SendMode] = None, + ) -> Union[None, AsyncFutureResult[None]]: ... + async def mouse_drag( + self, + x: int, + y: int, + *, + from_position: Optional[Tuple[int, int]] = None, + speed: Optional[int] = None, + button: Optional[Union[MouseButton, str]] = None, + relative: Optional[bool] = None, + blocking: bool = True, + coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, + ) -> Union[None, AsyncFutureResult[None]]: """ Analog for `MouseClickDrag `_ """ @@ -2934,7 +3017,13 @@ async def mouse_drag( else: args.append('') - await self._transport.function_call('AHKMouseClickDrag', args, blocking=blocking) + if send_mode: + args.append(send_mode) + else: + args.append('') + + resp = await self._transport.function_call('AHKMouseClickDrag', args, blocking=blocking) + return resp # fmt: off @overload diff --git a/ahk/_async/transport.py b/ahk/_async/transport.py index 1501b4c..4e36750 100644 --- a/ahk/_async/transport.py +++ b/ahk/_async/transport.py @@ -95,6 +95,7 @@ def result(self, timeout: Optional[float] = None) -> T_SyncFuture: 'AHKGetClipboardAll', 'AHKGetCoordMode', 'AHKGetSendLevel', + 'AHKGetSendMode', 'AHKGetTitleMatchMode', 'AHKGetTitleMatchSpeed', 'AHKGetVolume', @@ -125,6 +126,7 @@ def result(self, timeout: Optional[float] = None) -> T_SyncFuture: 'AHKSetCoordMode', 'AHKSetDetectHiddenWindows', 'AHKSetSendLevel', + 'AHKSetSendMode', 'AHKSetTitleMatchMode', 'AHKSetVolume', 'AHKShowToolTip', @@ -540,6 +542,10 @@ async def function_call(self, function_name: Literal['AHKSetCoordMode'], args: L @overload async def function_call(self, function_name: Literal['AHKGetSendLevel']) -> int: ... @overload + async def function_call(self, function_name: Literal['AHKSetSendMode'], args: List[str]) -> None: ... + @overload + async def function_call(self, function_name: Literal['AHKGetSendMode']) -> str: ... + @overload async def function_call(self, function_name: Literal['AHKSetSendLevel'], args: List[str]) -> None: ... @overload async def function_call(self, function_name: Literal['AHKWinWait'], args: Optional[List[str]] = None, *, blocking: bool = True, engine: Optional[AsyncAHK[Any]] = None) -> Union[AsyncWindow, AsyncFutureResult[AsyncWindow]]: ... diff --git a/ahk/_constants.py b/ahk/_constants.py index 4158936..e7ca2c9 100644 --- a/ahk/_constants.py +++ b/ahk/_constants.py @@ -1728,14 +1728,25 @@ direction := args[5] r := args[6] relative_to := args[7] + send_mode := args[8] current_coord_rel := Format("{}", A_CoordModeMouse) + current_send_mode := Format("{}", A_SendMode) + + if (send_mode != "") { + SendMode, %send_mode% + } if (relative_to != "") { CoordMode, Mouse, %relative_to% } + Click, %x%, %y%, %button%, %direction%, %r% + if (send_mode != "") { + SendMode, %current_send_mode% + } + if (relative_to != "") { CoordMode, Mouse, %current_coord_rel% } @@ -1779,6 +1790,18 @@ {% endblock AHKSetCoordMode %} } +AHKGetSendMode(args*) { + return FormatResponse("ahk.message.StringResponseMessage", A_SendMode) +} + + +AHKSetSendMode(args*) { + mode := args[1] + SendMode, %mode% + return FormatNoValueResponse() +} + + AHKMouseClickDrag(args*) { {% block AHKMouseClickDrag %} button := args[1] @@ -1789,6 +1812,11 @@ speed := args[6] relative := args[7] relative_to := args[8] + send_mode := args[8] + current_send_mode := Format("{}", A_SendMode) + if (send_mode != "") { + SendMode, %send_mode% + } current_coord_rel := Format("{}", A_CoordModeMouse) @@ -1802,6 +1830,10 @@ CoordMode, Mouse, %current_coord_rel% } + if (send_mode != "") { + SendMode, %current_send_mode% + } + return FormatNoValueResponse() {% endblock AHKMouseClickDrag %} @@ -1880,18 +1912,29 @@ str := args[1] key_delay := args[2] key_press_duration := args[3] + send_mode := args[4] current_delay := Format("{}", A_KeyDelay) current_key_duration := Format("{}", A_KeyDuration) + current_send_mode := Format("{}", A_SendMode) if (key_delay != "" or key_press_duration != "") { SetKeyDelay, %key_delay%, %key_press_duration% } + if (send_mode != "") { + SendMode, %send_mode% + } + Send,% str if (key_delay != "" or key_press_duration != "") { SetKeyDelay, %current_delay%, %current_key_duration% } + + if (send_mode != "") { + SendMode, %current_send_mode% + } + return FormatNoValueResponse() {% endblock AHKSend %} } @@ -1901,18 +1944,30 @@ str := args[1] key_delay := args[2] key_press_duration := args[3] + send_mode := args[4] current_delay := Format("{}", A_KeyDelay) current_key_duration := Format("{}", A_KeyDuration) + current_send_mode := Format("{}", A_SendMode) + if (key_delay != "" or key_press_duration != "") { SetKeyDelay, %key_delay%, %key_press_duration% } + if (send_mode != "") { + SendMode, %send_mode% + } + SendRaw,% str if (key_delay != "" or key_press_duration != "") { SetKeyDelay, %current_delay%, %current_key_duration% } + + if (send_mode != "") { + SendMode, %current_send_mode% + } + return FormatNoValueResponse() {% endblock AHKSendRaw %} } @@ -4728,11 +4783,23 @@ y := args[2] speed := args[3] relative := args[4] + send_mode := args[5] + current_send_mode := Format("{}", A_SendMode) + + if (send_mode != "") { + SendMode send_mode + } + if (relative != "") { - MouseMove(x, y, speed, "R") + MouseMove(x, y, speed, "R") } else { - MouseMove(x, y, speed) + MouseMove(x, y, speed) } + + if (send_mode != "") { + SendMode current_send_mode + } + resp := FormatNoValueResponse() return resp {% endblock AHKMouseMove %} @@ -4747,7 +4814,13 @@ direction := args[5] r := args[6] relative_to := args[7] + send_mode := args[8] current_coord_rel := Format("{}", A_CoordModeMouse) + current_send_mode := Format("{}", A_SendMode) + + if (send_mode != "") { + SendMode send_mode + } if (relative_to != "") { CoordMode("Mouse", relative_to) @@ -4759,6 +4832,9 @@ CoordMode("Mouse", current_coord_rel) } + if (send_mode != "") { + SendMode current_send_mode + } return FormatNoValueResponse() {% endblock AHKClick %} @@ -4798,6 +4874,19 @@ {% endblock AHKSetCoordMode %} } + +AHKGetSendMode(args*) { + return FormatResponse("ahk.message.StringResponseMessage", A_SendMode) +} + + +AHKSetSendMode(args*) { + mode := args[1] + SendMode mode + return FormatNoValueResponse() +} + + AHKMouseClickDrag(args*) { {% block AHKMouseClickDrag %} button := args[1] @@ -4808,8 +4897,13 @@ speed := args[6] relative := args[7] relative_to := args[8] - + send_mode := args[9] current_coord_rel := Format("{}", A_CoordModeMouse) + current_send_mode := Format("{}", A_SendMode) + + if (send_mode != "") { + SendMode send_mode + } if (relative_to != "") { CoordMode("Mouse", relative_to) @@ -4831,6 +4925,10 @@ CoordMode("Mouse", current_coord_rel) } + if (send_mode != "") { + SendMode current_send_mode + } + return FormatNoValueResponse() {% endblock AHKMouseClickDrag %} @@ -4904,8 +5002,14 @@ str := args[1] key_delay := args[2] key_press_duration := args[3] + send_mode := args[4] current_delay := Format("{}", A_KeyDelay) current_key_duration := Format("{}", A_KeyDuration) + current_send_mode := Format("{}", A_SendMode) + + if (send_mode != "") { + SendMode send_mode + } if (key_delay != "" or key_press_duration != "") { SetKeyDelay(key_delay, key_press_duration) @@ -4914,6 +5018,10 @@ Send(str) + if (send_mode != "") { + SendMode current_send_mode + } + if (key_delay != "" or key_press_duration != "") { SetKeyDelay(current_delay, current_key_duration) } diff --git a/ahk/_sync/engine.py b/ahk/_sync/engine.py index dd8da8b..926c830 100644 --- a/ahk/_sync/engine.py +++ b/ahk/_sync/engine.py @@ -107,6 +107,8 @@ ], ] +SendMode: TypeAlias = Literal['Event', 'Input', 'InputThenPlay', 'Play', ''] + SyncPropertyReturnTupleIntInt: TypeAlias = Tuple[int, int] SyncPropertyReturnOptionalAsyncWindow: TypeAlias = Optional[Window] @@ -367,6 +369,15 @@ def get_coord_mode(self, target: CoordModeTargets) -> str: resp = self._transport.function_call('AHKGetCoordMode', args) return resp + def set_send_mode(self, mode: SendMode) -> None: + args = [str(mode)] + self._transport.function_call('AHKSetSendMode', args) + return None + + def get_send_mode(self) -> str: + resp = self._transport.function_call('AHKGetSendMode') + return resp + # fmt: off @overload def control_click(self, button: Literal['L', 'R', 'M', 'LEFT', 'RIGHT', 'MIDDLE'] = 'L', click_count: int = 1, options: str = '', control: str = '', title: str = '', text: str = '', exclude_title: str = '', exclude_text: str = '', *, title_match_mode: Optional[TitleMatchMode] = None, detect_hidden_windows: Optional[bool] = None) -> None: ... @@ -760,13 +771,13 @@ def mouse_position(self, new_position: Tuple[int, int]) -> None: # fmt: off @overload - def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, speed: Optional[int] = None, relative: bool = False) -> None: ... + def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, speed: Optional[int] = None, relative: bool = False, send_mode: Optional[SendMode] = None) -> None: ... @overload - def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, blocking: Literal[True], speed: Optional[int] = None, relative: bool = False) -> None: ... + def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, blocking: Literal[True], speed: Optional[int] = None, relative: bool = False, send_mode: Optional[SendMode] = None) -> None: ... @overload - def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, blocking: Literal[False], speed: Optional[int] = None, relative: bool = False, ) -> FutureResult[None]: ... + def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, blocking: Literal[False], speed: Optional[int] = None, relative: bool = False, send_mode: Optional[SendMode] = None) -> FutureResult[None]: ... @overload - def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, speed: Optional[int] = None, relative: bool = False, blocking: bool = True) -> Union[None, FutureResult[None]]: ... + def mouse_move(self, x: Optional[Union[str, int]] = None, y: Optional[Union[str, int]] = None, *, speed: Optional[int] = None, relative: bool = False, blocking: bool = True, send_mode: Optional[SendMode] = None) -> Union[None, FutureResult[None]]: ... # fmt: on def mouse_move( self, @@ -775,6 +786,7 @@ def mouse_move( *, speed: Optional[int] = None, relative: bool = False, + send_mode: Optional[SendMode] = None, blocking: bool = True, ) -> Union[None, FutureResult[None]]: """ @@ -795,6 +807,11 @@ def mouse_move( args.append('R') else: args.append('') + if send_mode: + args.append(send_mode) + else: + args.append('') + resp = self._transport.function_call('AHKMouseMove', args, blocking=blocking) return resp @@ -1161,13 +1178,13 @@ def get_send_level(self) -> int: # fmt: off @overload - def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None) -> None: ... + def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, send_mode: Optional[SendMode] = None) -> None: ... @overload - def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, blocking: Literal[True]) -> None: ... + def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, send_mode: Optional[SendMode] = None, blocking: Literal[True]) -> None: ... @overload - def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, blocking: Literal[False]) -> FutureResult[None]: ... + def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, send_mode: Optional[SendMode] = None, blocking: Literal[False]) -> FutureResult[None]: ... @overload - def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, blocking: bool = True) -> Union[None, FutureResult[None]]: ... + def send(self, s: str, *, raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, send_mode: Optional[SendMode] = None, blocking: bool = True) -> Union[None, FutureResult[None]]: ... # fmt: on def send( self, @@ -1176,6 +1193,7 @@ def send( raw: bool = False, key_delay: Optional[int] = None, key_press_duration: Optional[int] = None, + send_mode: Optional[SendMode] = None, blocking: bool = True, ) -> Union[None, FutureResult[None]]: """ @@ -1190,6 +1208,10 @@ def send( args.append(str(key_press_duration)) else: args.append('') + if send_mode: + args.append(send_mode) + else: + args.append('') if raw: raw_resp = self._transport.function_call('AHKSendRaw', args=args, blocking=blocking) @@ -2742,13 +2764,13 @@ def win_set_trans_color( # fmt: off @overload - def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, coord_mode: Optional[CoordModeRelativeTo] = None) -> None: ... + def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> None: ... @overload - def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[True], coord_mode: Optional[CoordModeRelativeTo] = None) -> None: ... + def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[True], coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> None: ... @overload - def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[False], coord_mode: Optional[CoordModeRelativeTo] = None) -> FutureResult[None]: ... + def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[False], coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> FutureResult[None]: ... @overload - def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None) -> Union[None, FutureResult[None]]: ... + def right_click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> Union[None, FutureResult[None]]: ... # fmt: on def right_click( self, @@ -2760,6 +2782,7 @@ def right_click( relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, ) -> Union[None, FutureResult[None]]: button = 'R' return self.click( @@ -2771,17 +2794,18 @@ def right_click( relative=relative, blocking=blocking, coord_mode=coord_mode, + send_mode=send_mode, ) # fmt: off @overload - def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, coord_mode: Optional[CoordModeRelativeTo] = None) -> None: ... + def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> None: ... @overload - def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[True], coord_mode: Optional[CoordModeRelativeTo] = None) -> None: ... + def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[True], coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> None: ... @overload - def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[False], coord_mode: Optional[CoordModeRelativeTo] = None) -> FutureResult[None]: ... + def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: Literal[False], coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> FutureResult[None]: ... @overload - def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None) -> Union[None, FutureResult[None]]: ... + def click(self, x: Optional[Union[int, Tuple[int, int]]] = None, y: Optional[int] = None, button: Optional[Union[MouseButton, str]] = None, click_count: Optional[int] = None, direction: Optional[Literal['U', 'D', 'Up', 'Down']] = None, *, relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None, send_mode: Optional[SendMode] = None) -> Union[None, FutureResult[None]]: ... # fmt: on def click( self, @@ -2794,6 +2818,7 @@ def click( relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, ) -> Union[None, FutureResult[None]]: """ Analog for `Click `_ @@ -2813,7 +2838,9 @@ def click( r = '' if coord_mode is None: coord_mode = '' - args = [str(x), str(y), button, str(click_count), direction or '', r, coord_mode] + if send_mode is None: + send_mode = '' + args = [str(x), str(y), button, str(click_count), direction or '', r, coord_mode, str(send_mode)] resp = self._transport.function_call('AHKClick', args, blocking=blocking) return resp @@ -2882,6 +2909,48 @@ def image_search( resp = self._transport.function_call('AHKImageSearch', args, blocking=blocking) return resp + @overload + def mouse_drag( + self, + x: int, + y: int, + *, + from_position: Optional[Tuple[int, int]] = None, + speed: Optional[int] = None, + button: Optional[Union[MouseButton, str]] = None, + relative: Optional[bool] = None, + coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, + ) -> None: ... + @overload + def mouse_drag( + self, + x: int, + y: int, + *, + from_position: Optional[Tuple[int, int]] = None, + speed: Optional[int] = None, + button: Optional[Union[MouseButton, str]] = None, + relative: Optional[bool] = None, + coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, + blocking: Literal[False], + ) -> FutureResult[None]: ... + @overload + def mouse_drag( + self, + x: int, + y: int, + *, + from_position: Optional[Tuple[int, int]] = None, + speed: Optional[int] = None, + button: Optional[Union[MouseButton, str]] = None, + relative: Optional[bool] = None, + coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, + blocking: Literal[True], + ) -> None: ... + @overload def mouse_drag( self, x: int, @@ -2893,7 +2962,21 @@ def mouse_drag( relative: Optional[bool] = None, blocking: bool = True, coord_mode: Optional[CoordModeRelativeTo] = None, - ) -> None: + send_mode: Optional[SendMode] = None, + ) -> Union[None, FutureResult[None]]: ... + def mouse_drag( + self, + x: int, + y: int, + *, + from_position: Optional[Tuple[int, int]] = None, + speed: Optional[int] = None, + button: Optional[Union[MouseButton, str]] = None, + relative: Optional[bool] = None, + blocking: bool = True, + coord_mode: Optional[CoordModeRelativeTo] = None, + send_mode: Optional[SendMode] = None, + ) -> Union[None, FutureResult[None]]: """ Analog for `MouseClickDrag `_ """ @@ -2922,7 +3005,13 @@ def mouse_drag( else: args.append('') - self._transport.function_call('AHKMouseClickDrag', args, blocking=blocking) + if send_mode: + args.append(send_mode) + else: + args.append('') + + resp = self._transport.function_call('AHKMouseClickDrag', args, blocking=blocking) + return resp # fmt: off @overload diff --git a/ahk/_sync/transport.py b/ahk/_sync/transport.py index 27cf3b7..f697964 100644 --- a/ahk/_sync/transport.py +++ b/ahk/_sync/transport.py @@ -87,6 +87,7 @@ def result(self, timeout: Optional[float] = None) -> T_SyncFuture: 'AHKGetClipboardAll', 'AHKGetCoordMode', 'AHKGetSendLevel', + 'AHKGetSendMode', 'AHKGetTitleMatchMode', 'AHKGetTitleMatchSpeed', 'AHKGetVolume', @@ -117,6 +118,7 @@ def result(self, timeout: Optional[float] = None) -> T_SyncFuture: 'AHKSetCoordMode', 'AHKSetDetectHiddenWindows', 'AHKSetSendLevel', + 'AHKSetSendMode', 'AHKSetTitleMatchMode', 'AHKSetVolume', 'AHKShowToolTip', @@ -513,6 +515,10 @@ def function_call(self, function_name: Literal['AHKSetCoordMode'], args: List[st @overload def function_call(self, function_name: Literal['AHKGetSendLevel']) -> int: ... @overload + def function_call(self, function_name: Literal['AHKSetSendMode'], args: List[str]) -> None: ... + @overload + def function_call(self, function_name: Literal['AHKGetSendMode']) -> str: ... + @overload def function_call(self, function_name: Literal['AHKSetSendLevel'], args: List[str]) -> None: ... @overload def function_call(self, function_name: Literal['AHKWinWait'], args: Optional[List[str]] = None, *, blocking: bool = True, engine: Optional[AHK[Any]] = None) -> Union[Window, FutureResult[Window]]: ... diff --git a/ahk/templates/daemon-v2.ahk b/ahk/templates/daemon-v2.ahk index 2742a6f..8678f8f 100644 --- a/ahk/templates/daemon-v2.ahk +++ b/ahk/templates/daemon-v2.ahk @@ -1809,11 +1809,23 @@ AHKMouseMove(args*) { y := args[2] speed := args[3] relative := args[4] + send_mode := args[5] + current_send_mode := Format("{}", A_SendMode) + + if (send_mode != "") { + SendMode send_mode + } + if (relative != "") { - MouseMove(x, y, speed, "R") + MouseMove(x, y, speed, "R") } else { - MouseMove(x, y, speed) + MouseMove(x, y, speed) } + + if (send_mode != "") { + SendMode current_send_mode + } + resp := FormatNoValueResponse() return resp {% endblock AHKMouseMove %} @@ -1828,7 +1840,13 @@ AHKClick(args*) { direction := args[5] r := args[6] relative_to := args[7] + send_mode := args[8] current_coord_rel := Format("{}", A_CoordModeMouse) + current_send_mode := Format("{}", A_SendMode) + + if (send_mode != "") { + SendMode send_mode + } if (relative_to != "") { CoordMode("Mouse", relative_to) @@ -1840,6 +1858,9 @@ AHKClick(args*) { CoordMode("Mouse", current_coord_rel) } + if (send_mode != "") { + SendMode current_send_mode + } return FormatNoValueResponse() {% endblock AHKClick %} @@ -1879,6 +1900,19 @@ AHKSetCoordMode(args*) { {% endblock AHKSetCoordMode %} } + +AHKGetSendMode(args*) { + return FormatResponse("ahk.message.StringResponseMessage", A_SendMode) +} + + +AHKSetSendMode(args*) { + mode := args[1] + SendMode mode + return FormatNoValueResponse() +} + + AHKMouseClickDrag(args*) { {% block AHKMouseClickDrag %} button := args[1] @@ -1889,8 +1923,13 @@ AHKMouseClickDrag(args*) { speed := args[6] relative := args[7] relative_to := args[8] - + send_mode := args[9] current_coord_rel := Format("{}", A_CoordModeMouse) + current_send_mode := Format("{}", A_SendMode) + + if (send_mode != "") { + SendMode send_mode + } if (relative_to != "") { CoordMode("Mouse", relative_to) @@ -1912,6 +1951,10 @@ AHKMouseClickDrag(args*) { CoordMode("Mouse", current_coord_rel) } + if (send_mode != "") { + SendMode current_send_mode + } + return FormatNoValueResponse() {% endblock AHKMouseClickDrag %} @@ -1985,8 +2028,14 @@ AHKSend(args*) { str := args[1] key_delay := args[2] key_press_duration := args[3] + send_mode := args[4] current_delay := Format("{}", A_KeyDelay) current_key_duration := Format("{}", A_KeyDuration) + current_send_mode := Format("{}", A_SendMode) + + if (send_mode != "") { + SendMode send_mode + } if (key_delay != "" or key_press_duration != "") { SetKeyDelay(key_delay, key_press_duration) @@ -1995,6 +2044,10 @@ AHKSend(args*) { Send(str) + if (send_mode != "") { + SendMode current_send_mode + } + if (key_delay != "" or key_press_duration != "") { SetKeyDelay(current_delay, current_key_duration) } diff --git a/ahk/templates/daemon.ahk b/ahk/templates/daemon.ahk index 7017fe8..558677e 100644 --- a/ahk/templates/daemon.ahk +++ b/ahk/templates/daemon.ahk @@ -1725,14 +1725,25 @@ AHKClick(args*) { direction := args[5] r := args[6] relative_to := args[7] + send_mode := args[8] current_coord_rel := Format("{}", A_CoordModeMouse) + current_send_mode := Format("{}", A_SendMode) + + if (send_mode != "") { + SendMode, %send_mode% + } if (relative_to != "") { CoordMode, Mouse, %relative_to% } + Click, %x%, %y%, %button%, %direction%, %r% + if (send_mode != "") { + SendMode, %current_send_mode% + } + if (relative_to != "") { CoordMode, Mouse, %current_coord_rel% } @@ -1776,6 +1787,18 @@ AHKSetCoordMode(args*) { {% endblock AHKSetCoordMode %} } +AHKGetSendMode(args*) { + return FormatResponse("ahk.message.StringResponseMessage", A_SendMode) +} + + +AHKSetSendMode(args*) { + mode := args[1] + SendMode, %mode% + return FormatNoValueResponse() +} + + AHKMouseClickDrag(args*) { {% block AHKMouseClickDrag %} button := args[1] @@ -1786,6 +1809,11 @@ AHKMouseClickDrag(args*) { speed := args[6] relative := args[7] relative_to := args[8] + send_mode := args[8] + current_send_mode := Format("{}", A_SendMode) + if (send_mode != "") { + SendMode, %send_mode% + } current_coord_rel := Format("{}", A_CoordModeMouse) @@ -1799,6 +1827,10 @@ AHKMouseClickDrag(args*) { CoordMode, Mouse, %current_coord_rel% } + if (send_mode != "") { + SendMode, %current_send_mode% + } + return FormatNoValueResponse() {% endblock AHKMouseClickDrag %} @@ -1877,18 +1909,29 @@ AHKSend(args*) { str := args[1] key_delay := args[2] key_press_duration := args[3] + send_mode := args[4] current_delay := Format("{}", A_KeyDelay) current_key_duration := Format("{}", A_KeyDuration) + current_send_mode := Format("{}", A_SendMode) if (key_delay != "" or key_press_duration != "") { SetKeyDelay, %key_delay%, %key_press_duration% } + if (send_mode != "") { + SendMode, %send_mode% + } + Send,% str if (key_delay != "" or key_press_duration != "") { SetKeyDelay, %current_delay%, %current_key_duration% } + + if (send_mode != "") { + SendMode, %current_send_mode% + } + return FormatNoValueResponse() {% endblock AHKSend %} } @@ -1898,18 +1941,30 @@ AHKSendRaw(args*) { str := args[1] key_delay := args[2] key_press_duration := args[3] + send_mode := args[4] current_delay := Format("{}", A_KeyDelay) current_key_duration := Format("{}", A_KeyDuration) + current_send_mode := Format("{}", A_SendMode) + if (key_delay != "" or key_press_duration != "") { SetKeyDelay, %key_delay%, %key_press_duration% } + if (send_mode != "") { + SendMode, %send_mode% + } + SendRaw,% str if (key_delay != "" or key_press_duration != "") { SetKeyDelay, %current_delay%, %current_key_duration% } + + if (send_mode != "") { + SendMode, %current_send_mode% + } + return FormatNoValueResponse() {% endblock AHKSendRaw %} } diff --git a/tests/_async/test_mouse.py b/tests/_async/test_mouse.py index 26477e6..ea41271 100644 --- a/tests/_async/test_mouse.py +++ b/tests/_async/test_mouse.py @@ -57,7 +57,7 @@ async def test_mouse_move_rel(self): async def test_mouse_move_nonblocking(self): await self.ahk.mouse_move(100, 100) - res = await self.ahk.mouse_move(500, 500, speed=5, blocking=False) + res = await self.ahk.mouse_move(500, 500, speed=10, send_mode='Event', blocking=False) current_pos = await self.ahk.get_mouse_position() await async_sleep(0.1) pos = await self.ahk.get_mouse_position() @@ -65,6 +65,37 @@ async def test_mouse_move_nonblocking(self): assert pos != (500, 500) await res.result() + async def test_mouse_drag(self): + await self.ahk.mouse_move(x=100, y=100) + pos = await self.ahk.get_mouse_position() + assert pos == (100, 100) + await self.ahk.mouse_drag(x=200, y=200) + pos2 = await self.ahk.get_mouse_position() + assert pos2 == (200, 200) + + async def test_mouse_drag_relative(self): + await self.ahk.mouse_move(x=100, y=100) + await async_sleep(0.5) + pos = await self.ahk.get_mouse_position() + assert pos == (100, 100) + await self.ahk.mouse_drag(x=10, y=10, relative=True, button=1) + await async_sleep(0.5) + pos2 = await self.ahk.get_mouse_position() + x1, y1 = pos + x2, y2 = pos2 + assert abs(x1 - x2) == 10 + assert abs(y1 - y2) == 10 + + async def test_coord_mode(self): + await self.ahk.set_coord_mode(target='Mouse', relative_to='Client') + res = await self.ahk.get_coord_mode(target='Mouse') + assert res == 'Client' + + async def test_send_mode(self): + await self.ahk.set_send_mode('InputThenPlay') + res = await self.ahk.get_send_mode() + assert res == 'InputThenPlay' + class TestMouseAsyncV2(TestMouseAsync): async def asyncSetUp(self) -> None: diff --git a/tests/_sync/test_mouse.py b/tests/_sync/test_mouse.py index e5616c6..a8b580c 100644 --- a/tests/_sync/test_mouse.py +++ b/tests/_sync/test_mouse.py @@ -56,7 +56,7 @@ def test_mouse_move_rel(self): def test_mouse_move_nonblocking(self): self.ahk.mouse_move(100, 100) - res = self.ahk.mouse_move(500, 500, speed=5, blocking=False) + res = self.ahk.mouse_move(500, 500, speed=10, send_mode='Event', blocking=False) current_pos = self.ahk.get_mouse_position() sleep(0.1) pos = self.ahk.get_mouse_position() @@ -64,6 +64,37 @@ def test_mouse_move_nonblocking(self): assert pos != (500, 500) res.result() + def test_mouse_drag(self): + self.ahk.mouse_move(x=100, y=100) + pos = self.ahk.get_mouse_position() + assert pos == (100, 100) + self.ahk.mouse_drag(x=200, y=200) + pos2 = self.ahk.get_mouse_position() + assert pos2 == (200, 200) + + def test_mouse_drag_relative(self): + self.ahk.mouse_move(x=100, y=100) + sleep(0.5) + pos = self.ahk.get_mouse_position() + assert pos == (100, 100) + self.ahk.mouse_drag(x=10, y=10, relative=True, button=1) + sleep(0.5) + pos2 = self.ahk.get_mouse_position() + x1, y1 = pos + x2, y2 = pos2 + assert abs(x1 - x2) == 10 + assert abs(y1 - y2) == 10 + + def test_coord_mode(self): + self.ahk.set_coord_mode(target='Mouse', relative_to='Client') + res = self.ahk.get_coord_mode(target='Mouse') + assert res == 'Client' + + def test_send_mode(self): + self.ahk.set_send_mode('InputThenPlay') + res = self.ahk.get_send_mode() + assert res == 'InputThenPlay' + class TestMouseAsyncV2(TestMouseAsync): def setUp(self) -> None: