makcu 2.2.1__py3-none-any.whl → 2.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
makcu/mouse.py CHANGED
@@ -1,250 +1,299 @@
1
- from typing import Dict, Union
2
- from .enums import MouseButton
3
- from .connection import SerialTransport
4
- from .errors import MakcuCommandError
5
- from serial.tools import list_ports
6
-
7
- class AxisButton:
8
- def __init__(self, name: str) -> None:
9
- self.name = name
10
-
11
- class Mouse:
12
-
13
-
14
- _BUTTON_COMMANDS = {
15
- MouseButton.LEFT: "left",
16
- MouseButton.RIGHT: "right",
17
- MouseButton.MIDDLE: "middle",
18
- MouseButton.MOUSE4: "ms1",
19
- MouseButton.MOUSE5: "ms2",
20
- }
21
-
22
-
23
- _PRESS_COMMANDS = {}
24
- _RELEASE_COMMANDS = {}
25
- _LOCK_COMMANDS = {}
26
- _UNLOCK_COMMANDS = {}
27
- _LOCK_QUERY_COMMANDS = {}
28
-
29
- def __init__(self, transport: SerialTransport) -> None:
30
- self.transport = transport
31
- self._lock_states_cache: int = 0
32
- self._cache_valid = False
33
-
34
-
35
- self._init_command_cache()
36
-
37
- def _init_command_cache(self) -> None:
38
-
39
- for button, cmd in self._BUTTON_COMMANDS.items():
40
- self._PRESS_COMMANDS[button] = f"km.{cmd}(1)"
41
- self._RELEASE_COMMANDS[button] = f"km.{cmd}(0)"
42
-
43
-
44
-
45
- lock_targets = [
46
- ("LEFT", "ml", 0),
47
- ("RIGHT", "mr", 1),
48
- ("MIDDLE", "mm", 2),
49
- ("MOUSE4", "ms1", 3),
50
- ("MOUSE5", "ms2", 4),
51
- ("X", "mx", 5),
52
- ("Y", "my", 6),
53
- ]
54
-
55
- for name, cmd, bit in lock_targets:
56
- self._LOCK_COMMANDS[name] = (f"km.lock_{cmd}(1)", bit)
57
- self._UNLOCK_COMMANDS[name] = (f"km.lock_{cmd}(0)", bit)
58
- self._LOCK_QUERY_COMMANDS[name] = (f"km.lock_{cmd}()", bit)
59
-
60
- def _send_button_command(self, button: MouseButton, state: int) -> None:
61
- if button not in self._BUTTON_COMMANDS:
62
- raise MakcuCommandError(f"Unsupported button: {button}")
63
-
64
-
65
- cmd = self._PRESS_COMMANDS[button] if state else self._RELEASE_COMMANDS[button]
66
- self.transport.send_command(cmd)
67
-
68
- def press(self, button: MouseButton) -> None:
69
- self.transport.send_command(self._PRESS_COMMANDS[button])
70
-
71
- def release(self, button: MouseButton) -> None:
72
- self.transport.send_command(self._RELEASE_COMMANDS[button])
73
-
74
- def move(self, x: int, y: int) -> None:
75
- self.transport.send_command(f"km.move({x},{y})")
76
-
77
- def click(self, button: MouseButton) -> None:
78
- if button not in self._BUTTON_COMMANDS:
79
- raise MakcuCommandError(f"Unsupported button: {button}")
80
-
81
-
82
- press_cmd = self._PRESS_COMMANDS[button]
83
- release_cmd = self._RELEASE_COMMANDS[button]
84
-
85
-
86
- transport = self.transport
87
- transport.send_command(press_cmd)
88
- transport.send_command(release_cmd)
89
-
90
- def move_smooth(self, x: int, y: int, segments: int) -> None:
91
- self.transport.send_command(f"km.move({x},{y},{segments})")
92
-
93
- def move_bezier(self, x: int, y: int, segments: int, ctrl_x: int, ctrl_y: int) -> None:
94
- self.transport.send_command(f"km.move({x},{y},{segments},{ctrl_x},{ctrl_y})")
95
-
96
- def scroll(self, delta: int) -> None:
97
- self.transport.send_command(f"km.wheel({delta})")
98
-
99
-
100
- def _set_lock(self, name: str, lock: bool) -> None:
101
- if lock:
102
- cmd, bit = self._LOCK_COMMANDS[name]
103
- else:
104
- cmd, bit = self._UNLOCK_COMMANDS[name]
105
-
106
- self.transport.send_command(cmd)
107
-
108
-
109
- if lock:
110
- self._lock_states_cache |= (1 << bit)
111
- else:
112
- self._lock_states_cache &= ~(1 << bit)
113
- self._cache_valid = True
114
-
115
- def lock_left(self, lock: bool) -> None:
116
- self._set_lock("LEFT", lock)
117
-
118
- def lock_middle(self, lock: bool) -> None:
119
- self._set_lock("MIDDLE", lock)
120
-
121
- def lock_right(self, lock: bool) -> None:
122
- self._set_lock("RIGHT", lock)
123
-
124
- def lock_side1(self, lock: bool) -> None:
125
- self._set_lock("MOUSE4", lock)
126
-
127
- def lock_side2(self, lock: bool) -> None:
128
- self._set_lock("MOUSE5", lock)
129
-
130
- def lock_x(self, lock: bool) -> None:
131
- self._set_lock("X", lock)
132
-
133
- def lock_y(self, lock: bool) -> None:
134
- self._set_lock("Y", lock)
135
-
136
- def spoof_serial(self, serial: str) -> None:
137
- self.transport.send_command(f"km.serial('{serial}')")
138
-
139
- def reset_serial(self) -> None:
140
- self.transport.send_command("km.serial(0)")
141
-
142
- def get_device_info(self) -> Dict[str, Union[str, bool]]:
143
- port_name = self.transport.port
144
- is_connected = self.transport.is_connected()
145
-
146
- if not is_connected or not port_name:
147
- return {
148
- "port": port_name or "Unknown",
149
- "description": "Disconnected",
150
- "vid": "Unknown",
151
- "pid": "Unknown",
152
- "isConnected": False
153
- }
154
-
155
- info = {
156
- "port": port_name,
157
- "description": "Connected Device",
158
- "vid": "Unknown",
159
- "pid": "Unknown",
160
- "isConnected": True
161
- }
162
-
163
- try:
164
- for port in list_ports.comports():
165
- if port.device == port_name:
166
- info["description"] = port.description or "Connected Device"
167
- if port.vid is not None:
168
- info["vid"] = f"0x{port.vid:04x}"
169
- if port.pid is not None:
170
- info["pid"] = f"0x{port.pid:04x}"
171
- break
172
- except Exception:
173
- pass
174
-
175
- return info
176
-
177
- def get_firmware_version(self) -> str:
178
- response = self.transport.send_command("km.version()", expect_response=True, timeout=0.1)
179
- return response or ""
180
-
181
- def _invalidate_cache(self) -> None:
182
- self._cache_valid = False
183
-
184
- def get_all_lock_states(self) -> Dict[str, bool]:
185
-
186
- if self._cache_valid:
187
- return {
188
- "X": bool(self._lock_states_cache & (1 << 5)),
189
- "Y": bool(self._lock_states_cache & (1 << 6)),
190
- "LEFT": bool(self._lock_states_cache & (1 << 0)),
191
- "RIGHT": bool(self._lock_states_cache & (1 << 1)),
192
- "MIDDLE": bool(self._lock_states_cache & (1 << 2)),
193
- "MOUSE4": bool(self._lock_states_cache & (1 << 3)),
194
- "MOUSE5": bool(self._lock_states_cache & (1 << 4)),
195
- }
196
-
197
-
198
- states = {}
199
- targets = ["X", "Y", "LEFT", "RIGHT", "MIDDLE", "MOUSE4", "MOUSE5"]
200
-
201
- for target in targets:
202
- cmd, bit = self._LOCK_QUERY_COMMANDS[target]
203
- try:
204
- result = self.transport.send_command(cmd, expect_response=True, timeout=0.05)
205
- if result and result.strip() in ['0', '1']:
206
- is_locked = result.strip() == '1'
207
- states[target] = is_locked
208
-
209
-
210
- if is_locked:
211
- self._lock_states_cache |= (1 << bit)
212
- else:
213
- self._lock_states_cache &= ~(1 << bit)
214
- else:
215
- states[target] = False
216
- except Exception:
217
- states[target] = False
218
-
219
- self._cache_valid = True
220
- return states
221
-
222
- def is_locked(self, button: Union[MouseButton, AxisButton]) -> bool:
223
- try:
224
- target_name = button.name if hasattr(button, 'name') else str(button)
225
-
226
-
227
- if self._cache_valid and target_name in self._LOCK_QUERY_COMMANDS:
228
- _, bit = self._LOCK_QUERY_COMMANDS[target_name]
229
- return bool(self._lock_states_cache & (1 << bit))
230
-
231
-
232
- cmd, bit = self._LOCK_QUERY_COMMANDS[target_name]
233
- result = self.transport.send_command(cmd, expect_response=True, timeout=0.05)
234
-
235
- if not result:
236
- return False
237
-
238
- result = result.strip()
239
- is_locked = result == '1'
240
-
241
-
242
- if is_locked:
243
- self._lock_states_cache |= (1 << bit)
244
- else:
245
- self._lock_states_cache &= ~(1 << bit)
246
-
247
- return is_locked
248
-
249
- except Exception:
1
+ from typing import Dict, Union
2
+ from .enums import MouseButton
3
+ from .connection import SerialTransport
4
+ from .errors import MakcuCommandError
5
+ from serial.tools import list_ports
6
+ import ctypes
7
+ import time
8
+
9
+ class AxisButton:
10
+ def __init__(self, name: str) -> None:
11
+ self.name = name
12
+
13
+ class Mouse:
14
+
15
+
16
+ _BUTTON_COMMANDS = {
17
+ MouseButton.LEFT: "left",
18
+ MouseButton.RIGHT: "right",
19
+ MouseButton.MIDDLE: "middle",
20
+ MouseButton.MOUSE4: "ms1",
21
+ MouseButton.MOUSE5: "ms2",
22
+ }
23
+
24
+
25
+ _PRESS_COMMANDS = {}
26
+ _RELEASE_COMMANDS = {}
27
+ _LOCK_COMMANDS = {}
28
+ _UNLOCK_COMMANDS = {}
29
+ _LOCK_QUERY_COMMANDS = {}
30
+
31
+ def __init__(self, transport: SerialTransport) -> None:
32
+ self.transport = transport
33
+ self._lock_states_cache: int = 0
34
+ self._cache_valid = False
35
+
36
+
37
+ self._init_command_cache()
38
+
39
+ def _init_command_cache(self) -> None:
40
+
41
+ for button, cmd in self._BUTTON_COMMANDS.items():
42
+ self._PRESS_COMMANDS[button] = f"km.{cmd}(1)"
43
+ self._RELEASE_COMMANDS[button] = f"km.{cmd}(0)"
44
+
45
+
46
+
47
+ lock_targets = [
48
+ ("LEFT", "ml", 0),
49
+ ("RIGHT", "mr", 1),
50
+ ("MIDDLE", "mm", 2),
51
+ ("MOUSE4", "ms1", 3),
52
+ ("MOUSE5", "ms2", 4),
53
+ ("X", "mx", 5),
54
+ ("Y", "my", 6),
55
+ ]
56
+
57
+ for name, cmd, bit in lock_targets:
58
+ self._LOCK_COMMANDS[name] = (f"km.lock_{cmd}(1)", bit)
59
+ self._UNLOCK_COMMANDS[name] = (f"km.lock_{cmd}(0)", bit)
60
+ self._LOCK_QUERY_COMMANDS[name] = (f"km.lock_{cmd}()", bit)
61
+
62
+ def _send_button_command(self, button: MouseButton, state: int) -> None:
63
+ if button not in self._BUTTON_COMMANDS:
64
+ raise MakcuCommandError(f"Unsupported button: {button}")
65
+
66
+
67
+ cmd = self._PRESS_COMMANDS[button] if state else self._RELEASE_COMMANDS[button]
68
+ self.transport.send_command(cmd)
69
+
70
+ def press(self, button: MouseButton) -> None:
71
+ self.transport.send_command(self._PRESS_COMMANDS[button])
72
+
73
+ def release(self, button: MouseButton) -> None:
74
+ self.transport.send_command(self._RELEASE_COMMANDS[button])
75
+
76
+ def move(self, x: int, y: int) -> None:
77
+ self.transport.send_command(f"km.move({x},{y})")
78
+
79
+ def move_abs(self,
80
+ target: tuple[int, int],
81
+ speed: int = 1,
82
+ wait_ms: int = 2,
83
+ debug: bool = False) -> None:
84
+
85
+ def get_mouse_speed_multiplier() -> float:
86
+ """Return multiplier to convert pixels to mickeys based on Windows pointer speed."""
87
+ SPI_GETMOUSESPEED = 0x0070
88
+ speed = ctypes.c_uint()
89
+ ctypes.windll.user32.SystemParametersInfoW(
90
+ SPI_GETMOUSESPEED, 0, ctypes.byref(speed), 0
91
+ )
92
+ return speed.value / 10.0
93
+
94
+ def get_cursor_pos():
95
+ class POINT(ctypes.Structure):
96
+ _fields_ = [("x", ctypes.c_long), ("y", ctypes.c_long)]
97
+ pt = POINT()
98
+ ctypes.windll.user32.GetCursorPos(ctypes.byref(pt))
99
+ return pt.x, pt.y
100
+
101
+ multiplier = get_mouse_speed_multiplier()
102
+ last_pos = None
103
+ end_x, end_y = target
104
+
105
+ while True:
106
+ cx, cy = get_cursor_pos()
107
+ dx, dy = end_x - cx, end_y - cy
108
+
109
+ if abs(dx) <= 1 and abs(dy) <= 1:
110
+ break
111
+
112
+ move_x = max(-speed, min(speed, int(dx / multiplier)))
113
+ move_y = max(-speed, min(speed, int(dy / multiplier)))
114
+
115
+ if debug and (cx, cy) != last_pos:
116
+ print(
117
+ f"[DEBUG] Current: ({cx}, {cy}) | Target delta: ({move_x}, {move_y}) -> "
118
+ f"Multiplier={multiplier:.3f} | Speed={speed} | Last=({last_pos[0]}, {last_pos[1]}) | "
119
+ f"|Δx|={abs(dx):.2f}, |Δy|={abs(dy):.2f}"
120
+ )
121
+ last_pos = (cx, cy)
122
+
123
+ self.transport.send_command(f"km.move({move_x},{move_y})")
124
+ time.sleep(wait_ms / 1000)
125
+
126
+ def click(self, button: MouseButton) -> None:
127
+ if button not in self._BUTTON_COMMANDS:
128
+ raise MakcuCommandError(f"Unsupported button: {button}")
129
+
130
+
131
+ press_cmd = self._PRESS_COMMANDS[button]
132
+ release_cmd = self._RELEASE_COMMANDS[button]
133
+
134
+
135
+ transport = self.transport
136
+ transport.send_command(press_cmd)
137
+ transport.send_command(release_cmd)
138
+
139
+ def move_smooth(self, x: int, y: int, segments: int) -> None:
140
+ self.transport.send_command(f"km.move({x},{y},{segments})")
141
+
142
+ def move_bezier(self, x: int, y: int, segments: int, ctrl_x: int, ctrl_y: int) -> None:
143
+ self.transport.send_command(f"km.move({x},{y},{segments},{ctrl_x},{ctrl_y})")
144
+
145
+ def scroll(self, delta: int) -> None:
146
+ self.transport.send_command(f"km.wheel({delta})")
147
+
148
+
149
+ def _set_lock(self, name: str, lock: bool) -> None:
150
+ if lock:
151
+ cmd, bit = self._LOCK_COMMANDS[name]
152
+ else:
153
+ cmd, bit = self._UNLOCK_COMMANDS[name]
154
+
155
+ self.transport.send_command(cmd)
156
+
157
+
158
+ if lock:
159
+ self._lock_states_cache |= (1 << bit)
160
+ else:
161
+ self._lock_states_cache &= ~(1 << bit)
162
+ self._cache_valid = True
163
+
164
+ def lock_left(self, lock: bool) -> None:
165
+ self._set_lock("LEFT", lock)
166
+
167
+ def lock_middle(self, lock: bool) -> None:
168
+ self._set_lock("MIDDLE", lock)
169
+
170
+ def lock_right(self, lock: bool) -> None:
171
+ self._set_lock("RIGHT", lock)
172
+
173
+ def lock_side1(self, lock: bool) -> None:
174
+ self._set_lock("MOUSE4", lock)
175
+
176
+ def lock_side2(self, lock: bool) -> None:
177
+ self._set_lock("MOUSE5", lock)
178
+
179
+ def lock_x(self, lock: bool) -> None:
180
+ self._set_lock("X", lock)
181
+
182
+ def lock_y(self, lock: bool) -> None:
183
+ self._set_lock("Y", lock)
184
+
185
+ def spoof_serial(self, serial: str) -> None:
186
+ self.transport.send_command(f"km.serial('{serial}')")
187
+
188
+ def reset_serial(self) -> None:
189
+ self.transport.send_command("km.serial(0)")
190
+
191
+ def get_device_info(self) -> Dict[str, Union[str, bool]]:
192
+ port_name = self.transport.port
193
+ is_connected = self.transport.is_connected()
194
+
195
+ if not is_connected or not port_name:
196
+ return {
197
+ "port": port_name or "Unknown",
198
+ "description": "Disconnected",
199
+ "vid": "Unknown",
200
+ "pid": "Unknown",
201
+ "isConnected": False
202
+ }
203
+
204
+ info = {
205
+ "port": port_name,
206
+ "description": "Connected Device",
207
+ "vid": "Unknown",
208
+ "pid": "Unknown",
209
+ "isConnected": True
210
+ }
211
+
212
+ try:
213
+ for port in list_ports.comports():
214
+ if port.device == port_name:
215
+ info["description"] = port.description or "Connected Device"
216
+ if port.vid is not None:
217
+ info["vid"] = f"0x{port.vid:04x}"
218
+ if port.pid is not None:
219
+ info["pid"] = f"0x{port.pid:04x}"
220
+ break
221
+ except Exception:
222
+ pass
223
+
224
+ return info
225
+
226
+ def get_firmware_version(self) -> str:
227
+ response = self.transport.send_command("km.version()", expect_response=True, timeout=0.1)
228
+ return response or ""
229
+
230
+ def _invalidate_cache(self) -> None:
231
+ self._cache_valid = False
232
+
233
+ def get_all_lock_states(self) -> Dict[str, bool]:
234
+
235
+ if self._cache_valid:
236
+ return {
237
+ "X": bool(self._lock_states_cache & (1 << 5)),
238
+ "Y": bool(self._lock_states_cache & (1 << 6)),
239
+ "LEFT": bool(self._lock_states_cache & (1 << 0)),
240
+ "RIGHT": bool(self._lock_states_cache & (1 << 1)),
241
+ "MIDDLE": bool(self._lock_states_cache & (1 << 2)),
242
+ "MOUSE4": bool(self._lock_states_cache & (1 << 3)),
243
+ "MOUSE5": bool(self._lock_states_cache & (1 << 4)),
244
+ }
245
+
246
+
247
+ states = {}
248
+ targets = ["X", "Y", "LEFT", "RIGHT", "MIDDLE", "MOUSE4", "MOUSE5"]
249
+
250
+ for target in targets:
251
+ cmd, bit = self._LOCK_QUERY_COMMANDS[target]
252
+ try:
253
+ result = self.transport.send_command(cmd, expect_response=True, timeout=0.05)
254
+ if result and result.strip() in ['0', '1']:
255
+ is_locked = result.strip() == '1'
256
+ states[target] = is_locked
257
+
258
+
259
+ if is_locked:
260
+ self._lock_states_cache |= (1 << bit)
261
+ else:
262
+ self._lock_states_cache &= ~(1 << bit)
263
+ else:
264
+ states[target] = False
265
+ except Exception:
266
+ states[target] = False
267
+
268
+ self._cache_valid = True
269
+ return states
270
+
271
+ def is_locked(self, button: Union[MouseButton, AxisButton]) -> bool:
272
+ try:
273
+ target_name = button.name if hasattr(button, 'name') else str(button)
274
+
275
+
276
+ if self._cache_valid and target_name in self._LOCK_QUERY_COMMANDS:
277
+ _, bit = self._LOCK_QUERY_COMMANDS[target_name]
278
+ return bool(self._lock_states_cache & (1 << bit))
279
+
280
+
281
+ cmd, bit = self._LOCK_QUERY_COMMANDS[target_name]
282
+ result = self.transport.send_command(cmd, expect_response=True, timeout=0.05)
283
+
284
+ if not result:
285
+ return False
286
+
287
+ result = result.strip()
288
+ is_locked = result == '1'
289
+
290
+
291
+ if is_locked:
292
+ self._lock_states_cache |= (1 << bit)
293
+ else:
294
+ self._lock_states_cache &= ~(1 << bit)
295
+
296
+ return is_locked
297
+
298
+ except Exception:
250
299
  return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: makcu
3
- Version: 2.2.1
3
+ Version: 2.3.0
4
4
  Summary: Python library for Makcu hardware device control
5
5
  Author: SleepyTotem
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -708,7 +708,7 @@ Requires-Dist: twine>=4.0
708
708
  Requires-Dist: rich>=14.0
709
709
  Dynamic: license-file
710
710
 
711
- # 🖱️ Makcu Python Library v2.2.0
711
+ # 🖱️ Makcu Python Library v2.3.0
712
712
 
713
713
  [![PyPI Version](https://img.shields.io/pypi/v/makcu.svg)](https://pypi.org/project/makcu/)
714
714
  [![Python Support](https://img.shields.io/pypi/pyversions/makcu.svg)](https://pypi.org/project/makcu/)
@@ -0,0 +1,17 @@
1
+ makcu/README.md,sha256=inbc1krsBQErNI1RNaIfjKXX4ZjaqGKWG3ETFMqVwfw,11193
2
+ makcu/__init__.py,sha256=wLK0OX4t587Gt7Z4H5pfFaFlgTm8HGzMtlKGT7w0a98,448
3
+ makcu/__main__.py,sha256=duRmMpsNqCKZQfQ-Wj57tIUkZ6hbxLV8MBxWnhyKarY,14527
4
+ makcu/conftest.py,sha256=EoX2T6dnUvWVI_VvJ0KTes6W82KR4Z69kMQVNtsxV7I,201
5
+ makcu/connection.py,sha256=xvgFUPz9JBVHhatlVFtj6zhnfTamT7_o8M3msxOjVMs,23767
6
+ makcu/controller.py,sha256=DRSS9qySJjdKKlUYXf90GemF_HXMTK3ewdqEBJRe06U,14069
7
+ makcu/enums.py,sha256=1SvIv5IoMIfXyoMAq8I5r_aKMVKjYR-L_hXkFLJ_5mw,119
8
+ makcu/errors.py,sha256=hXdeUCHvbzfqWX3uotG12Xv8EPwWs-5aHQ12xpgwx3Y,229
9
+ makcu/makcu.pyi,sha256=UfbX7774u_a9oyIa1rweWqIRoQxVAjhhHUuukDp3jiA,237
10
+ makcu/mouse.py,sha256=bY_dxalfgAjAIStT3ytCNWWhDZEwZIAR1vRupTAyJxA,10234
11
+ makcu/py.typed,sha256=ks2XNwsNldow4qVp9kuCuGBuHTmngmrzgvRnkzWIGMY,110
12
+ makcu/test_suite.py,sha256=mfzr7L63Eim1z4-l7WHtWs7szGr6bNk2U13vXVlWeM4,4295
13
+ makcu-2.3.0.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
14
+ makcu-2.3.0.dist-info/METADATA,sha256=SjnO2FaO3oU01iA8Bg3Hf4nWaHAyCFB0Qf7Y9qWz628,53904
15
+ makcu-2.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
+ makcu-2.3.0.dist-info/top_level.txt,sha256=IRO1UVb5LK_ovjau0g4oObyXQqy00tVEE-yF5lPgw1w,6
17
+ makcu-2.3.0.dist-info/RECORD,,
@@ -1,17 +0,0 @@
1
- makcu/README.md,sha256=izPeCilhDbOpZwJ3sz9ZVbaFYkWFMsjYq87bAkV34EU,10788
2
- makcu/__init__.py,sha256=lbWpmF383K2bi1-IFpaLA0G12ITD8NjQVq8t3oIzTI0,448
3
- makcu/__main__.py,sha256=duRmMpsNqCKZQfQ-Wj57tIUkZ6hbxLV8MBxWnhyKarY,14527
4
- makcu/conftest.py,sha256=EoX2T6dnUvWVI_VvJ0KTes6W82KR4Z69kMQVNtsxV7I,201
5
- makcu/connection.py,sha256=1WQRoFuoXq76JIMC4aERxE8NdSevnlpQXkdj1T-w9Y4,20146
6
- makcu/controller.py,sha256=EBtiScaOU0CV7NmwVdR3CwFpbT5RymdrNveRKo5ehFU,13242
7
- makcu/enums.py,sha256=1SvIv5IoMIfXyoMAq8I5r_aKMVKjYR-L_hXkFLJ_5mw,119
8
- makcu/errors.py,sha256=hXdeUCHvbzfqWX3uotG12Xv8EPwWs-5aHQ12xpgwx3Y,229
9
- makcu/makcu.pyi,sha256=UfbX7774u_a9oyIa1rweWqIRoQxVAjhhHUuukDp3jiA,237
10
- makcu/mouse.py,sha256=YZQDA5OGQlCxCDu3Huzwp5bjH__9yb867iLSVTYOKP4,8157
11
- makcu/py.typed,sha256=ks2XNwsNldow4qVp9kuCuGBuHTmngmrzgvRnkzWIGMY,110
12
- makcu/test_suite.py,sha256=mfzr7L63Eim1z4-l7WHtWs7szGr6bNk2U13vXVlWeM4,4295
13
- makcu-2.2.1.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
14
- makcu-2.2.1.dist-info/METADATA,sha256=zHxgcXW_fTXsW_BeLMNlGcmX1ORn95-VoOgbstikOe0,53904
15
- makcu-2.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
- makcu-2.2.1.dist-info/top_level.txt,sha256=IRO1UVb5LK_ovjau0g4oObyXQqy00tVEE-yF5lPgw1w,6
17
- makcu-2.2.1.dist-info/RECORD,,
File without changes