Releases: jesga06/UR-XD
Release list
v2.1
2.1 - UI Customizations, Diagnostic Utilities, and Advanced Tuning
This update introduces a suite of features to enhance customization, diagnostic profiling, and stick tuning capabilities. We have added new GUI tabs, advanced curve equations, a terminology cleanup to prevent profile ambiguity, and a selective community maps downloader.
🎮 User-Facing Changes
- New Customization Tab: Toggle between Light/Dark appearance modes, switch between 7 dynamic color themes, and choose custom system fonts.
- New Profile Tab: Validate your configuration files, run interactive Git-style diffs between your settings and defaults, and export configs directly.
- New Utilities Tab: Real-time polling rate monitoring, synthetic throughput benchmarks, live raw input inspectors, and a hardware latency estimator.
- Advanced Analog Curves & Equation Preview:
- Implemented Cubic, Sigmoid, and Bezier response curves.
- Enter custom equations directly in the UI and preview their shapes instantly.
- Drag-and-shape custom curve shapes using interactive dots.
- Export LaTeX representations of your response curves directly to your clipboard.
- Tuning Enhancements: Sensitivity sliders are now functional for analog triggers.
- Calibration Confidence Engine: The calibration wizard now grades your controller's structural integrity (circularity, deadzone size, and center precision) after profiling.
- Selective Community Map Downloads: Connects to the community repository (
jesga06/UR-XD-community-HID-maps) to selectively fetch maps for your controllers rather than downloading a full ZIP. Includes an automated update scheduler. - Terminology Refactor: Cleaned up naming ambiguities across the app:
- Hardware layout descriptors are now HID maps.
- User preferences and remaps are user profiles.
- Main configurations (
config.ini) are wrapper configs.
- Bug Fixes:
- Shift Key Bindings Fix: Corrected shift mapping lookups in
config.inisections, restoring functional layer-shifting. - Fixed configuration reference lookups and method references in the GUI profile validator.
- Version numbering is now shown in the GUI dashboard.
- Shift Key Bindings Fix: Corrected shift mapping lookups in
⚙️ Under-the-Hood Changes
- Matplotlib Oscilloscope Integration: Integrated Matplotlib into the Utilities tab for real-time oscilloscope rendering without lagging the main GUI loop.
- Dynamic Theme Interpolation: Automatically queries CustomTkinter accent colors to dynamically invert tracers and lines for high contrast.
- Python
evalSafe Context: Created a localized, sandboxed environment to securely process custom user equations. - Performance Enhancements: Optimized update loop tick rates and reduced stdout logging overhead to prevent graphing latency.
- Phased Community Fetcher: Rewrote community downloading scripts to process queries through index checking before requesting raw GitHub files.
- Persistent Update Tracking: Saved community update metadata directly to the wrapper configuration file.
Check CHANGELOG.md for details and featurelist.md for the complete feature list.
How to use:
- Install all dependencies listed in the README.md file.
- Unzip it anywhere you want.
- Run
pip install -r requirements.txtin CMD or PowerShell. - Run
calibrate.bat - Run
run_wrapper.bat - Be happy.
NOTE: You will need to run the wrapper every time you want to use your controller in DInput, but you only need to run the calibration tool once for each controller you have that has a different make and model.
v2.0
2.0 - The Generic HID Framework Update
.json profile files will not work with this version. You must run the calibration tool (calibrate.bat) to re-calibrate and profile your devices.
This release fundamentally transforms the wrapper from a hardcoded controller fixer into a robust, generic, profile-driven HID translation framework. I swapped out the legacy pywinusb backend for Cython's hidapi, implementing high-frequency daemon polling and a completely metadata-driven decoder layer. This allows the tool to support virtually any generic HID controller.
Additionally, this release introduces experimental rumble support, a robust automated diagnostics suite, a new GUI theme, advanced analog deadzones/curves, macros/chords, and multiple bug fixes.
🎮 Highlighted User-Facing Changes
- Circularity Calibration: Correct and enforce a perfect circular output for analog sticks directly inside the Tuning tab.
- The tool aims for the lowest circularity error possible, makes sure there is no undershoot (< 0.98), and tend to overshoot to make sure that the device will always hit maximum output (1.0).
- Foolproof Calibration Wizard: Re-engineered step-by-step CLI tool featuring a "Magic Filter" to filter out sensor noise/drift.
- Chords & Macros Studio: Record gamepad macro sequences and map them to keyboard/mouse outputs.
- Shift Layer Upgrades: Configurable alternate layouts mapped via a modifier key, which now adapts dynamically to your controller profile.
- Tuning Tab Expansion: Fine-tune analog triggers with deadzone sliders and configure digital trigger fallback toggles.
- Automated Diagnostic Suite: A 6-step testing pipeline that outputs
issue_report.zipautomatically for quick troubleshooting. - Smooth UI Transitions: Canvas-based rotating loading spinner, transition fades, and community quotes.
⚙️ Under-the-Hood & Architecture Changes
- Cython
hidapiBackend: Migrated frompywinusbto bypass Windows aggressive descriptor truncations, exposing all HID data channels. - Composite Device Merging: Polls multiple interfaces concurrently to support controllers that split telemetry across separate USB endpoints.
- Background Polling Daemon: Swapped event callbacks for a high-performance background daemon loop.
- Metadata-Driven Parser: Decoupled joystick/button evaluation using profile JSON schemas, including support for 16-bit values, bit shifts, masks, and inversions.
- Python 3.13 / 3.14 Enforcement: Strict environment warnings at startup to ensure compatibility.
- GUI Lagginess Fix: Applied performance enhancements to eliminate GUI delay.
- Silent Boot Argument: Supports launching the daemon silently with the
--bootargument for system startup integration.
Check CHANGELOG.md for details and featurelist.md for the complete feature list.
How to use:
- Install all dependencies listed in the README.md file.
- Unzip it anywhere you want.
- Run
pip install -r requirements.txtin CMD or PowerShell. - Run
calibrate.bat - Run
run_wrapper.bat - Be happy.
NOTE: You will need to run the wrapper every time you want to use your controller in DInput, but you only need to run the calibration tool once for each controller you have that has a different make and model.
v1.0
1.0 Release
Check CHANGELOG.md for details and featurelist.md for the complete feature list.
How to use:
- Install all dependencies listed in the README.md file.
- Unzip it anywhere you want.
- Run
pip install -r requirements.txtin CMD or PowerShell. - Run
calibrate.bat - Run
run_wrapper.bat - Be happy.
NOTE: You will need to run the wrapper every time you want to use your controller in DInput, but you only need to run the calibration tool once for each controller you have that has a different make and model.