Skip to content

Commit b55fed4

Browse files
author
Fares Ahmed
authored
Add stubs for pynput package (#7177)
Fixes #4328
1 parent 58e505e commit b55fed4

File tree

10 files changed

+297
-0
lines changed

10 files changed

+297
-0
lines changed

stubs/pynput/METADATA.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
version = "1.7.*"
2+
stubtest = false # A display server (e.g. X11) is required to import pynput

stubs/pynput/pynput/__init__.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import keyboard as keyboard, mouse as mouse

stubs/pynput/pynput/_info.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
__author__: str
2+
__version__: tuple[int, int, int]

stubs/pynput/pynput/_util.pyi

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import sys
2+
import threading
3+
from _typeshed import Self
4+
from collections.abc import Callable
5+
from queue import Queue
6+
from types import ModuleType, TracebackType
7+
from typing import Any, ClassVar, Generic, TypeVar
8+
from typing_extensions import ParamSpec, TypedDict
9+
10+
_T = TypeVar("_T")
11+
_AbstractListener_T = TypeVar("_AbstractListener_T", bound=AbstractListener)
12+
_P = ParamSpec("_P")
13+
14+
class _RESOLUTIONS(TypedDict):
15+
darwin: str
16+
uinput: str
17+
xorg: str
18+
19+
RESOLUTIONS: _RESOLUTIONS
20+
21+
def backend(package: str) -> ModuleType: ...
22+
def prefix(base: type | tuple[type | tuple[Any, ...], ...], cls: type) -> str | None: ...
23+
24+
class AbstractListener(threading.Thread):
25+
class StopException(Exception): ...
26+
_HANDLED_EXCEPTIONS: ClassVar[tuple[type | tuple[Any, ...], ...]] # undocumented
27+
_suppress: bool # undocumented
28+
_running: bool # undocumented
29+
_thread: threading.Thread # undocumented
30+
_condition: threading.Condition # undocumented
31+
_ready: bool # undocumented
32+
_queue: Queue[sys._OptExcInfo | None] # undocumented
33+
daemon: bool
34+
def __init__(self, suppress: bool = ..., **kwargs: Callable[..., bool | None] | None) -> None: ...
35+
@property
36+
def suppress(self) -> bool: ...
37+
@property
38+
def running(self) -> bool: ...
39+
def stop(self) -> None: ...
40+
def __enter__(self: Self) -> Self: ...
41+
def __exit__(
42+
self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None
43+
) -> None: ...
44+
def wait(self) -> None: ...
45+
def run(self) -> None: ...
46+
@classmethod
47+
def _emitter(cls, f: Callable[_P, _T]) -> Callable[_P, _T]: ... # undocumented
48+
def _mark_ready(self) -> None: ... # undocumented
49+
def _run(self) -> None: ... # undocumented
50+
def _stop_platform(self) -> None: ... # undocumented
51+
def join(self, *args: Any) -> None: ...
52+
53+
class Events(Generic[_T, _AbstractListener_T]):
54+
_Listener: type[_AbstractListener_T] | None # undocumented
55+
56+
class Event:
57+
def __eq__(self, other: object) -> bool: ...
58+
_event_queue: Queue[_T] # undocumented
59+
_sentinel: object # undocumented
60+
_listener: _AbstractListener_T # undocumented
61+
start: Callable[[], None]
62+
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
63+
def __enter__(self: Self) -> Self: ...
64+
def __exit__(self, *args: Any) -> None: ...
65+
def __iter__(self: Self) -> Self: ...
66+
def __next__(self) -> _T: ...
67+
def get(self, timeout: float | None = ...) -> _T | None: ...
68+
def _event_mapper(self, event: Callable[_P, None]) -> Callable[_P, None]: ...
69+
70+
class NotifierMixin: ...
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from _typeshed import SupportsItems
2+
from collections.abc import Callable
3+
from typing import Any
4+
5+
from pynput import _util
6+
7+
from ._base import Controller as Controller, Key as Key, KeyCode as KeyCode, Listener as Listener
8+
9+
class Events(_util.Events[Any, Listener]):
10+
class Press(_util.Events.Event):
11+
key: Key | KeyCode | None
12+
def __init__(self, key: Key | KeyCode | None) -> None: ...
13+
14+
class Release(_util.Events.Event):
15+
key: Key | KeyCode | None
16+
def __init__(self, key: Key | KeyCode | None) -> None: ...
17+
18+
def __init__(self) -> None: ...
19+
def __next__(self) -> Press | Release: ...
20+
def get(self, timeout: float | None = ...) -> Press | Release | None: ...
21+
22+
class HotKey:
23+
def __init__(self, keys: list[KeyCode], on_activate: Callable[[], None]) -> None: ...
24+
@staticmethod
25+
def parse(keys: str) -> list[KeyCode]: ...
26+
def press(self, key: Key | KeyCode) -> None: ...
27+
def release(self, key: Key | KeyCode) -> None: ...
28+
29+
class GlobalHotKeys(Listener):
30+
def __init__(self, hotkeys: SupportsItems[str, Callable[[], None]], *args: Any, **kwargs: Any) -> None: ...
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import contextlib
2+
import enum
3+
from _typeshed import Self
4+
from collections.abc import Callable, Iterable, Iterator
5+
from typing import Any, ClassVar
6+
7+
from pynput._util import AbstractListener
8+
9+
class KeyCode:
10+
_PLATFORM_EXTENSIONS: ClassVar[Iterable[str]] # undocumented
11+
vk: int | None
12+
char: str | None
13+
is_dead: bool | None
14+
combining: str | None
15+
def __init__(self, vk: str | None = ..., char: str | None = ..., is_dead: bool = ..., **kwargs: str) -> None: ...
16+
def __eq__(self, other: object) -> bool: ...
17+
def __hash__(self) -> int: ...
18+
def join(self: Self, key: Self) -> Self: ...
19+
@classmethod
20+
def from_vk(cls: type[Self], vk: int, **kwargs: Any) -> Self: ...
21+
@classmethod
22+
def from_char(cls: type[Self], char: str, **kwargs: Any) -> Self: ...
23+
@classmethod
24+
def from_dead(cls: type[Self], char: str, **kwargs: Any) -> Self: ...
25+
26+
class Key(enum.Enum):
27+
alt: int
28+
alt_l: int
29+
alt_r: int
30+
alt_gr: int
31+
backspace: int
32+
caps_lock: int
33+
cmd: int
34+
cmd_l: int
35+
cmd_r: int
36+
ctrl: int
37+
ctrl_l: int
38+
ctrl_r: int
39+
delete: int
40+
down: int
41+
end: int
42+
enter: int
43+
esc: int
44+
f1: int
45+
f2: int
46+
f3: int
47+
f4: int
48+
f5: int
49+
f6: int
50+
f7: int
51+
f8: int
52+
f9: int
53+
f10: int
54+
f11: int
55+
f12: int
56+
f13: int
57+
f14: int
58+
f15: int
59+
f16: int
60+
f17: int
61+
f18: int
62+
f19: int
63+
f20: int
64+
home: int
65+
left: int
66+
page_down: int
67+
page_up: int
68+
right: int
69+
shift: int
70+
shift_l: int
71+
shift_r: int
72+
space: int
73+
tab: int
74+
up: int
75+
media_play_pause: int
76+
media_volume_mute: int
77+
media_volume_down: int
78+
media_volume_up: int
79+
media_previous: int
80+
media_next: int
81+
insert: int
82+
menu: int
83+
num_lock: int
84+
pause: int
85+
print_screen: int
86+
scroll_lock: int
87+
88+
class Controller:
89+
_KeyCode: ClassVar[KeyCode] # undocumented
90+
_Key: ClassVar[Key] # undocumented
91+
92+
class InvalidKeyException(Exception): ...
93+
class InvalidCharacterException(Exception): ...
94+
95+
def __init__(self) -> None: ...
96+
def press(self, key: str | Key | KeyCode) -> None: ...
97+
def release(self, key: str | Key | KeyCode) -> None: ...
98+
def tap(self, key: str | Key | KeyCode) -> None: ...
99+
def touch(self, key: str | Key | KeyCode, is_press: bool) -> None: ...
100+
@contextlib.contextmanager
101+
def pressed(self, *args: str | Key | KeyCode) -> Iterator[None]: ...
102+
def type(self, string: str) -> None: ...
103+
@property
104+
def modifiers(self) -> contextlib.AbstractContextManager[Iterator[set[Key]]]: ...
105+
@property
106+
def alt_pressed(self) -> bool: ...
107+
@property
108+
def alt_gr_pressed(self) -> bool: ...
109+
@property
110+
def ctrl_pressed(self) -> bool: ...
111+
@property
112+
def shift_pressed(self) -> bool: ...
113+
114+
class Listener(AbstractListener):
115+
def __init__(
116+
self,
117+
on_press: Callable[[Key | KeyCode | None], None] | None = ...,
118+
on_release: Callable[[Key | KeyCode | None], None] | None = ...,
119+
suppress: bool = ...,
120+
**kwargs: Any,
121+
) -> None: ...
122+
def canonical(self, key: Key | KeyCode) -> Key | KeyCode: ...
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from ._base import Controller as Controller, Key as Key, KeyCode as KeyCode, Listener as Listener
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from typing import Any
2+
3+
from pynput import _util
4+
5+
from ._base import Button as Button, Controller as Controller, Listener as Listener
6+
7+
class Events(_util.Events[Any, Listener]):
8+
class Move(_util.Events.Event):
9+
x: int
10+
y: int
11+
def __init__(self, x: int, y: int) -> None: ...
12+
13+
class Click(_util.Events.Event):
14+
x: int
15+
y: int
16+
button: Button
17+
pressed: bool
18+
def __init__(self, x: int, y: int, button: Button, pressed: bool) -> None: ...
19+
20+
class Scroll(_util.Events.Event):
21+
x: int
22+
y: int
23+
dx: int
24+
dy: int
25+
def __init__(self, x: int, y: int, dx: int, dy: int) -> None: ...
26+
27+
def __init__(self) -> None: ...
28+
def __next__(self) -> Move | Click | Scroll: ...
29+
def get(self, timeout: float | None = ...) -> Move | Click | Scroll | None: ...

stubs/pynput/pynput/mouse/_base.pyi

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import enum
2+
from _typeshed import Self
3+
from collections.abc import Callable
4+
from types import TracebackType
5+
from typing import Any
6+
7+
from pynput._util import AbstractListener
8+
9+
class Button(enum.Enum):
10+
unknown: int
11+
left: int
12+
middle: int
13+
right: int
14+
15+
class Controller:
16+
def __init__(self) -> None: ...
17+
@property
18+
def position(self) -> tuple[int, int]: ...
19+
@position.setter
20+
def position(self, position: tuple[int, int]) -> None: ...
21+
def scroll(self, dx: int, dy: int) -> None: ...
22+
def press(self, button: Button) -> None: ...
23+
def release(self, button: Button) -> None: ...
24+
def move(self, dx: int, dy: int) -> None: ...
25+
def click(self, button: Button, count: int = ...) -> None: ...
26+
def __enter__(self: Self) -> Self: ...
27+
def __exit__(
28+
self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None
29+
) -> None: ...
30+
31+
class Listener(AbstractListener):
32+
def __init__(
33+
self,
34+
on_move: Callable[[int, int], bool | None] | None = ...,
35+
on_click: Callable[[int, int, Button, bool], bool | None] | None = ...,
36+
on_scroll: Callable[[int, int, int, int], bool | None] | None = ...,
37+
suppress: bool = ...,
38+
**kwargs: Any,
39+
) -> None: ...

stubs/pynput/pynput/mouse/_dummy.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from ._base import Button as Button, Controller as Controller, Listener as Listener

0 commit comments

Comments
 (0)