Changelogο
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
v2.3.1 (Current)ο
Added * clamped speed to prevent overflick loop issue
- Fixed
removed debug param since it cause a TypeError and isnβt needed anyway removed alot of the unnecessary whitespace, assuming these came from deleting old lines of code.
v2.3.0ο
Added
move_abs function for absolute mouse movement
v2.2.2ο
Fixed
Temporary fix for buttons state logging formatting issue (0x0A/Right Click and MS1 handling)
v2.2.1ο
Fixed
Incorrect default boolean value causing unexpected behavior and delays in all methods.
v2.2.0ο
Added
Added async for lock, unlock, and click_human_like methods
Added missing batch_execute command
Fixed
Documentation formatting consistency
Fixed all Sync vs Async limitations
Fixed duplicate controller inside init
Corrected missing debug statements in controller
Changed
Enhanced documentation with complete API reference
v2.1.3ο
Fixed
Async controller bug
Documentation formatting consistency
v2.1.2ο
Added
Additional examples for common use cases
Improved error messages with actionable suggestions
Fixed
Minor stability improvements in connection handling
Documentation formatting consistency
Changed
Updated dependencies for better compatibility
v2.1.0ο
Added
Context manager support for automatic cleanup
Enhanced button event monitoring with callbacks
Serial spoofing capabilities
Batch command execution utilities
Connection status callbacks
Changed
Improved error handling with custom exception types
Better logging format with timestamps
Enhanced debugging output
Fixed
Memory leak in continuous button monitoring
Race condition in auto-reconnection logic
v2.0.0 (Major Release)ο
π Huge Performance Update
This is a complete rewrite focusing on gaming performance and modern Python async support.
Added
Async/Await Support: Complete async API with
create_async_controller()Zero-Delay Architecture: Removed all
sleep()calls with intelligent command trackingAuto-Reconnection: Automatic device reconnection on disconnect with callbacks
Parallel Operations: Execute multiple commands simultaneously with
asyncio.gather()Gaming Optimization: Sub-3ms command execution for 240Hz+ gaming
Command Tracking: Unique ID system for reliable command-response matching
Enhanced Debugging: Detailed logging with performance metrics
Human-like Interactions:
click_human_like()with timing profilesButton Event Monitoring: Real-time button state callbacks
Smooth Movement: Bezier curves and interpolated movement
Batch Operations:
batch_execute()for efficient command sequencesLock State Queries: Instant lock state checking without delays
Device Information: Comprehensive device info and firmware version
Command-line Tools: Interactive debug console and automated testing
Performance Improvements
17x faster average performance compared to v1.3
117x faster batch operations
33x faster lock state queries
20x faster firmware version checks
18x faster button operations
Technical Enhancements
Pre-computed command templates
Bitwise button state operations
Zero-copy buffer management
Optimized serial timeouts (1ms read, 10ms write)
High-priority listener thread
Cache-friendly connection checks
Minimal memory allocations
Breaking Changes
Some sync-only methods in async contexts require
run_in_executor()drag()andget_all_lock_states()currently sync-onlyDebug output format changed
Exception hierarchy restructured
Migration Notes
Most v1.x code works without changes
Add
awaitfor async operationsUse context managers for automatic cleanup
Enable
auto_reconnect=Truefor stability
v1.4.0ο
Added
Initial performance optimizations
Reduced sleep delays in critical paths
Improved connection stability
Changed
Faster command execution (~2x improvement over v1.3)
Better error handling
Fixed
Connection timeout issues
Memory usage improvements
v1.3.0ο
Added
Button locking and unlocking functionality
Mouse axis locking (X/Y)
Basic button state querying
Drag operation support
Changed
Improved command parsing
Better error messages
Fixed
Serial communication stability
Button mask handling
v1.2.0ο
Added
Mouse movement with relative positioning
Scroll wheel support
Double-click functionality
Basic button press/release
Changed
Refactored core communication layer
Improved device discovery
v1.1.0ο
Added
Multi-button support (LEFT, RIGHT, MIDDLE, MOUSE4, MOUSE5)
Device auto-discovery via VID/PID
Basic error handling
Fixed
Serial port detection on Windows
Command response parsing
v1.0.0 (Initial Release)ο
Added
Basic mouse control functionality
Left/right click support
Simple movement commands
Serial communication with CH343 USB devices
GPL license
Known Limitations
High latency due to sleep delays
No async support
Limited error handling
Manual device connection required
Gaming Performance Targetsο
v2.0 Gaming Benchmarks
144Hz Gaming (7ms frame time): β Easily met (avg 1-3ms per operation)
240Hz Gaming (4.2ms frame time): β Consistently met (most ops β€2ms)
360Hz Gaming (2.8ms frame time): β‘ Achievable (for atomic/single operations)
Performance Evolution
Operation |
v1.3 |
v1.4 |
v2.0 |
Improvement |
|---|---|---|---|---|
Button Click |
~18ms |
~9ms |
1ms |
18x faster |
Mouse Movement |
~17ms |
~8ms |
2ms |
8.5x faster |
Batch Commands |
~350ms |
~90ms |
3ms |
117x faster |
Lock Queries |
~33ms |
~10ms |
1ms |
33x faster |
Migration Guideο
From v1.x to v2.0
Most existing code continues to work. Key migration paths:
Synchronous (No Changes Required)
# v1.x and v2.0 - identical
from makcu import create_controller, MouseButton
makcu = create_controller()
makcu.click(MouseButton.LEFT)
makcu.move(100, 50)
makcu.disconnect()
Asynchronous (New in v2.0)
# v2.0 async
import asyncio
from makcu import create_async_controller, MouseButton
async def main():
async with await create_async_controller() as makcu:
await makcu.click(MouseButton.LEFT)
await makcu.move(100, 50)
asyncio.run(main())
Mixed Operations (v2.0)
# Use executor for sync-only methods in async context
loop = asyncio.get_running_loop()
await loop.run_in_executor(None, makcu.lock, MouseButton.LEFT)
Auto-Reconnection (v2.0)
# Enable auto-reconnection
makcu = create_controller(auto_reconnect=True)
@makcu.on_connection_change
def handle_connection(connected: bool):
if connected:
print("Device reconnected!")
Deprecation Noticesο
Currently Deprecated
None - v2.0 maintains full v1.x compatibility
Future Deprecations (v3.0)
Synchronous-only methods will gain async equivalents
Some legacy method signatures may be simplified
Debug output format may change
Removal Schedule
No removals planned - library maintains backwards compatibility