Handheld Companion – Release Notes
0.30.0.1 - Controller Overhaul, Fan Override and Docking Awareness
Version 0.30.0.1 is a significant release. The biggest change under the hood is the replacement of ViGEm with VIIPER for virtual controller emulation, a move that resolves a whole class of resume, slot, and input loss issues that have been difficult to fully eliminate until now. Beyond that, Legion Go 2 owners finally get complete fan speed control thanks to remarkable work from Undervoltologist and Rodpad, experimental HID support lands for ONEXPLAYER X1 and APEX thanks to srsholmes efforts.
With Microsoft rolling out docking improvements to handheld devices, we've mimicked two new features that give HC users direct control over display switching and controller connection behavior when docking. Finally, this build ships one of the largest single-build fix lists.
Highlights
- ViGEm replaced by VIIPER The deprecated ViGEm library has been replaced with VIIPER for virtual controller emulation. In addition to broader controller type support: Xbox 360, DualShock 4, DualSense, Steam Controller, and Steam Deck. VIIPER eliminates the need to suspend and resume the virtual controller on system sleep, prevents the redundant power-cycling that was causing XInput slot 0 recovery issues, and should put an end to the input loss problems some users were experiencing with running games after resume.
- Legion Go 2: full fan control Fan speed control is now fully overridable on the Legion Go 2 through direct EC access, even when an OEM power profile would otherwise override it. If the Legion Go 2's fan behavior has been frustrating you, this is the fix.
- Experimental ONEXPLAYER X1 and APEX support A HID driver backport adds initial device support for the ONEXPLAYER X1 and APEX. This is experimental — feedback from owners of these devices is especially welcome.
- Docking and controller connection behavior gives you direct control over two related behaviors. DockedDisplayBehavior lets you define what happens to your main screen when docking: do nothing, switch to the external display, or switch only when on power. PlugBehavior lets you define whether a newly plugged external controller should be hooked automatically, always prompt you, or do nothing.
What Changed
Device support
- Legion Go 2: Backported total control over fan speed through EC, even on OEM power profiles from https://github.com/Rodpad/LeGo2-Fan-Control/.
- ONEXPLAYER X1 and APEX: Backported HID driver from srsholmes/onexplayer-apex-bazzite-fixes#8 (experimental).
New features
- Replaced deprecated ViGEm with VIIPER for controller emulation: bringing support over virtual XBOX360, DualShock4, DualSense, Steam Controller, Steam Deck while removing the need for the virtual controller to suspend/resume with system, preventing redundant controller power-cycling to recover XInput slot 0 and inputs loss issue with running games/softwares.
- Implemented a new setting DockedDisplayBehavior (#534): Define whether the main screen should switch to the external display when docking: Do nothing, switch to external display, switch to external display when plugged to power.
- Implemented a new setting PlugBehavior: Define whether the recently plugged external controller should be hooked: Do nothing, always ask, always connect.
- Implemented gamecontrollerdb update management (notification/download/install) from the settings page.
- Implemented button to axis mapping on layout page to allow traditional controllers to mimic Steam controller and Steam deck controller touchpads and touchpad-based dpad behaviors.
- Implemented controller-based update rate to accommodate virtual controllers without timestamps (Steam controller and Steam deck controller requiring a static 250Hz rate).
UI/UX
- Simplified sensor selection UI elements.
- Overlay page to use MVVM and SettingsCard(s).
- Reduce CPU/UI pressure from power profile fan graph.
- Improve Layout items clarity with toggle/repeat and shift logic visible from layout page.
- Removed hacky WM_PAINT hook logic in favor of ShadowAssist.UseBitmapCache.
- Previous button and axis mappings will no-longer be removed when unsupported by newly targeted controller and will instead appear disabled on layout page.
Fixes
- Fixed an issue preventing the application from locating/restoring any currently running instance when trying to start HC.
- Fixed an issue preventing KeyboardActions and MouseActions from using both Turbo and Toggle at the same time.
- Fixed several issues with installer script when reading dependencies versions causing uninstall/reinstall loops on disconnected (no internet) systems.
- Fixed an issue causing a crash when trying to read some UWP processes "ProductName".
- Fixed an issue with gyro related settings when manipulated from the quick profile page.
- Fixed a couple of issues when displaying foreground process/profile on quick profile page.
- Fixed an issue when pulling MicrosoftStore/App logo from Manifest file.
- Fixed an issue with layout Trigger shift logic.
- Fixed a rare crash scenario when closing a process.
- Fixed an issue causing incorrect UI focus when a ContentDialog is closed.
- Fixed an issue preventing controller update rate settings from being applied while app is running.
- Fixed an issue that would cause GPU Manager to still interact with AMD settings when GPU management is turned off.
Miscellaneous
- Defaulted gamepad mode to Auto instead of Gamepad.
- Misc performance improvements to layout UI render logic with artwork load/unload and bitmapscalingmode (LowQuality).
- Misc UI tweaks related to gamepad mode hotkey.
- Updated process filter (restricted) list to exclude: pickerhost.exe, gamingservicesui.exe.
- Updated SDL3 to 3.4.8.
- Added a new Layout template for SteamController (DPAD to left touchpad, right stick to right touchpad).
- Keep controller routing active at Windows login but gate keyboard input capture on session lock state, and defer HC main window display until the interactive desktop is available.
Full Changelog: 0.29.3.0...0.30.1.0