Skip to content

feat: Add 5-profile controller system with Auto mode#1361

Open
CasperH2O wants to merge 39 commits intoValkirie:mainfrom
peytoncedotal6-art:Controller-Profiles
Open

feat: Add 5-profile controller system with Auto mode#1361
CasperH2O wants to merge 39 commits intoValkirie:mainfrom
peytoncedotal6-art:Controller-Profiles

Conversation

@CasperH2O
Copy link
Copy Markdown
Collaborator

@CasperH2O CasperH2O commented Jan 7, 2026

  • Added 5 controller profiles: Native, Xbox 360, DualShock 4, Desktop, Auto
  • Auto mode switches between two configurable profiles based on app focus
  • Implemented hotkey cycling through all 5 profiles
  • Added Auto Profile on Startup setting
  • Updated ControllerPage UI with expandable Auto mode configuration
  • All settings persist across application restarts

Technical changes:

  • Added ControllerProfile enum to SettingsManager
  • Updated LayoutManager, ControllerManager, VirtualManager for new profiles
  • Modified HIDModeCommands and DesktopLayoutCommands for profile cycling
  • Added HIDmode.None to HIDUtils enum
  • Added resource strings for new UI elements

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced Controller Profile selector with five options: Native, Xbox 360, DualShock 4, Desktop, and Auto modes
    • Added Auto Mode configuration section with customizable profiles
    • Added option to automatically enable Auto profile on startup
  • UI Enhancements

    • Redesigned Controller settings page with new profile management controls
    • Extended HID mode selector with new None option

✏️ Tip: You can customize this high-level summary in your review settings.

Valkirie and others added 30 commits May 22, 2025 17:54
* (WIP) AOKZOEA1X

* Implement PipsPager for QuickApplication page

* Update Nefarius.Drivers.HidHide (3.0.0-pre001)

* always write 64 byte commands for claw

hhd-dev/hhd@b6abbd1

* improve ROG Ally byte padding

* Fix HID instabilities when waking up from sleep

* Tentatively improve Claw1 Rumble experience

* wip

* misc

* misc

* build 0.24.2.0

* update Nefarius.Drivers.HidHide to 3.0.0

* musc improvements to Claw1 rumble

* Fixed an issue causing a crash when trying to access a closed HID device

* Fixed an issue causing a crash when opening QT before a foreground process was discovered

* build 0.24.2.1

* Improve process reading on system resume

* (tentative) implement claw firmware 0x163, 0x166 support

* oups

* add Claw 8 versions (0x211, 0x217)

todo: switch to major/minor version logic

* build 0.24.2.2

* Improve device open logic

* misc

* misc fixes

* build 0.24.2.3

* implement ManagerFactory Suspend() and Resume()

* misc

* Add manager SuspendWithOS logic

* build 0.25.0.0

* Fix UpdateManager and implement auto-check every 10 minutes

* misc
* (WIP) AOKZOEA1X

* Implement PipsPager for QuickApplication page

* Update Nefarius.Drivers.HidHide (3.0.0-pre001)

* always write 64 byte commands for claw

hhd-dev/hhd@b6abbd1

* improve ROG Ally byte padding

* Fix HID instabilities when waking up from sleep

* Tentatively improve Claw1 Rumble experience

* wip

* misc

* misc

* build 0.24.2.0

* update Nefarius.Drivers.HidHide to 3.0.0

* musc improvements to Claw1 rumble

* Fixed an issue causing a crash when trying to access a closed HID device

* Fixed an issue causing a crash when opening QT before a foreground process was discovered

* build 0.24.2.1

* Improve process reading on system resume

* (tentative) implement claw firmware 0x163, 0x166 support

* oups

* add Claw 8 versions (0x211, 0x217)

todo: switch to major/minor version logic

* build 0.24.2.2

* Improve device open logic

* misc

* misc fixes

* build 0.24.2.3

* implement ManagerFactory Suspend() and Resume()

* misc

* Add manager SuspendWithOS logic

* build 0.25.0.0

* Fix UpdateManager and implement auto-check every 10 minutes

* misc

* WIP

* more work

* Fixed audio slider rounding logic

* Disable joystick UI navigation (buttons and dpad only)

* more work

* chore(i18n): Improve translate

* chore(i18n): Improve translate

* feat(Managers): Handle unsupported GPU

* fix(OSD): Some settings never load.

* chore(i18n): Improve translate

* fix(Managers): An error message will never be logged.

* Update README.md

* more work

* More work

* more work

* more work

Fix SDL_GamepadAdded and SDL_GamepadRemoved

* Fix PickTargetController()

* Fix PnPDetails retrieval logic on SDL controllers

* Fix PickTargetController()

* more work

* misc

* more work

* rollback

* More work

- Implement gamecontrollerdb
- Restored DInput

* more work

* Fix StylusLogic error

* net9.0

* More work on devices

* more work

* more work

* AYANEO Kun : Update KeyboardChords from new EC

* add MuteConsole setting

* Add Core Isolation setting during installation

* more work

* Disable Steam Controller and Steam Deck support from SDL3 until implementation is better

* add PresentationCore

* Improve SDL controller management

- Support Scan logic
- Prevent HID events from capturing SDL controllers

* Fixed a crash caused by parallel collection modification

* Fixed a crash caused by an empty window name from GamepadFocusManager GotFocus

* Fixed known UI issues

- Display controller page rescan loading bar
- Fixed QuickProfiles subprofile combobox MaxWidth

* Improve Hotkey page

* Implement GuideCommands

* Dispose and restore MasterTimer on suspend/resume

* Fixed an issue causing a crash when trying to Marshal an XInputController into a SDLController

* code cleanup

* Update ClawA1M so we peak the nearest firmware not the exact one

* state if firmware is supported or not

* Add ClawA1M Firmware support: 0x167

* prevent infinite controller management loop

* Improve DeviceManager robustness

- DeviceRemoved events should never be raised before DeviceAdded

* Improve ControllerManager logic

* Update IGCL to v247

* misc

* Update libs

* Fix ControllerManagement

* prevent crash on cast error

* Fix notifications page stackpanel orientation to Vertical

* Implement new setting GPUManagerMonitor (default: off)

* Remove ugly SpinWait.SpinUntil

* MSI Claw : set_long_limit to 35W (WMI)

* Feature: Add Intel Endurance Gaming to Power profile options

Give the user the option to control and configure Intel's Endurance Gaming in both Profile and Quick Menu.

By default "Super Batter Saver" turns on Endurance Gaming with "Efficiency, which reduces the frame rate to 30 fps.

This gives the user granular control the power saving of Inte's tuning based on FPS.

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Fix build errors due to ambiguous SystemInformation

LibreHardwareMonitor have the same class name as Windows Forms

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Only show Intel Endurance Gaming options to MSI Claw

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Simplify EnduranceGaming Profile properties

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Few fixes from code Rabbit

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Visual improvements

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Fixes and clean up

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Implement IGCL with EnduranceGaming support (WIP)

* Move endurance gaming to GPUManager

* remove debug/tests

* Add missing events management

* Implement IntelGPU UpdateTimer_Elapsed

* no icon on settingscard within settingsexpander

* Intel GPU: Wait until IntelGraphicsSoftwareService is ready

* Fix merge error

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Simplify Power mode UI (WIP)

* more work

* simplify logic

* Misc UI improvement

Controller page progressbar

* Misc UI improvement

Fixed an issue where clicking on a control within SettingsCard (when IsClickable) would trigger the SettingsCard click.

* Misc UI improvement

Fix MainWindow Glyph ForegroundProperty

* Update IGCL_Wrapper.dll

* update SDL3-CS lib

* Increase maximum overlay timer to 2000ms

The bigger the interval, the lower the CPU usage.

* Make "No localization for enum" LogDebug

* Fix Enum following our transition to SDL for a few controllers

- DualSense
- DualShock4
- Nintendo Switch Pro
- MSI Claw (DInput)

* Implement new controller setting: ConnectOnPlug

* Better ConnectOnPlug logic

* PowerProfileManager: profiles is now ConcurrentDictionary

* Fixed an issue causing a crash when trying to read dummy controller

* MSI Claw: Misc timing edits

* Update for new LGO firmware

* misc

* more work

* improve hid detection

leverage usage and usagepage as listed by hhd (https://github.com/hhd-dev/hhd/blob/master/src/hhd/device/claw/base.py)

* more work

* misc

* misc

* more work

* fallback implementation to Legion Go S

* Update SDL to 3.2.18

- Fixed replacing existing gamepad mappings at runtime
- Improved thumbstick range for Nintendo Switch Pro Controllers
- Fixed loading user calibration for Nintendo Switch Pro Controllers
- Added support for the ZEROPLUS P4 Wired Gamepad
- Fixed input from the MayFlash GameCube adapter with version 7 firmware

* remove lock logic

* remove dumb check

* Update PromptFont and use proper controller glyph on controller page

* (tentative) get rid of Sapientia wherever we can

* more work

* misc

* misc

* Force enable GPUManagerMonitor and temporarily disable the setting until we figure out a proper implementation

* misc

* tentative to hide the LGO DInput devices

* misc

* Recursively scroll through IController child devices to hide or unhide them

This should be useful for controllers that are both XInput and DInput

* build 0.26.0.0

* Fix ClawA1M DInput usagePage value

* Update SecretKeys.cs

* Add support over Claw A8 BZ2EM

* code cleanup

* Improve IController GetLocalizedName()

* Add missing enums (Enum_Xbox360Controller_XXX)

* Implement fPPT (Claw A8)

iDataBlockIndex: 82

* misc

* Update Claw devices nTDP and cTDP values

* build 0.26.0.2

* Implement proper Legion Go S support (tentative)

* more work

* more work

* more work

* more work

* more work

* clean up

* misc fix

* misc

* misc

* fix back button idx ?

* fix accelero/gyro range

* misc

* Early work

* misc

* Fixed an issue preventing silenced key chords from being caught during hotkey listening

* more work

* more work

* add illustration

* Fix byte position

* more work

* oups

* Fixed Legion Go S support

* misc

* more work

* more work

Migrated wheel logic to controller and added extra buttons and glyphs

* Implement Zotac Gaming Zone Fan control

* Implement WMI methods

* WIP implement SetVRamSize

* add proper physicalInstalledRamGB reading

* more work

* Bounds SetLedBrightness() to BrightnessID

* More work

* revert hidhide foreach in IDevice

* more work

* more work

* more work

* misc fix

* Fix LED logic (both position and RGB decoding)

* why not

* improve RGB logic

* Fix settings

* Implement ZotacLauncherWatcher()

* Sorted gyro/accel axis

* (tentative) improve wheel filtering

* Remove most of the hardcoded logic

* misc

* misc fixes

* Add GamingZone default power profiles

* Update libraries

* code cleanup

* Fix UI navigation

* build 0.26.1.0

* Misc PR (Valkirie#455)

New Features

Added support for Zotac Gaming Zone devices, including a new VRAM configuration option in device settings.
Introduced controller swap functionality for Lenovo Legion Go devices, with corresponding UI controls and localization.
Added a property to indicate manufacturer platform support in device settings.
Improvements

Refined device settings UI to display panels specific to MSI Claw, Lenovo Legion Go, and Zotac Gaming Zone.
Enhanced splash screen with an animated progress indicator.
Updated controller input handling for improved consistency and mapping support.
Localization

Added new resource strings and placeholders for controller swap and VRAM settings in multiple languages.
Bug Fixes

Improved handling of device-specific settings and toggles to ensure correct UI behavior and device interaction.

* Add missing setting: LegionControllerSwap

* build 0.26.2.0

* Fixed an issue with UIGamepad focus logic when HC is starting

---------

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>
Co-authored-by: Sanheiii <35133371+Sanheiii@users.noreply.github.com>
Co-authored-by: Bassem Mohsen <bassem.nomany@gmail.com>
…#1281)

* Refactor Overlay rendering logic to strategy design pattern

* Fix ai comments

* Add widget system with factory

* Fix some AI comments

* Add level selection for overlay widgets.
Refactor strategies (use widgets.

* Fix level for cpu widget in full overlay strategy
* misc

* WIP

* more work

* Fixed audio slider rounding logic

* Disable joystick UI navigation (buttons and dpad only)

* more work

* chore(i18n): Improve translate

* chore(i18n): Improve translate

* feat(Managers): Handle unsupported GPU

* fix(OSD): Some settings never load.

* chore(i18n): Improve translate

* fix(Managers): An error message will never be logged.

* Update README.md

* more work

* More work

* more work

* more work

Fix SDL_GamepadAdded and SDL_GamepadRemoved

* Fix PickTargetController()

* Fix PnPDetails retrieval logic on SDL controllers

* Fix PickTargetController()

* more work

* misc

* more work

* rollback

* More work

- Implement gamecontrollerdb
- Restored DInput

* more work

* Fix StylusLogic error

* net9.0

* More work on devices

* more work

* more work

* AYANEO Kun : Update KeyboardChords from new EC

* add MuteConsole setting

* Add Core Isolation setting during installation

* more work

* Disable Steam Controller and Steam Deck support from SDL3 until implementation is better

* add PresentationCore

* Improve SDL controller management

- Support Scan logic
- Prevent HID events from capturing SDL controllers

* Fixed a crash caused by parallel collection modification

* Fixed a crash caused by an empty window name from GamepadFocusManager GotFocus

* Fixed known UI issues

- Display controller page rescan loading bar
- Fixed QuickProfiles subprofile combobox MaxWidth

* Improve Hotkey page

* Implement GuideCommands

* Dispose and restore MasterTimer on suspend/resume

* Fixed an issue causing a crash when trying to Marshal an XInputController into a SDLController

* code cleanup

* Update ClawA1M so we peak the nearest firmware not the exact one

* state if firmware is supported or not

* Add ClawA1M Firmware support: 0x167

* prevent infinite controller management loop

* Improve DeviceManager robustness

- DeviceRemoved events should never be raised before DeviceAdded

* Improve ControllerManager logic

* Update IGCL to v247

* misc

* Update libs

* Fix ControllerManagement

* prevent crash on cast error

* Fix notifications page stackpanel orientation to Vertical

* Implement new setting GPUManagerMonitor (default: off)

* Remove ugly SpinWait.SpinUntil

* MSI Claw : set_long_limit to 35W (WMI)

* Feature: Add Intel Endurance Gaming to Power profile options

Give the user the option to control and configure Intel's Endurance Gaming in both Profile and Quick Menu.

By default "Super Batter Saver" turns on Endurance Gaming with "Efficiency, which reduces the frame rate to 30 fps.

This gives the user granular control the power saving of Inte's tuning based on FPS.

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Fix build errors due to ambiguous SystemInformation

LibreHardwareMonitor have the same class name as Windows Forms

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Only show Intel Endurance Gaming options to MSI Claw

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Simplify EnduranceGaming Profile properties

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Few fixes from code Rabbit

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Visual improvements

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Fixes and clean up

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Implement IGCL with EnduranceGaming support (WIP)

* Move endurance gaming to GPUManager

* remove debug/tests

* Add missing events management

* Implement IntelGPU UpdateTimer_Elapsed

* no icon on settingscard within settingsexpander

* Intel GPU: Wait until IntelGraphicsSoftwareService is ready

* Fix merge error

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Simplify Power mode UI (WIP)

* more work

* simplify logic

* Misc UI improvement

Controller page progressbar

* Misc UI improvement

Fixed an issue where clicking on a control within SettingsCard (when IsClickable) would trigger the SettingsCard click.

* Misc UI improvement

Fix MainWindow Glyph ForegroundProperty

* Update IGCL_Wrapper.dll

* update SDL3-CS lib

* Increase maximum overlay timer to 2000ms

The bigger the interval, the lower the CPU usage.

* Make "No localization for enum" LogDebug

* Fix Enum following our transition to SDL for a few controllers

- DualSense
- DualShock4
- Nintendo Switch Pro
- MSI Claw (DInput)

* Implement new controller setting: ConnectOnPlug

* Better ConnectOnPlug logic

* PowerProfileManager: profiles is now ConcurrentDictionary

* Fixed an issue causing a crash when trying to read dummy controller

* MSI Claw: Misc timing edits

* Update for new LGO firmware

* misc

* more work

* improve hid detection

leverage usage and usagepage as listed by hhd (https://github.com/hhd-dev/hhd/blob/master/src/hhd/device/claw/base.py)

* more work

* misc

* misc

* more work

* fallback implementation to Legion Go S

* Update SDL to 3.2.18

- Fixed replacing existing gamepad mappings at runtime
- Improved thumbstick range for Nintendo Switch Pro Controllers
- Fixed loading user calibration for Nintendo Switch Pro Controllers
- Added support for the ZEROPLUS P4 Wired Gamepad
- Fixed input from the MayFlash GameCube adapter with version 7 firmware

* remove lock logic

* remove dumb check

* Update PromptFont and use proper controller glyph on controller page

* (tentative) get rid of Sapientia wherever we can

* more work

* misc

* misc

* Force enable GPUManagerMonitor and temporarily disable the setting until we figure out a proper implementation

* misc

* tentative to hide the LGO DInput devices

* misc

* Recursively scroll through IController child devices to hide or unhide them

This should be useful for controllers that are both XInput and DInput

* build 0.26.0.0

* Fix ClawA1M DInput usagePage value

* Update SecretKeys.cs

* Add support over Claw A8 BZ2EM

* code cleanup

* Improve IController GetLocalizedName()

* Add missing enums (Enum_Xbox360Controller_XXX)

* Implement fPPT (Claw A8)

iDataBlockIndex: 82

* misc

* Update Claw devices nTDP and cTDP values

* build 0.26.0.2

* Implement proper Legion Go S support (tentative)

* more work

* more work

* more work

* more work

* more work

* clean up

* misc fix

* misc

* misc

* fix back button idx ?

* fix accelero/gyro range

* misc

* Early work

* misc

* Fixed an issue preventing silenced key chords from being caught during hotkey listening

* more work

* more work

* add illustration

* Fix byte position

* more work

* oups

* Fixed Legion Go S support

* misc

* more work

* more work

Migrated wheel logic to controller and added extra buttons and glyphs

* Implement Zotac Gaming Zone Fan control

* Implement WMI methods

* WIP implement SetVRamSize

* add proper physicalInstalledRamGB reading

* more work

* Bounds SetLedBrightness() to BrightnessID

* More work

* revert hidhide foreach in IDevice

* more work

* more work

* more work

* misc fix

* Fix LED logic (both position and RGB decoding)

* why not

* improve RGB logic

* Fix settings

* Implement ZotacLauncherWatcher()

* Sorted gyro/accel axis

* (tentative) improve wheel filtering

* Remove most of the hardcoded logic

* misc

* misc fixes

* Add GamingZone default power profiles

* Update libraries

* code cleanup

* Fix UI navigation

* build 0.26.1.0

* Misc PR (Valkirie#455)

New Features

Added support for Zotac Gaming Zone devices, including a new VRAM configuration option in device settings.
Introduced controller swap functionality for Lenovo Legion Go devices, with corresponding UI controls and localization.
Added a property to indicate manufacturer platform support in device settings.
Improvements

Refined device settings UI to display panels specific to MSI Claw, Lenovo Legion Go, and Zotac Gaming Zone.
Enhanced splash screen with an animated progress indicator.
Updated controller input handling for improved consistency and mapping support.
Localization

Added new resource strings and placeholders for controller swap and VRAM settings in multiple languages.
Bug Fixes

Improved handling of device-specific settings and toggles to ensure correct UI behavior and device interaction.

* Add missing setting: LegionControllerSwap

* build 0.26.2.0

* Fixed an issue with UIGamepad focus logic when HC is starting

* Improve LibraryPage tiles layout

* misc cleanup

* Improve executable startup

- Implemented DelegateCommand with parameter(s)
- Allow user to pick Run/RunAs to start executable from profile page

* Improve IManager AddStatus and RemoveStatus

* misc

* Don't create process if you can't listen for events

* Async inputs updated (Valkirie#456)

* Improve ControllerManagement event logic

I was dumb and thought RaisingAnEvent?.Invoke() would simultaneously raise event across all listeners and have their tasks to run in parallel. I was wrong...

* better

* Improve LibraryManager (Valkirie#457)

- Support both IGDB and SteamGrid researches in parallel.
- Todo: Add checkboxes

* Async layout updated (Valkirie#458)

* Implement async LayoutUpdated event

* Implement EventHelper.RaiseAsync()

* misc improvement to controller management

* Implement GameLib (Valkirie#460)

* Make PlatformManager async and start implementing GameLib

* prevent useless power profile updates

* misc

* misc

* implement more platforms

* more work

* Add LaunchString support over StartProcessCommand

* more work

* Add profile page field: LaunchString

* improve ProfileViewModel navigation

* misc

* filter a few executables

* Update SDL3 to 3.2.20

https://github.com/libsdl-org/SDL/releases/tag/release-3.2.20

* Update LibreHardwareMonitorLib

* Update gamecontrollerdb.txt

* Implement Quick Profiles button (Edit layout)

* Implement Quicktools position: BottomCenter

* UI work

* misc

* Improve Scan Library UI with DropDownButton

* Fix process detection on QuickApplicationPage

* Improve overall QuickProfiles UI experience

Add two new buttons: Button_OpenProfilePage, Button_OpenProfileLayout

* Misc UI improvements

* Fix QT Margins

* Improve FanProfile logic

* More work on fan (both UI and backoffice)

* Improve page loading logic

* Improve Quicktools Width under several scenarios

* Misc

* Add QT animation logic

* Fix Icons

* Add FanTable restore logic to LegionGo

* Restore PL1/PL2 logic and fix values for Lunar-Lake based devices

* Update PowerProfileManager.cs

* Proper Intel MicroArchitecture detection

* hacky fix for MSI Claw gamepad

* build 0.27.0.0

* Fix: Default Power profile reset when device restart

* Fix PL1/PL2 errors

- PL2 shouldn't be inferior to PL1
- PL2 should be equal or PL1+1 (Lunar Lake)

* Fix: Open layout page in Quicktool not going to the game page (go to default profile page)

* Fix: Blank spaces on QuickHome hotkeys

* more work

* Fix: QuickToolsSlideAnimation

* more work

* prevent critical processes from being listed on Quick applications

* Filter games related executables with error in filename

* Improve MSI Claw Fan Mapping

* build 0.27.0.1

* Update README.md

* Misc UI Fix

* Fix Claw A2VM Performance PL2

* Improve profile management (Valkirie#461)

* Improve profile management

* Fix: Crash on corrupted user.config

* Improve MSI Claw controller robustness

* Cleanup

* delete previous profile file on profile name changes

* build 0.27.0.2

* You can now pass initial directory to CommonFileDialog()

* Fix race condition

* Filter library apps on: uninst

* improve profile management (store path)

* Fix Quicktools style

* Add new QT settings: Apply noise to window's background

* build 0.27.0.3

* Refactor Overlay rendering logic to strategy design pattern (Valkirie#1281)

* Refactor Overlay rendering logic to strategy design pattern

* Fix ai comments

* Add widget system with factory

* Fix some AI comments

* Add level selection for overlay widgets.
Refactor strategies (use widgets.

* Fix level for cpu widget in full overlay strategy

* cleanup

* Fixed: crash when managing corrupted profiles

* Improve profile sanitizer

* Fix RTSS status check

* Fixed: Incorrect IsMapped boolean check on ControllerManager Tick()

* build 0.27.0.4

* Improve process detection within StartProcessCommand

* Dramatically cuts GC pressure and CPU (Valkirie#462)

* Dramatically cuts GC pressure and CPU

* Fix TriggerActions shiftSlot logic

* build 0.27.0.5

* Misc fix

* Add missing dynamic lighting capacities to MSI Claw

* build 0.27.0.6

---------

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>
Co-authored-by: Sanheiii <35133371+Sanheiii@users.noreply.github.com>
Co-authored-by: Bassem Mohsen <bassem.nomany@gmail.com>
Co-authored-by: Kvintilyanov Aleksandr <mops1k@users.noreply.github.com>
- Compiling issues
- Borked controller management
- OEM TDP method on AMD CPUs
* Visual improvements

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Fixes and clean up

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Implement IGCL with EnduranceGaming support (WIP)

* Move endurance gaming to GPUManager

* remove debug/tests

* Add missing events management

* Implement IntelGPU UpdateTimer_Elapsed

* no icon on settingscard within settingsexpander

* Intel GPU: Wait until IntelGraphicsSoftwareService is ready

* Fix merge error

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>

* Simplify Power mode UI (WIP)

* more work

* simplify logic

* Misc UI improvement

Controller page progressbar

* Misc UI improvement

Fixed an issue where clicking on a control within SettingsCard (when IsClickable) would trigger the SettingsCard click.

* Misc UI improvement

Fix MainWindow Glyph ForegroundProperty

* Update IGCL_Wrapper.dll

* update SDL3-CS lib

* Increase maximum overlay timer to 2000ms

The bigger the interval, the lower the CPU usage.

* Make "No localization for enum" LogDebug

* Fix Enum following our transition to SDL for a few controllers

- DualSense
- DualShock4
- Nintendo Switch Pro
- MSI Claw (DInput)

* Implement new controller setting: ConnectOnPlug

* Better ConnectOnPlug logic

* PowerProfileManager: profiles is now ConcurrentDictionary

* Fixed an issue causing a crash when trying to read dummy controller

* MSI Claw: Misc timing edits

* Update for new LGO firmware

* misc

* more work

* improve hid detection

leverage usage and usagepage as listed by hhd (https://github.com/hhd-dev/hhd/blob/master/src/hhd/device/claw/base.py)

* more work

* misc

* misc

* more work

* fallback implementation to Legion Go S

* Update SDL to 3.2.18

- Fixed replacing existing gamepad mappings at runtime
- Improved thumbstick range for Nintendo Switch Pro Controllers
- Fixed loading user calibration for Nintendo Switch Pro Controllers
- Added support for the ZEROPLUS P4 Wired Gamepad
- Fixed input from the MayFlash GameCube adapter with version 7 firmware

* remove lock logic

* remove dumb check

* Update PromptFont and use proper controller glyph on controller page

* (tentative) get rid of Sapientia wherever we can

* more work

* misc

* misc

* Force enable GPUManagerMonitor and temporarily disable the setting until we figure out a proper implementation

* misc

* tentative to hide the LGO DInput devices

* misc

* Recursively scroll through IController child devices to hide or unhide them

This should be useful for controllers that are both XInput and DInput

* build 0.26.0.0

* Fix ClawA1M DInput usagePage value

* Update SecretKeys.cs

* Add support over Claw A8 BZ2EM

* code cleanup

* Improve IController GetLocalizedName()

* Add missing enums (Enum_Xbox360Controller_XXX)

* Implement fPPT (Claw A8)

iDataBlockIndex: 82

* misc

* Update Claw devices nTDP and cTDP values

* build 0.26.0.2

* Implement proper Legion Go S support (tentative)

* more work

* more work

* more work

* more work

* more work

* clean up

* misc fix

* misc

* misc

* fix back button idx ?

* fix accelero/gyro range

* misc

* Early work

* misc

* Fixed an issue preventing silenced key chords from being caught during hotkey listening

* more work

* more work

* add illustration

* Fix byte position

* more work

* oups

* Fixed Legion Go S support

* misc

* more work

* more work

Migrated wheel logic to controller and added extra buttons and glyphs

* Implement Zotac Gaming Zone Fan control

* Implement WMI methods

* WIP implement SetVRamSize

* add proper physicalInstalledRamGB reading

* more work

* Bounds SetLedBrightness() to BrightnessID

* More work

* revert hidhide foreach in IDevice

* more work

* more work

* more work

* misc fix

* Fix LED logic (both position and RGB decoding)

* why not

* improve RGB logic

* Fix settings

* Implement ZotacLauncherWatcher()

* Sorted gyro/accel axis

* (tentative) improve wheel filtering

* Remove most of the hardcoded logic

* misc

* misc fixes

* Add GamingZone default power profiles

* Update libraries

* code cleanup

* Fix UI navigation

* build 0.26.1.0

* Misc PR (Valkirie#455)

New Features

Added support for Zotac Gaming Zone devices, including a new VRAM configuration option in device settings.
Introduced controller swap functionality for Lenovo Legion Go devices, with corresponding UI controls and localization.
Added a property to indicate manufacturer platform support in device settings.
Improvements

Refined device settings UI to display panels specific to MSI Claw, Lenovo Legion Go, and Zotac Gaming Zone.
Enhanced splash screen with an animated progress indicator.
Updated controller input handling for improved consistency and mapping support.
Localization

Added new resource strings and placeholders for controller swap and VRAM settings in multiple languages.
Bug Fixes

Improved handling of device-specific settings and toggles to ensure correct UI behavior and device interaction.

* Add missing setting: LegionControllerSwap

* build 0.26.2.0

* Fixed an issue with UIGamepad focus logic when HC is starting

* Improve LibraryPage tiles layout

* misc cleanup

* Improve executable startup

- Implemented DelegateCommand with parameter(s)
- Allow user to pick Run/RunAs to start executable from profile page

* Improve IManager AddStatus and RemoveStatus

* misc

* Don't create process if you can't listen for events

* Async inputs updated (Valkirie#456)

* Improve ControllerManagement event logic

I was dumb and thought RaisingAnEvent?.Invoke() would simultaneously raise event across all listeners and have their tasks to run in parallel. I was wrong...

* better

* Improve LibraryManager (Valkirie#457)

- Support both IGDB and SteamGrid researches in parallel.
- Todo: Add checkboxes

* Async layout updated (Valkirie#458)

* Implement async LayoutUpdated event

* Implement EventHelper.RaiseAsync()

* misc improvement to controller management

* Implement GameLib (Valkirie#460)

* Make PlatformManager async and start implementing GameLib

* prevent useless power profile updates

* misc

* misc

* implement more platforms

* more work

* Add LaunchString support over StartProcessCommand

* more work

* Add profile page field: LaunchString

* improve ProfileViewModel navigation

* misc

* filter a few executables

* Update SDL3 to 3.2.20

https://github.com/libsdl-org/SDL/releases/tag/release-3.2.20

* Update LibreHardwareMonitorLib

* Update gamecontrollerdb.txt

* Implement Quick Profiles button (Edit layout)

* Implement Quicktools position: BottomCenter

* UI work

* misc

* Improve Scan Library UI with DropDownButton

* Fix process detection on QuickApplicationPage

* Improve overall QuickProfiles UI experience

Add two new buttons: Button_OpenProfilePage, Button_OpenProfileLayout

* Misc UI improvements

* Fix QT Margins

* Improve FanProfile logic

* More work on fan (both UI and backoffice)

* Improve page loading logic

* Improve Quicktools Width under several scenarios

* Misc

* Add QT animation logic

* Fix Icons

* Add FanTable restore logic to LegionGo

* Restore PL1/PL2 logic and fix values for Lunar-Lake based devices

* Update PowerProfileManager.cs

* Proper Intel MicroArchitecture detection

* hacky fix for MSI Claw gamepad

* build 0.27.0.0

* Fix: Default Power profile reset when device restart

* Fix PL1/PL2 errors

- PL2 shouldn't be inferior to PL1
- PL2 should be equal or PL1+1 (Lunar Lake)

* Fix: Open layout page in Quicktool not going to the game page (go to default profile page)

* Fix: Blank spaces on QuickHome hotkeys

* more work

* Fix: QuickToolsSlideAnimation

* more work

* prevent critical processes from being listed on Quick applications

* Filter games related executables with error in filename

* Improve MSI Claw Fan Mapping

* build 0.27.0.1

* Update README.md

* Misc UI Fix

* Fix Claw A2VM Performance PL2

* Improve profile management (Valkirie#461)

* Improve profile management

* Fix: Crash on corrupted user.config

* Improve MSI Claw controller robustness

* Cleanup

* delete previous profile file on profile name changes

* build 0.27.0.2

* You can now pass initial directory to CommonFileDialog()

* Fix race condition

* Filter library apps on: uninst

* improve profile management (store path)

* Fix Quicktools style

* Add new QT settings: Apply noise to window's background

* build 0.27.0.3

* Refactor Overlay rendering logic to strategy design pattern (Valkirie#1281)

* Refactor Overlay rendering logic to strategy design pattern

* Fix ai comments

* Add widget system with factory

* Fix some AI comments

* Add level selection for overlay widgets.
Refactor strategies (use widgets.

* Fix level for cpu widget in full overlay strategy

* cleanup

* Fixed: crash when managing corrupted profiles

* Improve profile sanitizer

* Fix RTSS status check

* Fixed: Incorrect IsMapped boolean check on ControllerManager Tick()

* build 0.27.0.4

* Improve process detection within StartProcessCommand

* Dramatically cuts GC pressure and CPU (Valkirie#462)

* Dramatically cuts GC pressure and CPU

* Fix TriggerActions shiftSlot logic

* build 0.27.0.5

* Misc fix

* Add missing dynamic lighting capacities to MSI Claw

* build 0.27.0.6

* Implement EADesktop support through GameLib (Valkirie#463)

* Implement EADesktop support through GameLib

Using custom repo: https://github.com/Valkirie/GameLib.NET/tree/EAapp

* Fix EADesktop logo missing from LibraryPage

* Ambilight: Reduce CPU consumption (Valkirie#464)

* Reduce CPU usage, phase 1

* misc tweaks

* build 0.27.0.7

* Extended expected delay before profile related executable is ready

* Improve library manager SteamGrid lookup with cleaned string

* Optimizing IActions related functions (Valkirie#465)

* Optimizing IActions related functions

* Pass delta to IActions to improve timed actions accuracy

* seal a few classes

* Use [MethodImpl(MethodImplOptions.AggressiveInlining)] on States

* Small State tweaks

* further improve States optimization

* build 0.27.0.8

* Reduce MSI Claw 1 rumble logic CPU usage

* Improved: Set device OEM buttons as Inherit on new profiles

* Improved: UI Navigation

- Quicktools will remember the last focused item from each page
- Quicktools navigation won't focus AppBarButton first
- Quicktools L1/R1 will automatically enter the page
- MainWindow page flow is more natural when pressing A/B

* Implement controller page related support section

* Fixed: version checking from profiles manager on older profile

* Fixed: GameBarCommands and DesktopCommands

* Improved: ROG Ally PerformanceMode and AsusFan.Mid

* Hacky: Fixed: Phantom controller filtering

* build 0.27.0.9

* Add Inherits for AllButtons and AllAxisLayoutFlags

* Update Quicktools Home and Applications UI

* Force (re)apply Quicktools transparency when changing postion

* Update libs

* oups

* Fixed: Issue when discovering non-Steam games with multiple executables

* Fixed: SDL XInput controller ignored

* Fixed: Issues when trying to trigger hotkeys

* Fixed: UI Issue when navigating into a page without IsEnabled controls

* Improved: QuickHome, QuickApplications UI

* build 0.27.0.10

* States fixes

* Improved: Removed hacky controller manager await in benefits of more robust device manager arrival logic

* Improved: Device management has new queuing logic

* Improved: Quicktools L1/R1 will now circle within menu items

* Filter SDL Events

* Fixed: Restore default fan profile when fan mode is set to Hardware

* Migrate some platform logic to PlatformManager

We should move the PlatformToProfile logic to LibraryManager or PlatformManager

* Fix Claw FanSpeed array

* Implemented: new commands ButtonCommands replacing GuideCommands

* Improve Action Type UI experience

* Fixed: Button to TriggerActions

* Improved: ButtonMapping and AxisMapping migrated to SettingsExpander and SettingsCard

* Improved: GyroMapping and TriggerMapping migrated to SettingsExpander and SettingsCard

* Improved: MouseAction Acceleration is now relying on action delta (ms) to compute velocity memory

* Misc UI tweaks

* build 0.27.0.11

* Misc UI improvements

* Fixed: OEM buttons will now properly inherit default behavior

* misc

* misc

* Fixed: Input/Hotkey injection on dummy controllers

* Revert: Improved: Device management has new queuing logic

* Fixed: Rog Ally Xbox Adaptive Controller support

* Improved: Allow users to edit default power profiles

* Edit a few default settings

* build 0.27.0.12

* Improve overall fan management and ROG Ally TDP (Valkirie#466)

* (Tentative) Fix TDP/Fan issues

* Misc: migrate powerProfile management to IDevice

* update lib

* Improved: Controller management

* Implemented: Per-device hotkeys (Valkirie#467)

* Improved: Controller management

* Improved: Per-device hotkeys

* build 0.27.0.13

* Fixed: Profile update when resolution or refresh rate is changed

* Misc (Valkirie#468)

* Tentative fix buttons RGB control

* Fixed: Hotkey deserialization with old ButtonFlags

* code cleanup

* Fixed: missing library: YamlDotNet

* Fixed: hotkey duplication

* Updated LibreHardwareMonitorLib

* Fixed: Zotac Gaming Zone VRAM control

* Fixed: LegionR/LegionL inverted buttons on Legion Go S

* build 0.27.0.14

* Improve session and device management (Valkirie#469)

* Improved: HC won't wait until session is ready anymore, except for keyboard input management

* Fixed: Device management asynchronous refresh

* Fixed: Device management asynchronous refresh

* oups

* Revert "Fixed: Profile update when resolution or refresh rate is changed"

This reverts commit 0fa4512.

* only update if necessary

* Update SDL3.dll

* Device support: Add ONEXPLAYER X1 AMD (weird ProductName: ONEXPLAYER X1z)

* Improved: Installation script to add WinRing0x64.sys and HandheldCompanion.sys to defender exclusion list

* build 0.28.0.0

* Update libraries

* Force refresh platform catalog when scanning

* Update LibreHardwareMonitorLib

---------

Signed-off-by: Bassem Mohsen <bassem.nomany@gmail.com>
Co-authored-by: Bassem Mohsen <bassem.nomany@gmail.com>
Co-authored-by: Kvintilyanov Aleksandr <mops1k@users.noreply.github.com>
)

* Refactor Overlay rendering logic to strategy design pattern

* Fix ai comments

* Add widget system with factory

* Fix some AI comments

* Add level selection for overlay widgets.
Refactor strategies (use widgets.

* Fix level for cpu widget in full overlay strategy

* - change battery left to hours and minutes format

* - add format for hours

* - fix after merge from `main`

* - little refactoring

* - add hours format

* - add return if null time left

* good to go

---------

Co-authored-by: Lesueur Benjamin <benjamin.lesueur@live.com>
* Implement fPPT (Claw A8)

iDataBlockIndex: 82

* misc

* Update Claw devices nTDP and cTDP values

* build 0.26.0.2

* Implement proper Legion Go S support (tentative)

* more work

* more work

* more work

* more work

* more work

* clean up

* misc fix

* misc

* misc

* fix back button idx ?

* fix accelero/gyro range

* misc

* Early work

* misc

* Fixed an issue preventing silenced key chords from being caught during hotkey listening

* more work

* more work

* add illustration

* Fix byte position

* more work

* oups

* Fixed Legion Go S support

* misc

* more work

* more work

Migrated wheel logic to controller and added extra buttons and glyphs

* Implement Zotac Gaming Zone Fan control

* Implement WMI methods

* WIP implement SetVRamSize

* add proper physicalInstalledRamGB reading

* more work

* Bounds SetLedBrightness() to BrightnessID

* More work

* revert hidhide foreach in IDevice

* more work

* more work

* more work

* misc fix

* Fix LED logic (both position and RGB decoding)

* why not

* improve RGB logic

* Fix settings

* Implement ZotacLauncherWatcher()

* Sorted gyro/accel axis

* (tentative) improve wheel filtering

* Remove most of the hardcoded logic

* misc

* misc fixes

* Add GamingZone default power profiles

* Update libraries

* code cleanup

* Fix UI navigation

* build 0.26.1.0

* Misc PR (Valkirie#455)

New Features

Added support for Zotac Gaming Zone devices, including a new VRAM configuration option in device settings.
Introduced controller swap functionality for Lenovo Legion Go devices, with corresponding UI controls and localization.
Added a property to indicate manufacturer platform support in device settings.
Improvements

Refined device settings UI to display panels specific to MSI Claw, Lenovo Legion Go, and Zotac Gaming Zone.
Enhanced splash screen with an animated progress indicator.
Updated controller input handling for improved consistency and mapping support.
Localization

Added new resource strings and placeholders for controller swap and VRAM settings in multiple languages.
Bug Fixes

Improved handling of device-specific settings and toggles to ensure correct UI behavior and device interaction.

* Add missing setting: LegionControllerSwap

* build 0.26.2.0

* Fixed an issue with UIGamepad focus logic when HC is starting

* Improve LibraryPage tiles layout

* misc cleanup

* Improve executable startup

- Implemented DelegateCommand with parameter(s)
- Allow user to pick Run/RunAs to start executable from profile page

* Improve IManager AddStatus and RemoveStatus

* misc

* Don't create process if you can't listen for events

* Async inputs updated (Valkirie#456)

* Improve ControllerManagement event logic

I was dumb and thought RaisingAnEvent?.Invoke() would simultaneously raise event across all listeners and have their tasks to run in parallel. I was wrong...

* better

* Improve LibraryManager (Valkirie#457)

- Support both IGDB and SteamGrid researches in parallel.
- Todo: Add checkboxes

* Async layout updated (Valkirie#458)

* Implement async LayoutUpdated event

* Implement EventHelper.RaiseAsync()

* misc improvement to controller management

* Implement GameLib (Valkirie#460)

* Make PlatformManager async and start implementing GameLib

* prevent useless power profile updates

* misc

* misc

* implement more platforms

* more work

* Add LaunchString support over StartProcessCommand

* more work

* Add profile page field: LaunchString

* improve ProfileViewModel navigation

* misc

* filter a few executables

* Update SDL3 to 3.2.20

https://github.com/libsdl-org/SDL/releases/tag/release-3.2.20

* Update LibreHardwareMonitorLib

* Update gamecontrollerdb.txt

* Implement Quick Profiles button (Edit layout)

* Implement Quicktools position: BottomCenter

* UI work

* misc

* Improve Scan Library UI with DropDownButton

* Fix process detection on QuickApplicationPage

* Improve overall QuickProfiles UI experience

Add two new buttons: Button_OpenProfilePage, Button_OpenProfileLayout

* Misc UI improvements

* Fix QT Margins

* Improve FanProfile logic

* More work on fan (both UI and backoffice)

* Improve page loading logic

* Improve Quicktools Width under several scenarios

* Misc

* Add QT animation logic

* Fix Icons

* Add FanTable restore logic to LegionGo

* Restore PL1/PL2 logic and fix values for Lunar-Lake based devices

* Update PowerProfileManager.cs

* Proper Intel MicroArchitecture detection

* hacky fix for MSI Claw gamepad

* build 0.27.0.0

* Fix: Default Power profile reset when device restart

* Fix PL1/PL2 errors

- PL2 shouldn't be inferior to PL1
- PL2 should be equal or PL1+1 (Lunar Lake)

* Fix: Open layout page in Quicktool not going to the game page (go to default profile page)

* Fix: Blank spaces on QuickHome hotkeys

* more work

* Fix: QuickToolsSlideAnimation

* more work

* prevent critical processes from being listed on Quick applications

* Filter games related executables with error in filename

* Improve MSI Claw Fan Mapping

* build 0.27.0.1

* Update README.md

* Misc UI Fix

* Fix Claw A2VM Performance PL2

* Improve profile management (Valkirie#461)

* Improve profile management

* Fix: Crash on corrupted user.config

* Improve MSI Claw controller robustness

* Cleanup

* delete previous profile file on profile name changes

* build 0.27.0.2

* You can now pass initial directory to CommonFileDialog()

* Fix race condition

* Filter library apps on: uninst

* improve profile management (store path)

* Fix Quicktools style

* Add new QT settings: Apply noise to window's background

* build 0.27.0.3

* Refactor Overlay rendering logic to strategy design pattern (Valkirie#1281)

* Refactor Overlay rendering logic to strategy design pattern

* Fix ai comments

* Add widget system with factory

* Fix some AI comments

* Add level selection for overlay widgets.
Refactor strategies (use widgets.

* Fix level for cpu widget in full overlay strategy

* cleanup

* Fixed: crash when managing corrupted profiles

* Improve profile sanitizer

* Fix RTSS status check

* Fixed: Incorrect IsMapped boolean check on ControllerManager Tick()

* build 0.27.0.4

* Improve process detection within StartProcessCommand

* Dramatically cuts GC pressure and CPU (Valkirie#462)

* Dramatically cuts GC pressure and CPU

* Fix TriggerActions shiftSlot logic

* build 0.27.0.5

* Misc fix

* Add missing dynamic lighting capacities to MSI Claw

* build 0.27.0.6

* Implement EADesktop support through GameLib (Valkirie#463)

* Implement EADesktop support through GameLib

Using custom repo: https://github.com/Valkirie/GameLib.NET/tree/EAapp

* Fix EADesktop logo missing from LibraryPage

* Ambilight: Reduce CPU consumption (Valkirie#464)

* Reduce CPU usage, phase 1

* misc tweaks

* build 0.27.0.7

* Extended expected delay before profile related executable is ready

* Improve library manager SteamGrid lookup with cleaned string

* Optimizing IActions related functions (Valkirie#465)

* Optimizing IActions related functions

* Pass delta to IActions to improve timed actions accuracy

* seal a few classes

* Use [MethodImpl(MethodImplOptions.AggressiveInlining)] on States

* Small State tweaks

* further improve States optimization

* build 0.27.0.8

* Reduce MSI Claw 1 rumble logic CPU usage

* Improved: Set device OEM buttons as Inherit on new profiles

* Improved: UI Navigation

- Quicktools will remember the last focused item from each page
- Quicktools navigation won't focus AppBarButton first
- Quicktools L1/R1 will automatically enter the page
- MainWindow page flow is more natural when pressing A/B

* Implement controller page related support section

* Fixed: version checking from profiles manager on older profile

* Fixed: GameBarCommands and DesktopCommands

* Improved: ROG Ally PerformanceMode and AsusFan.Mid

* Hacky: Fixed: Phantom controller filtering

* build 0.27.0.9

* Add Inherits for AllButtons and AllAxisLayoutFlags

* Update Quicktools Home and Applications UI

* Force (re)apply Quicktools transparency when changing postion

* Update libs

* oups

* Fixed: Issue when discovering non-Steam games with multiple executables

* Fixed: SDL XInput controller ignored

* Fixed: Issues when trying to trigger hotkeys

* Fixed: UI Issue when navigating into a page without IsEnabled controls

* Improved: QuickHome, QuickApplications UI

* build 0.27.0.10

* States fixes

* Improved: Removed hacky controller manager await in benefits of more robust device manager arrival logic

* Improved: Device management has new queuing logic

* Improved: Quicktools L1/R1 will now circle within menu items

* Filter SDL Events

* Fixed: Restore default fan profile when fan mode is set to Hardware

* Migrate some platform logic to PlatformManager

We should move the PlatformToProfile logic to LibraryManager or PlatformManager

* Fix Claw FanSpeed array

* Implemented: new commands ButtonCommands replacing GuideCommands

* Improve Action Type UI experience

* Fixed: Button to TriggerActions

* Improved: ButtonMapping and AxisMapping migrated to SettingsExpander and SettingsCard

* Improved: GyroMapping and TriggerMapping migrated to SettingsExpander and SettingsCard

* Improved: MouseAction Acceleration is now relying on action delta (ms) to compute velocity memory

* Misc UI tweaks

* build 0.27.0.11

* Misc UI improvements

* Fixed: OEM buttons will now properly inherit default behavior

* misc

* misc

* Fixed: Input/Hotkey injection on dummy controllers

* Revert: Improved: Device management has new queuing logic

* Fixed: Rog Ally Xbox Adaptive Controller support

* Improved: Allow users to edit default power profiles

* Edit a few default settings

* build 0.27.0.12

* Improve overall fan management and ROG Ally TDP (Valkirie#466)

* (Tentative) Fix TDP/Fan issues

* Misc: migrate powerProfile management to IDevice

* update lib

* Improved: Controller management

* Implemented: Per-device hotkeys (Valkirie#467)

* Improved: Controller management

* Improved: Per-device hotkeys

* build 0.27.0.13

* Fixed: Profile update when resolution or refresh rate is changed

* Misc (Valkirie#468)

* Tentative fix buttons RGB control

* Fixed: Hotkey deserialization with old ButtonFlags

* code cleanup

* Fixed: missing library: YamlDotNet

* Fixed: hotkey duplication

* Updated LibreHardwareMonitorLib

* Fixed: Zotac Gaming Zone VRAM control

* Fixed: LegionR/LegionL inverted buttons on Legion Go S

* build 0.27.0.14

* Improve session and device management (Valkirie#469)

* Improved: HC won't wait until session is ready anymore, except for keyboard input management

* Fixed: Device management asynchronous refresh

* Fixed: Device management asynchronous refresh

* oups

* Revert "Fixed: Profile update when resolution or refresh rate is changed"

This reverts commit 0fa4512.

* only update if necessary

* Update SDL3.dll

* Device support: Add ONEXPLAYER X1 AMD (weird ProductName: ONEXPLAYER X1z)

* Improved: Installation script to add WinRing0x64.sys and HandheldCompanion.sys to defender exclusion list

* build 0.28.0.0

* Update libraries

* Force refresh platform catalog when scanning

* Update LibreHardwareMonitorLib

* RyzenAdj 0.18.0

- Update for ryzen_smu 0.1.7
- Support: Strix Point
- Support: Dragon Range
- Support: Fire Range
- Support: HX370 (Pro)
- Support: Krackan Point

* Fixed: UI not rendering after GPU acceleration is toggled on/off

not perfect..

* DClawController to use GenericController instead of raw HidDevice

* build 0.28.0.1

* Reduce CPU usage (Valkirie#470)

* Reduce cpu usage on DInputController

* Reduce CPU usage from HidLibrary

* Reduce CPU usage a pressure on ThreadPool with RaiseInputsUpdatedAsync

* Reduce CPU usage from RadioMonitor

* Update OverlayModel.xaml

* build 0.28.0.2

* Update Resources.fr-FR.resx

Traduction par: Moi952

* Improved: UI freeze workaround

* build 0.28.0.3

* Update libs

* Improve controller management

- Properly unhide (with power cycling) if HIDuncloakonclose is set
- Wait until any rumble is complete before power cycling

* ForceRecompose windows on system resume

* Add PawnIO support for LibreHardware 0.9.5

- Fixes CPU power/temperature reading

* build 0.28.0.4

* Fixed: Keyboard chord hotkey trigger on SDL-based controllers

* Improved: CPU usage on LibreHardwareLibrary

* Fixed: Setting a profile favorite subprofile

* Improved: ProfilesPage shows saved windows settings alongside live

* Revert "Fixed: Keyboard chord hotkey trigger on SDL-based controllers"

This reverts commit d0a9483.

* Improved: SDL controllers will use Tick() logic rather than inputs pumping

* Fixed: MainWindow visibility on Task View when minimized

* Updated: LibreHardwareMonitorLib

* build 0.28.0.5

* Misc

* Improved: Window State/Visibility logic

* Misc

* Improved: UIGamepad navigation with HyperlinkButton

* Implemented: New controller setting: HIDuncloakondisconnect

* Fixed: MSI Claw 10F BIOS support

* Resolve startup crash and refactor joystick input (Valkirie#472)

* fix(app): Crash caused by Logger not being loaded in the App constructor.

* chore(i18n): Improve translate

* refactor(Input): Implement angle-based logic for joystick directions

* refactor(Input): Rename MotionDirection to DeflectionDirection

* Implement faster/better resume from sleep (Valkirie#473)

* Tentative: speed up resume

* build 0.28.0.6

* Migrate settings to ProgramData

* Improve task manager to speed startup

* Revert "Improve task manager to speed startup"

This reverts commit c5b93cf5d36eea4ee243b729fe0a1385a0558a19.

* misc

* build 0.28.0.7

* Use LocalApplicationData

* improve resume

* Fix KeyboardChord.GetChord

* (tentative) force recompose on system resume

* misc

* wait for user to reply on settings before going further, also use Windows 11 theme

* Misc UI improvements

* misc

* misc

* More work on settings migration

* Update HotkeysManager.cs

* Update App.xaml.cs

* misc fix

* misc

* misc

* Fix AsusACPI on system resume

* Tentative: Fix stalled UI on system resume

* (tentative) fix UI not rendering on resume

* (tentative) fix UI not rendering on resume

* build 0.28.0.8

* Prevent bottom buttons from getting focus

* Implemented: New options for Layout Mapping : Trigger to Button

- Turbo, Interruptable, Toggle

* (tentative) figure detect S3/S4 sleep states resume

* restore arbitrary sleep/resume delay from long sleep

* Fix IActions variable naming and usage (HasXXX)

* Fixed: Device illustration on about page

* Fix

* Fixed: SDL trigger to L/RSoft L/RFull

* Misc fixes

* Device Support: Legion Go 2 (Valkirie#459)

* WIP

* Misc

* More work

* Fixed: Controller picking logic on plug/unplug

* Fixed: Translation causing notify icon (task tray) buttons to fail when translated

* Improved: Legion Go (1, 2) performance mode TDP (25W)

* Fixed: Legion Go 2, internal gyro/accelero angles reading

* Fixed: Controller picker

* Fixed: Crash on ProcessRenderMode

* Update SDL3: 3.2.24

https://github.com/libsdl-org/SDL/releases/tag/release-3.2.24

* Fixed: AYANEO FLIP DS 1S CEcControl_SetSecDispBrightness()

* Misc

- Migrate dump crashes to {localappdata}\CrashDumps
- Create zip backup when migrating {mydocuments}\HandheldCompanion

* Prevent the application from starting while we wait for user input

* Fixed: Misc crash/exceptions

* Fixed: Support over legacy IActions

* Fixed: AYANEO Flip DS 2nd screen ON/OFF toggle

* Improved: MultimediaManager GetDisplayFriendlyName()

* build 0.28.1.0

* Device support: AYANEOFlip1SDS

* build 0.28.1.1

* Misc fixes

* Remove WinRing0 (Valkirie#475)

* Remove WinRing0

* Fixed: Issue with IGDB background download

* Misc

* build 0.28.2.0

* Use LpcIO instead of LpcPort

* Update OpenLibSys.cs

* tentative

* tentative

* tentative

* tentative

Use LpcIO instead of LpcPort

Update OpenLibSys.cs

tentative

tentative

* Revert "tentative"

This reverts commit 3ce974aa7fb369b851cfbc3f9dfbdc98c226c635.

* tentative

* misc

* more work

* tentative

* more work

* Fixes

* oups

* oups

* Fix iss

* Update LibreHardwareMonitorLib.dll

* build 0.28.1.2 (Valkirie#476)

- Restored WinRing0 for TDP manipulation (until we find an alternative based on PawnIO)

* Restore missing WinRing0 force unload

* Fixed: Toast hanging

* Fixed: UI hanging on startup (WHY !?)

* Fixed: Prevent GPUmanger from holding onto DeviceManager while waiting for MultimediaManager to be ready

* Improved: Offset non-UI tasks away from UI thread

* build 0.28.1.3

* Fixed: UIHelper default DispatcherPriority

* Fixed: Add missing WinRing0x64.dll

* Fixed: Prevent failed processor initialization from crippling HC startup sequence

* build 0.28.1.4

---------

Co-authored-by: Kvintilyanov Aleksandr <mops1k@users.noreply.github.com>
Co-authored-by: Sanheiii <35133371+Sanheiii@users.noreply.github.com>
* code cleanup

* Fix UI navigation

* build 0.26.1.0

* Misc PR (Valkirie#455)

New Features

Added support for Zotac Gaming Zone devices, including a new VRAM configuration option in device settings.
Introduced controller swap functionality for Lenovo Legion Go devices, with corresponding UI controls and localization.
Added a property to indicate manufacturer platform support in device settings.
Improvements

Refined device settings UI to display panels specific to MSI Claw, Lenovo Legion Go, and Zotac Gaming Zone.
Enhanced splash screen with an animated progress indicator.
Updated controller input handling for improved consistency and mapping support.
Localization

Added new resource strings and placeholders for controller swap and VRAM settings in multiple languages.
Bug Fixes

Improved handling of device-specific settings and toggles to ensure correct UI behavior and device interaction.

* Add missing setting: LegionControllerSwap

* build 0.26.2.0

* Fixed an issue with UIGamepad focus logic when HC is starting

* Improve LibraryPage tiles layout

* misc cleanup

* Improve executable startup

- Implemented DelegateCommand with parameter(s)
- Allow user to pick Run/RunAs to start executable from profile page

* Improve IManager AddStatus and RemoveStatus

* misc

* Don't create process if you can't listen for events

* Async inputs updated (Valkirie#456)

* Improve ControllerManagement event logic

I was dumb and thought RaisingAnEvent?.Invoke() would simultaneously raise event across all listeners and have their tasks to run in parallel. I was wrong...

* better

* Improve LibraryManager (Valkirie#457)

- Support both IGDB and SteamGrid researches in parallel.
- Todo: Add checkboxes

* Async layout updated (Valkirie#458)

* Implement async LayoutUpdated event

* Implement EventHelper.RaiseAsync()

* misc improvement to controller management

* Implement GameLib (Valkirie#460)

* Make PlatformManager async and start implementing GameLib

* prevent useless power profile updates

* misc

* misc

* implement more platforms

* more work

* Add LaunchString support over StartProcessCommand

* more work

* Add profile page field: LaunchString

* improve ProfileViewModel navigation

* misc

* filter a few executables

* Update SDL3 to 3.2.20

https://github.com/libsdl-org/SDL/releases/tag/release-3.2.20

* Update LibreHardwareMonitorLib

* Update gamecontrollerdb.txt

* Implement Quick Profiles button (Edit layout)

* Implement Quicktools position: BottomCenter

* UI work

* misc

* Improve Scan Library UI with DropDownButton

* Fix process detection on QuickApplicationPage

* Improve overall QuickProfiles UI experience

Add two new buttons: Button_OpenProfilePage, Button_OpenProfileLayout

* Misc UI improvements

* Fix QT Margins

* Improve FanProfile logic

* More work on fan (both UI and backoffice)

* Improve page loading logic

* Improve Quicktools Width under several scenarios

* Misc

* Add QT animation logic

* Fix Icons

* Add FanTable restore logic to LegionGo

* Restore PL1/PL2 logic and fix values for Lunar-Lake based devices

* Update PowerProfileManager.cs

* Proper Intel MicroArchitecture detection

* hacky fix for MSI Claw gamepad

* build 0.27.0.0

* Fix: Default Power profile reset when device restart

* Fix PL1/PL2 errors

- PL2 shouldn't be inferior to PL1
- PL2 should be equal or PL1+1 (Lunar Lake)

* Fix: Open layout page in Quicktool not going to the game page (go to default profile page)

* Fix: Blank spaces on QuickHome hotkeys

* more work

* Fix: QuickToolsSlideAnimation

* more work

* prevent critical processes from being listed on Quick applications

* Filter games related executables with error in filename

* Improve MSI Claw Fan Mapping

* build 0.27.0.1

* Update README.md

* Misc UI Fix

* Fix Claw A2VM Performance PL2

* Improve profile management (Valkirie#461)

* Improve profile management

* Fix: Crash on corrupted user.config

* Improve MSI Claw controller robustness

* Cleanup

* delete previous profile file on profile name changes

* build 0.27.0.2

* You can now pass initial directory to CommonFileDialog()

* Fix race condition

* Filter library apps on: uninst

* improve profile management (store path)

* Fix Quicktools style

* Add new QT settings: Apply noise to window's background

* build 0.27.0.3

* Refactor Overlay rendering logic to strategy design pattern (Valkirie#1281)

* Refactor Overlay rendering logic to strategy design pattern

* Fix ai comments

* Add widget system with factory

* Fix some AI comments

* Add level selection for overlay widgets.
Refactor strategies (use widgets.

* Fix level for cpu widget in full overlay strategy

* cleanup

* Fixed: crash when managing corrupted profiles

* Improve profile sanitizer

* Fix RTSS status check

* Fixed: Incorrect IsMapped boolean check on ControllerManager Tick()

* build 0.27.0.4

* Improve process detection within StartProcessCommand

* Dramatically cuts GC pressure and CPU (Valkirie#462)

* Dramatically cuts GC pressure and CPU

* Fix TriggerActions shiftSlot logic

* build 0.27.0.5

* Misc fix

* Add missing dynamic lighting capacities to MSI Claw

* build 0.27.0.6

* Implement EADesktop support through GameLib (Valkirie#463)

* Implement EADesktop support through GameLib

Using custom repo: https://github.com/Valkirie/GameLib.NET/tree/EAapp

* Fix EADesktop logo missing from LibraryPage

* Ambilight: Reduce CPU consumption (Valkirie#464)

* Reduce CPU usage, phase 1

* misc tweaks

* build 0.27.0.7

* Extended expected delay before profile related executable is ready

* Improve library manager SteamGrid lookup with cleaned string

* Optimizing IActions related functions (Valkirie#465)

* Optimizing IActions related functions

* Pass delta to IActions to improve timed actions accuracy

* seal a few classes

* Use [MethodImpl(MethodImplOptions.AggressiveInlining)] on States

* Small State tweaks

* further improve States optimization

* build 0.27.0.8

* Reduce MSI Claw 1 rumble logic CPU usage

* Improved: Set device OEM buttons as Inherit on new profiles

* Improved: UI Navigation

- Quicktools will remember the last focused item from each page
- Quicktools navigation won't focus AppBarButton first
- Quicktools L1/R1 will automatically enter the page
- MainWindow page flow is more natural when pressing A/B

* Implement controller page related support section

* Fixed: version checking from profiles manager on older profile

* Fixed: GameBarCommands and DesktopCommands

* Improved: ROG Ally PerformanceMode and AsusFan.Mid

* Hacky: Fixed: Phantom controller filtering

* build 0.27.0.9

* Add Inherits for AllButtons and AllAxisLayoutFlags

* Update Quicktools Home and Applications UI

* Force (re)apply Quicktools transparency when changing postion

* Update libs

* oups

* Fixed: Issue when discovering non-Steam games with multiple executables

* Fixed: SDL XInput controller ignored

* Fixed: Issues when trying to trigger hotkeys

* Fixed: UI Issue when navigating into a page without IsEnabled controls

* Improved: QuickHome, QuickApplications UI

* build 0.27.0.10

* States fixes

* Improved: Removed hacky controller manager await in benefits of more robust device manager arrival logic

* Improved: Device management has new queuing logic

* Improved: Quicktools L1/R1 will now circle within menu items

* Filter SDL Events

* Fixed: Restore default fan profile when fan mode is set to Hardware

* Migrate some platform logic to PlatformManager

We should move the PlatformToProfile logic to LibraryManager or PlatformManager

* Fix Claw FanSpeed array

* Implemented: new commands ButtonCommands replacing GuideCommands

* Improve Action Type UI experience

* Fixed: Button to TriggerActions

* Improved: ButtonMapping and AxisMapping migrated to SettingsExpander and SettingsCard

* Improved: GyroMapping and TriggerMapping migrated to SettingsExpander and SettingsCard

* Improved: MouseAction Acceleration is now relying on action delta (ms) to compute velocity memory

* Misc UI tweaks

* build 0.27.0.11

* Misc UI improvements

* Fixed: OEM buttons will now properly inherit default behavior

* misc

* misc

* Fixed: Input/Hotkey injection on dummy controllers

* Revert: Improved: Device management has new queuing logic

* Fixed: Rog Ally Xbox Adaptive Controller support

* Improved: Allow users to edit default power profiles

* Edit a few default settings

* build 0.27.0.12

* Improve overall fan management and ROG Ally TDP (Valkirie#466)

* (Tentative) Fix TDP/Fan issues

* Misc: migrate powerProfile management to IDevice

* update lib

* Improved: Controller management

* Implemented: Per-device hotkeys (Valkirie#467)

* Improved: Controller management

* Improved: Per-device hotkeys

* build 0.27.0.13

* Fixed: Profile update when resolution or refresh rate is changed

* Misc (Valkirie#468)

* Tentative fix buttons RGB control

* Fixed: Hotkey deserialization with old ButtonFlags

* code cleanup

* Fixed: missing library: YamlDotNet

* Fixed: hotkey duplication

* Updated LibreHardwareMonitorLib

* Fixed: Zotac Gaming Zone VRAM control

* Fixed: LegionR/LegionL inverted buttons on Legion Go S

* build 0.27.0.14

* Improve session and device management (Valkirie#469)

* Improved: HC won't wait until session is ready anymore, except for keyboard input management

* Fixed: Device management asynchronous refresh

* Fixed: Device management asynchronous refresh

* oups

* Revert "Fixed: Profile update when resolution or refresh rate is changed"

This reverts commit 0fa4512.

* only update if necessary

* Update SDL3.dll

* Device support: Add ONEXPLAYER X1 AMD (weird ProductName: ONEXPLAYER X1z)

* Improved: Installation script to add WinRing0x64.sys and HandheldCompanion.sys to defender exclusion list

* build 0.28.0.0

* Update libraries

* Force refresh platform catalog when scanning

* Update LibreHardwareMonitorLib

* RyzenAdj 0.18.0

- Update for ryzen_smu 0.1.7
- Support: Strix Point
- Support: Dragon Range
- Support: Fire Range
- Support: HX370 (Pro)
- Support: Krackan Point

* Fixed: UI not rendering after GPU acceleration is toggled on/off

not perfect..

* DClawController to use GenericController instead of raw HidDevice

* build 0.28.0.1

* Reduce CPU usage (Valkirie#470)

* Reduce cpu usage on DInputController

* Reduce CPU usage from HidLibrary

* Reduce CPU usage a pressure on ThreadPool with RaiseInputsUpdatedAsync

* Reduce CPU usage from RadioMonitor

* Update OverlayModel.xaml

* build 0.28.0.2

* Update Resources.fr-FR.resx

Traduction par: Moi952

* Improved: UI freeze workaround

* build 0.28.0.3

* Update libs

* Improve controller management

- Properly unhide (with power cycling) if HIDuncloakonclose is set
- Wait until any rumble is complete before power cycling

* ForceRecompose windows on system resume

* Add PawnIO support for LibreHardware 0.9.5

- Fixes CPU power/temperature reading

* build 0.28.0.4

* Fixed: Keyboard chord hotkey trigger on SDL-based controllers

* Improved: CPU usage on LibreHardwareLibrary

* Fixed: Setting a profile favorite subprofile

* Improved: ProfilesPage shows saved windows settings alongside live

* Revert "Fixed: Keyboard chord hotkey trigger on SDL-based controllers"

This reverts commit d0a9483.

* Improved: SDL controllers will use Tick() logic rather than inputs pumping

* Fixed: MainWindow visibility on Task View when minimized

* Updated: LibreHardwareMonitorLib

* build 0.28.0.5

* Misc

* Improved: Window State/Visibility logic

* Misc

* Improved: UIGamepad navigation with HyperlinkButton

* Implemented: New controller setting: HIDuncloakondisconnect

* Fixed: MSI Claw 10F BIOS support

* Resolve startup crash and refactor joystick input (Valkirie#472)

* fix(app): Crash caused by Logger not being loaded in the App constructor.

* chore(i18n): Improve translate

* refactor(Input): Implement angle-based logic for joystick directions

* refactor(Input): Rename MotionDirection to DeflectionDirection

* Implement faster/better resume from sleep (Valkirie#473)

* Tentative: speed up resume

* build 0.28.0.6

* Migrate settings to ProgramData

* Improve task manager to speed startup

* Revert "Improve task manager to speed startup"

This reverts commit c5b93cf5d36eea4ee243b729fe0a1385a0558a19.

* misc

* build 0.28.0.7

* Use LocalApplicationData

* improve resume

* Fix KeyboardChord.GetChord

* (tentative) force recompose on system resume

* misc

* wait for user to reply on settings before going further, also use Windows 11 theme

* Misc UI improvements

* misc

* misc

* More work on settings migration

* Update HotkeysManager.cs

* Update App.xaml.cs

* misc fix

* misc

* misc

* Fix AsusACPI on system resume

* Tentative: Fix stalled UI on system resume

* (tentative) fix UI not rendering on resume

* (tentative) fix UI not rendering on resume

* build 0.28.0.8

* Prevent bottom buttons from getting focus

* Implemented: New options for Layout Mapping : Trigger to Button

- Turbo, Interruptable, Toggle

* (tentative) figure detect S3/S4 sleep states resume

* restore arbitrary sleep/resume delay from long sleep

* Fix IActions variable naming and usage (HasXXX)

* Fixed: Device illustration on about page

* Fix

* Fixed: SDL trigger to L/RSoft L/RFull

* Misc fixes

* Device Support: Legion Go 2 (Valkirie#459)

* WIP

* Misc

* More work

* Fixed: Controller picking logic on plug/unplug

* Fixed: Translation causing notify icon (task tray) buttons to fail when translated

* Improved: Legion Go (1, 2) performance mode TDP (25W)

* Fixed: Legion Go 2, internal gyro/accelero angles reading

* Fixed: Controller picker

* Fixed: Crash on ProcessRenderMode

* Update SDL3: 3.2.24

https://github.com/libsdl-org/SDL/releases/tag/release-3.2.24

* Fixed: AYANEO FLIP DS 1S CEcControl_SetSecDispBrightness()

* Misc

- Migrate dump crashes to {localappdata}\CrashDumps
- Create zip backup when migrating {mydocuments}\HandheldCompanion

* Prevent the application from starting while we wait for user input

* Fixed: Misc crash/exceptions

* Fixed: Support over legacy IActions

* Fixed: AYANEO Flip DS 2nd screen ON/OFF toggle

* Improved: MultimediaManager GetDisplayFriendlyName()

* build 0.28.1.0

* Device support: AYANEOFlip1SDS

* build 0.28.1.1

* Misc fixes

* Remove WinRing0 (Valkirie#475)

* Remove WinRing0

* Fixed: Issue with IGDB background download

* Misc

* build 0.28.2.0

* Use LpcIO instead of LpcPort

* Update OpenLibSys.cs

* tentative

* tentative

* tentative

* tentative

Use LpcIO instead of LpcPort

Update OpenLibSys.cs

tentative

tentative

* Revert "tentative"

This reverts commit 3ce974aa7fb369b851cfbc3f9dfbdc98c226c635.

* tentative

* misc

* more work

* tentative

* more work

* Fixes

* oups

* oups

* Fix iss

* Update LibreHardwareMonitorLib.dll

* build 0.28.1.2 (Valkirie#476)

- Restored WinRing0 for TDP manipulation (until we find an alternative based on PawnIO)

* Restore missing WinRing0 force unload

* Fixed: Toast hanging

* Fixed: UI hanging on startup (WHY !?)

* Fixed: Prevent GPUmanger from holding onto DeviceManager while waiting for MultimediaManager to be ready

* Improved: Offset non-UI tasks away from UI thread

* build 0.28.1.3

* Fixed: UIHelper default DispatcherPriority

* Fixed: Add missing WinRing0x64.dll

* Fixed: Prevent failed processor initialization from crippling HC startup sequence

* build 0.28.1.4

* Improved: Library UI with with Favorites profiles

* Fixed: Wrong profile name on overwrite warning (profiles page)

* Implement Msiapcfg (Valkirie#477)

* Tentatively add msiapcfg support

* Misc fixes

* build 0.28.1.5

* Improved UI: SteamGrid Logo parsing and LibraryFamily checkboxes

* Update libraries (build 0.28.1.6)

* Implemented: Support over Xbox Rog Ally (X/NonX) (Valkirie#478)

* Implemented: Xbox Rog Ally support (WIP)

* Fixed: Deploy default power profiles with default profile

Should have been done LONG AGO !!

* Fixed: MSI Claw (all models) max fan speed (150%)

* Update XboxROGAlly.cs

* Implemented: Add support over Xbox ROG Ally X/NonX

* Change battery overlay widget to better logic and display (Valkirie#1306)

* Refactor Overlay rendering logic to strategy design pattern

* Fix ai comments

* Add widget system with factory

* Fix some AI comments

* Add level selection for overlay widgets.
Refactor strategies (use widgets.

* Fix level for cpu widget in full overlay strategy

* - change battery left to hours and minutes format

* - add format for hours

* - fix after merge from `main`

* - little refactoring

* - add hours format

* - add return if null time left

* good to go

---------

Co-authored-by: Lesueur Benjamin <benjamin.lesueur@live.com>
(cherry picked from commit 283187b)

* Fixed: Battery reading without LibreHardwareMonitor (while we wait for a fix)

* build 0.28.1.7

* Fixed: Add missing UseOpenLib declarations

* Implemented: Task view function

* Improved: Task manager commands

* build 0.28.1.8

* Fixed: AYANEO Flip 1S DS/KB compatibility

* Move to Windows 11 SDK

Windows 10 is EOL as of October 14 2025

* Add default AYANEO power profiles (Extreme, Balanced, Saving power)

* Updated: Several libraries

* Fixed: Error on null processEx

* oups

* Fixed: Incorrect overwrite message displayed when creating a new profile

* Fixed: A crash occuring on OneXPlayerMini and OneXPlayerOneXFly devices

* Fixed: A rare crash happening on InputsManager

* Update LibreHardwareMonitorLib.dll

* UI: Improve LibraryPage image sizes

* Fixed: CPU usage from LibreHardware ADLX implementation (rely on ours instead)

* Library: Update SDL to 3.3.2

* build 0.28.1.9

* Revert "Library: Update SDL to 3.3.2"

This reverts commit 6353143.

* UI: Misc improvements

* Library: Updated SDL to 3.3.2

* UI: Added Power dropdown button to Quicktools (Lock, Sleep, Shutdown, Restart)

* Compatibility: Add Moonlight virtual controller detection and support

* Misc

* build 0.28.1.10

* Fixed: Prevent empty executable paths from being added to profile

* UI: SplashScreen no longer is AlwaysOnTop

* Library: Update HidHide, Sentry and LibreHardwareMonitor

* Fixed: Touchpad support on Legion Go (1/2)

* Fixed: OneX/AOKZOE OEM button support

* Implemented: New commands Copilot Voice

* Fixed: Joystick to button/keyboard/mouse click (axis threshold range)

* Library: Updated WindowsAPICodePack

* build 0.28.1.11

* Fixed: Crash caused by a race condition from VirtualManager when waking-up system

* UI: Improve toast manager (now has ability to generate clickable toasts)

* Improvements: CopilotVoiceCommands now also resize the Copilot window

* Fixed: CPU leak when HidDevice is torn off

* Fixed: Rare crash on null Controller

* Misc

* build 0.28.1.12

* Fixed: AYANEO Flip DS missing Close() override

* Misc

* Controller: Fixed Neptune Controller IsReady, IsConnected checks

* Implement .NET10 (Valkirie#479)

* (WIP) implement NET10 support

* Update install script

* Implement RyzenAdj set_coall()

* Fixed: Steam Deck GPU reading

* Update libraries to NET10: LibreHardware, ViGEm.Client

* Update Nefarius.ViGEm.Client.dll

* Device support: GPD Win 5 (WIP)

* Improved: Process manager will now ignore Taskbar and Shellhost

* Updated: Libraries

* build 0.28.2.1

* Improved: Process manager

ForegroundStaging and XamlExplorerHostIslandWindow are now Restricted

* Improved: Process manager

ApplicationManager_DesktopShellWindow is now Restricted

* build 0.28.2.2

* Library: Update iNKORE.UI.WPF.Modern

* Device support: Improve overall AOKZOE and ONEX compatibility (fixes OEM button usage and improve FAN/LED management) (Valkirie#480)

* Tentative: Fix OneX button lock

* Fixed: Several issues with OneX devices and IsOpen, IsReady checks as well ad HidDevice pickup on OneXFly

* Device support: OneXPlayer G1

* Improved overall ONEX/AOKZOE device support

backported some logic from HHD

---------

Co-authored-by: Kvintilyanov Aleksandr <mops1k@users.noreply.github.com>
Co-authored-by: Sanheiii <35133371+Sanheiii@users.noreply.github.com>
* Fix Valkirie#1234
If "group" == Both, explicitly apply to two sticks. Since the implemention doesn't support set both at once.

Fix charge bypass for CEc & CEii. Thanks to @BenjaminLSR

Clean up redundant configs in AYANEOAIRPlus.cs

* Update Inno Setup version to 6.6.1
Fix compilation errors
Valkirie and others added 9 commits December 15, 2025 15:54
…#1343)

Signed-off-by: Pedro Parra Ortega <pedro.parraortega@enreach.com>
…e#1347)

* fix: correct shared toggle state and support delayed actions

* Update HandheldCompanion/Actions/MouseActions.cs

ignore suggested actions

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* feat: correct shift logic and add support for shift combiantions

* fix: add backward compatibility
- Added 5 controller profiles: Native, Xbox 360, DualShock 4, Desktop, Auto
- Auto mode switches between two configurable profiles based on app focus
- Implemented hotkey cycling through all 5 profiles
- Added Auto Profile on Startup setting
- Updated ControllerPage UI with expandable Auto mode configuration
- All settings persist across application restarts

Technical changes:
- Added ControllerProfile enum to SettingsManager
- Updated LayoutManager, ControllerManager, VirtualManager for new profiles
- Modified HIDModeCommands and DesktopLayoutCommands for profile cycling
- Added HIDmode.None to HIDUtils enum
- Added resource strings for new UI elements
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 7, 2026

📝 Walkthrough

Walkthrough

The pull request introduces a controller profile system replacing layout mode handling. It adds a new ControllerProfile enum (Native, Xbox360, DualShock4, Desktop, Auto) integrated into settings and managers, renames HIDmode.NoController to HIDmode.None, updates UI controls for profile selection and auto-mode configuration, and refactors command and manager logic to apply profiles based on foreground process context.

Changes

Cohort / File(s) Summary
Controller Profile System
HandheldCompanion/Managers/SettingsManager.cs
Added public ControllerProfile enum (Native, Xbox360, DualShock4, Desktop, Auto) and three new settings properties (ControllerProfile, AutoModeProfile1, AutoModeProfile2); removed Gamepad from LayoutModes enum.
Settings Infrastructure
HandheldCompanion/Properties/Settings.Designer.cs, HandheldCompanion/Properties/Settings.settings
Added four new user-scoped settings properties with defaults: ControllerProfile (4), AutoModeProfile1 (0), AutoModeProfile2 (3), AutoProfileOnStart (false).
Localization & Resources
HandheldCompanion/Properties/Resources.resx
Added 12 new resource entries for UI labels: Enum_ControllerProfile_* variants, ControllerPage_ProfileMode*, ControllerPage_AutoModeSettings*, ControllerPage_AutoModeProfile*, Enum_HIDmode_None.
Command Handlers
HandheldCompanion/Commands/Functions/HC/DesktopLayoutCommands.cs, HandheldCompanion/Commands/Functions/HC/HIDModeCommands.cs
Replaced LayoutMode handling with ControllerProfile enum; updated Execute/Update logic to cycle through profiles; added event subscriptions for settings changes; suppressed toast in DesktopLayoutCommands.
Manager Integration
HandheldCompanion/Managers/ControllerManager.cs
Introduced DetermineHideState helper; integrated profile/layout-aware hide/unhide logic into SettingsManager change handlers; updated HIDmode.NoController references to HIDmode.None.
Layout Manager Enhancement
HandheldCompanion/Managers/LayoutManager.cs
Added controller profile tracking, auto-mode focus heuristics (CheckProfileLayout), and profile application logic; enhanced settings change handling for ControllerProfile and AutoModeProfile* settings.
HID Mode Enum Update
HandheldCompanion/Utils/HIDUtils.cs, HandheldCompanion/Targets/ViGEmTarget.cs, HandheldCompanion/Managers/VirtualManager.cs
Renamed HIDmode.NoController to HIDmode.None (value 0); shifted Xbox360Controller (→1) and DualShock4Controller (→2); updated all references across managers and targets.
Controller Settings UI
HandheldCompanion/Views/Pages/ControllerPage.xaml, HandheldCompanion/Views/Pages/ControllerPage.xaml.cs
Added ComboBox controls for ControllerProfile, AutoModeProfile1, and AutoModeProfile2 with SelectionChanged handlers; expanded HID mode options to include None; added AutoModeSettings SettingsExpander.
General Settings UI
HandheldCompanion/Views/Pages/SettingsPage.xaml, HandheldCompanion/Views/Pages/SettingsPage.xaml.cs
Added AutoProfileOnStart toggle switch with Toggled handler and settings propagation logic.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant UI as ControllerPage UI
    participant Handler as Event Handler
    participant SM as SettingsManager
    participant LM as LayoutManager
    participant CM as ControllerManager
    participant VM as VirtualManager

    User->>UI: Select Controller Profile
    UI->>Handler: cB_ControllerProfile_SelectionChanged
    Handler->>SM: SetProperty("ControllerProfile", value)
    SM->>SM: SettingValueChanged event
    
    SM->>LM: SettingsManager_SettingValueChanged("ControllerProfile")
    LM->>LM: ApplyControllerProfile(profile)
    LM->>LM: Configure per-profile settings
    
    SM->>CM: SettingsManager_SettingValueChanged("ControllerProfile")
    CM->>CM: DetermineHideState(profile, layoutMode)
    alt Should Hide Controller
        CM->>VM: Hide target controller
    else Should Show Controller
        CM->>VM: Unhide target controller
    end
    
    SM->>UI: SettingValueChanged event
    UI->>UI: Update SelectedIndex
    UI->>Handler: ControllerRefresh()
    Handler->>UI: Refresh UI state
    
    rect rgb(200, 220, 255)
    note over User,UI: Profile applied and UI synchronized
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~30 minutes

Possibly related PRs

  • PR #1302: Main PR and related PR both make overlapping code-level changes to controller/profile/layout handling (ControllerProfile enum, SettingsManager, LayoutManager, ControllerManager, HID/HIDmode updates).
  • PR #1320: Both PRs modify controller/profile handling with changes to settings infrastructure, ControllerProfile enum, ControllerPage UI, and HID mode updates.
  • PR #1284: Both PRs touch the same controller/profile and layout code paths including SettingsManager (ControllerProfile), LayoutManager, and ControllerManager.

Poem

🐰 With profiles now dancing in Native, Xbox, and Dual,
The auto mode switches when gamepad or desktop calls—
From Desktop to Desktop, through profiles we hop,
A controller companion that never will stop!
—Signed with carrot-y paws 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.56% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title clearly describes the main change: adding a 5-profile controller system with Auto mode support, which aligns with the primary objectives of introducing multiple controller profiles and Auto mode functionality.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

ManagerFactory.settingsManager.SetProperty("QuickToolsApplyNoise", QuickToolsNoiseToggle.IsOn);
}
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lots of empty lines here, not sure what happened.

}
else
{
// Start the timer and store the key states
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you removing useful comments, both here and a bit up?

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
HandheldCompanion/Commands/Functions/HC/HIDModeCommands.cs (1)

78-96: Redundant Update() call after SetProperty.

SetProperty on line 92 triggers SettingValueChanged, which already calls Update() (line 33). The explicit Update() call on line 94 is redundant and causes double execution.

🔧 Remove redundant Update call
         ManagerFactory.settingsManager.SetProperty(SettingsName, (int)nextProfile);

-        Update();
         base.Execute(IsKeyDown, IsKeyUp, false);
HandheldCompanion/Commands/Functions/HC/DesktopLayoutCommands.cs (1)

10-42: Bug: SettingsName mismatch causes event handler to never trigger.

SettingsName is still "LayoutMode" but all the profile logic now uses "ControllerProfile". The SettingsManager_SettingValueChanged handler (line 33-42) listens for "LayoutMode" changes but Update() reads from "ControllerProfile". This means when the user changes the controller profile, this command won't update its visual state.

🐛 Fix SettingsName to match new profile system
-private const string SettingsName = "LayoutMode";
+private const string SettingsName = "ControllerProfile";
🤖 Fix all issues with AI agents
In @HandheldCompanion/Managers/VirtualManager.cs:
- Around line 413-414: The validation mistakenly repeats the same check (mode !=
HIDmode.None && mode != HIDmode.None); update the condition to check the
intended second enum value instead of duplicating None—e.g., change it to mode
!= HIDmode.None && mode != HIDmode.NotSelected (or mode != HIDmode.NoController
if that matches your enum), so the LogManager.LogError call that references mode
is only reached when mode is neither None nor the other non-selected state.

In @HandheldCompanion/Properties/Resources.resx:
- Around line 139-141: The resource key was accidentally renamed to "S" which
breaks conventions and likely bindings; revert the key name from "S" back to a
descriptive identifier (e.g., AboutPage_About) in the Resources.resx entry and
update any code or XAML references that currently use Resources.S to use
Resources.AboutPage_About (or the chosen descriptive key) so names stay
consistent with surrounding entries and existing bindings continue to work.

In @HandheldCompanion/Utils/HIDUtils.cs:
- Around line 3-9: The HIDmode enum was reordered, shifting the previous
Xbox360Controller value from 0 to 1 and breaking upgrades; in
SettingsManager.Start() add migration logic that reads the raw persisted value
for HIDmode, detects legacy 0 values (and/or a missing/older settings version
marker), maps them to HIDmode.Xbox360Controller (value 1), updates the in-memory
setting and saves the settings, and only performs this mapping once (or when a
version flag indicates legacy data); reference HIDmode and the
SettingsManager.Start() method to locate where to implement the migration and
persist the corrected setting.

In @HandheldCompanion/Views/Pages/SettingsPage.xaml:
- Around line 130-137: The SettingsCard for Auto Profile on start currently uses
hardcoded Header/Description text; replace the Header and Description attributes
with localized resource bindings (e.g., Header="{l:Static
resx:Resources.SettingsPage_EnableAutoProfileOnStart}" and
Description="{l:Static
resx:Resources.SettingsPage_EnableAutoProfileOnStartDesc}") for the SettingsCard
that contains Toggle_AutoProfileOnStart and its Toggled handler
Toggle_AutoProfileOnStart_Toggled, and add the corresponding resource keys
SettingsPage_EnableAutoProfileOnStart and
SettingsPage_EnableAutoProfileOnStartDesc to Resources.resx with appropriate
translations.
🧹 Nitpick comments (14)
HandheldCompanion/Views/Pages/SettingsPage.xaml.cs (1)

640-700: Consider removing trailing whitespace.

The file has trailing empty lines that should be removed for cleaner formatting.

HandheldCompanion/Views/Pages/ControllerPage.xaml.cs (2)

101-115: Remove development marker comments.

The comments // ========== ADD STEP 5A HERE ========== and // ====================================== appear to be leftover development artifacts that should be removed before merging.

🧹 Remove development comments
-
-                // ========== ADD STEP 5A HERE ==========
                 case "ControllerProfile":
                     cB_ControllerProfile.SelectedIndex = Convert.ToInt32(value);
                     ControllerRefresh();
                     break;

                 case "AutoModeProfile1":
                     cB_AutoModeProfile1.SelectedIndex = Convert.ToInt32(value);
                     break;

                 case "AutoModeProfile2":
                     cB_AutoModeProfile2.SelectedIndex = Convert.ToInt32(value);
                     break;
-                    // ======================================

320-346: LGTM with minor cleanup needed.

The event handlers follow the established pattern in this file. Remove the development marker comments (// ========== ADD STEP 5B HERE ========== and // ======================================).

HandheldCompanion/Managers/SettingsManager.cs (2)

46-54: Remove development comments and fix misleading inline comment.

The inline comment // ← CHANGED from Gamepad is a development artifact. Additionally, consider removing it as it doesn't add value for future maintainers.

🧹 Clean up enum declaration
-// Add this new enum:
 public enum ControllerProfile
 {
-    Native = 0,       // ← CHANGED from Gamepad
+    Native = 0,
     Xbox360 = 1,
     DualShock4 = 2,
     Desktop = 3,
     Auto = 4
 }

83-91: Remove development comments and fix misleading inline comment.

The comment // 0 = Gamepad is inconsistent with the enum where it's now Native = 0. Update for clarity.

🧹 Clean up initialization comments
-        // ========== ADD STEP 2 CODE HERE ==========
         // Initialize controller profile settings if not set
         if (!PropertyExists("ControllerProfile"))
             SetProperty("ControllerProfile", 4); // 4 = Auto mode
         if (!PropertyExists("AutoModeProfile1"))
-            SetProperty("AutoModeProfile1", 0); // 0 = Gamepad
+            SetProperty("AutoModeProfile1", 0); // 0 = Native
         if (!PropertyExists("AutoModeProfile2"))
             SetProperty("AutoModeProfile2", 3); // 3 = Desktop
-                                                // ==========================================
HandheldCompanion/Commands/Functions/HC/HIDModeCommands.cs (2)

47-76: Remove unused parameter from Update method.

The profileMode parameter is no longer used after the refactor to ControllerProfile. The method reads the current profile directly from settings.

♻️ Remove unused parameter
-public void Update(HIDmode profileMode = HIDmode.NotSelected)
+public void Update()
 {
     ControllerProfile currentProfile = (ControllerProfile)ManagerFactory.settingsManager.GetInt("ControllerProfile");
     // ... rest of method
 }

10-39: Clean up development marker comments.

Remove inline comments like // ← CHANGED from "HIDmode", // ← ADD THIS EVENT SUBSCRIPTION, // ← ADD THIS METHOD, and // ← Remove the 'true'.

HandheldCompanion/Managers/LayoutManager.cs (4)

16-16: Remove unused import.

System.Threading.Tasks is imported but not used in this file.

🧹 Remove unused import
-using System.Threading.Tasks;

363-375: Avoid magic number casts for LayoutModes.

Using (LayoutModes)0 and (LayoutModes)1 instead of named enum values reduces readability. Since Gamepad was removed from the enum, consider defining constants or using the remaining enum values directly.

♻️ Use descriptive constants
+    // LayoutModes.Gamepad was removed; use 0 for gamepad/profile layout mode
+    private const int LayoutModeGamepad = 0;
+    private const int LayoutModeDesktop = 1;
+
     private void LayoutTimer_Elapsed(object? sender, ElapsedEventArgs e)
     {
         LayoutModes layoutMode = (LayoutModes)ManagerFactory.settingsManager.GetInt("LayoutMode");

-        if (layoutMode == (LayoutModes)0)
+        if ((int)layoutMode == LayoutModeGamepad)
         {
             if (!currentLayout.Equals(profileLayout))
                 SetActiveLayout(profileLayout);
         }
-        else if (layoutMode == (LayoutModes)1)
+        else if (layoutMode == LayoutModes.Desktop)
         {
             if (!currentLayout.Equals(desktopLayout))
                 SetActiveLayout(desktopLayout);
         }
     }

468-501: Hardcoded window names reduce maintainability.

The focus detection logic hardcodes window names ("MainWindow", "QuickTools", "Overlay"). Consider extracting these to constants or a configuration to improve maintainability.

♻️ Extract window names to constants
+    private static readonly string[] GamepadFocusWindows = { "MainWindow", "QuickTools" };
+    private static readonly string OverlayPrefix = "Overlay";
+
     // In CheckProfileLayout:
-    bool hcHasFocus = !string.IsNullOrEmpty(currentGamepadFocus) &&
-                     (currentGamepadFocus == "MainWindow" ||
-                      currentGamepadFocus == "QuickTools" ||
-                      currentGamepadFocus.Contains("Overlay"));
+    bool hcHasFocus = !string.IsNullOrEmpty(currentGamepadFocus) &&
+                     (GamepadFocusWindows.Contains(currentGamepadFocus) ||
+                      currentGamepadFocus.Contains(OverlayPrefix));

473-501: Consider reducing verbose logging in hot path.

CheckProfileLayout is called on every foreground change and focus event. The multiple LogManager.LogInformation calls may impact performance and generate excessive log output. Consider using LogDebug or adding a condition to only log when debugging is enabled.

♻️ Use LogDebug for frequent diagnostics
-            LogManager.LogInformation("=== CheckProfileLayout ===");
-            LogManager.LogInformation("currentGamepadFocus: '{0}'", currentGamepadFocus ?? "null");
-            LogManager.LogInformation("hcHasFocus: {0}", hcHasFocus);
-            LogManager.LogInformation("foregroundProcess: {0}", foregroundProcess?.Executable ?? "null");
+            LogManager.LogDebug("=== CheckProfileLayout ===");
+            LogManager.LogDebug("currentGamepadFocus: '{0}'", currentGamepadFocus ?? "null");
+            LogManager.LogDebug("hcHasFocus: {0}", hcHasFocus);
+            LogManager.LogDebug("foregroundProcess: {0}", foregroundProcess?.Executable ?? "null");

Apply the same change to all LogInformation calls within CheckProfileLayout.

HandheldCompanion/Managers/ControllerManager.cs (2)

1121-1150: Centralized hide/unhide logic is sound; avoid magic enum casts

The profile-based semantics look correct (Native always visible, explicit virtual profiles always hidden, Auto deferring to HIDmode and Desktop layout). The only fragility is layoutMode == (LayoutModes)1 – relying on the underlying numeric value makes future enum changes risky. Prefer comparing against a named member (e.g., the Desktop value) instead of (LayoutModes)1.


1196-1269: LayoutMode and ControllerProfile handlers correctly reuse DetermineHideState; logging could be toned down

The wiring from LayoutMode and ControllerProfile changes into DetermineHideState is clean and the targetController != null && !targetController.IsVirtual() guard plus HIDcloakonconnect check prevent accidental manipulation of virtual controllers.

The current log block around ControllerProfile (multiple LogInformation lines plus an LogError when HIDcloakonconnect is disabled) is quite verbose for a normal configuration path. Once this feature is stable, consider downgrading most of these to Debug/Trace and changing the “HIDcloakonconnect is DISABLED” message to Info/Warning so regular logs don’t get noisy.

HandheldCompanion/Views/Pages/ControllerPage.xaml (1)

165-219: Use localized resources for main Controller Profile ComboBox items

cB_ControllerProfile currently uses hard-coded strings (“Native”, “Xbox 360”, etc.), while you’ve already added Enum_ControllerProfile_* resources and use them for the Auto mode profile ComboBoxes. For localization and consistency, it would be better to reuse those resources here as well.

Suggested XAML change to use resx strings
-                    <ComboBox Name="cB_ControllerProfile" SelectionChanged="cB_ControllerProfile_SelectionChanged">
-                        <ComboBoxItem Content="Native" />
-                        <ComboBoxItem Content="Xbox 360" />
-                        <ComboBoxItem Content="DualShock 4" />
-                        <ComboBoxItem Content="Desktop" />
-                        <ComboBoxItem Content="Auto" />
-                    </ComboBox>
+                    <ComboBox Name="cB_ControllerProfile" SelectionChanged="cB_ControllerProfile_SelectionChanged">
+                        <ComboBoxItem Content="{l:Static resx:Resources.Enum_ControllerProfile_Native}" />
+                        <ComboBoxItem Content="{l:Static resx:Resources.Enum_ControllerProfile_Xbox360}" />
+                        <ComboBoxItem Content="{l:Static resx:Resources.Enum_ControllerProfile_DualShock4}" />
+                        <ComboBoxItem Content="{l:Static resx:Resources.Enum_ControllerProfile_Desktop}" />
+                        <ComboBoxItem Content="{l:Static resx:Resources.Enum_ControllerProfile_Auto}" />
+                    </ComboBox>
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c47b6c7 and b46e5f9.

📒 Files selected for processing (15)
  • HandheldCompanion/Commands/Functions/HC/DesktopLayoutCommands.cs
  • HandheldCompanion/Commands/Functions/HC/HIDModeCommands.cs
  • HandheldCompanion/Managers/ControllerManager.cs
  • HandheldCompanion/Managers/LayoutManager.cs
  • HandheldCompanion/Managers/SettingsManager.cs
  • HandheldCompanion/Managers/VirtualManager.cs
  • HandheldCompanion/Properties/Resources.resx
  • HandheldCompanion/Properties/Settings.Designer.cs
  • HandheldCompanion/Properties/Settings.settings
  • HandheldCompanion/Targets/ViGEmTarget.cs
  • HandheldCompanion/Utils/HIDUtils.cs
  • HandheldCompanion/Views/Pages/ControllerPage.xaml
  • HandheldCompanion/Views/Pages/ControllerPage.xaml.cs
  • HandheldCompanion/Views/Pages/SettingsPage.xaml
  • HandheldCompanion/Views/Pages/SettingsPage.xaml.cs
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2024-07-27T07:08:12.731Z
Learnt from: romracer
Repo: Valkirie/HandheldCompanion PR: 1012
File: HandheldCompanion/Devices/MSI/ClawA1M.cs:0-0
Timestamp: 2024-07-27T07:08:12.731Z
Learning: The `ClawA1M` class in the `HandheldCompanion` project has been refactored to improve readability and maintainability. Changes include the removal of `scope` as a private field, simplification by removing thread logic, encapsulation of WMI event monitoring setup and teardown in separate methods with proper exception handling, and marking `specialKeyWatcher` as nullable.

Applied to files:

  • HandheldCompanion/Targets/ViGEmTarget.cs
  • HandheldCompanion/Utils/HIDUtils.cs
  • HandheldCompanion/Commands/Functions/HC/HIDModeCommands.cs
  • HandheldCompanion/Properties/Settings.settings
  • HandheldCompanion/Views/Pages/ControllerPage.xaml.cs
  • HandheldCompanion/Commands/Functions/HC/DesktopLayoutCommands.cs
  • HandheldCompanion/Properties/Settings.Designer.cs
  • HandheldCompanion/Managers/VirtualManager.cs
  • HandheldCompanion/Managers/LayoutManager.cs
  • HandheldCompanion/Managers/ControllerManager.cs
  • HandheldCompanion/Views/Pages/ControllerPage.xaml
📚 Learning: 2024-07-27T07:08:12.731Z
Learnt from: MSeys
Repo: Valkirie/HandheldCompanion PR: 842
File: HandheldCompanion/Properties/Resources.Designer.cs:5125-5127
Timestamp: 2024-07-27T07:08:12.731Z
Learning: The user MSeys has indicated that the proposed revision for the `ProfilesPage_UMCMotionOnOffDesc` string in the `Resources.Designer.cs` file was incorrect. The user prefers a different wording or structure for the string description.

Applied to files:

  • HandheldCompanion/Views/Pages/SettingsPage.xaml
  • HandheldCompanion/Properties/Resources.resx
  • HandheldCompanion/Views/Pages/ControllerPage.xaml
🧬 Code graph analysis (4)
HandheldCompanion/Commands/Functions/HC/HIDModeCommands.cs (2)
HandheldCompanion/Managers/LayoutManager.cs (1)
  • SettingsManager_SettingValueChanged (566-591)
HandheldCompanion/Commands/Functions/HC/QuickOverlayCommands.cs (1)
  • SettingsManager_SettingValueChanged (24-36)
HandheldCompanion/Commands/Functions/HC/DesktopLayoutCommands.cs (3)
HandheldCompanion/Commands/Functions/HC/HIDModeCommands.cs (1)
  • Update (47-76)
HandheldCompanion/Managers/ManagerFactory.cs (2)
  • ManagerFactory (8-72)
  • ManagerFactory (39-59)
HandheldCompanion/Managers/SettingsManager.cs (2)
  • GetInt (270-273)
  • SetProperty (105-152)
HandheldCompanion/Properties/Settings.Designer.cs (2)
HandheldCompanion/Properties/Resources.Designer.cs (2)
  • global (22-11830)
  • global (31-33)
HandheldCompanion/Managers/SettingsManager.cs (1)
  • Settings (14-38)
HandheldCompanion/Views/Pages/SettingsPage.xaml.cs (1)
HandheldCompanion/Managers/SettingsManager.cs (1)
  • SetProperty (105-152)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build and Release
🔇 Additional comments (17)
HandheldCompanion/Properties/Settings.settings (1)

359-370: LGTM! New controller profile settings added correctly.

The four new settings (ControllerProfile, AutoModeProfile1, AutoModeProfile2, AutoProfileOnStart) follow the existing pattern and have sensible defaults that align with the PR objectives.

HandheldCompanion/Views/Pages/SettingsPage.xaml.cs (2)

179-181: LGTM! AutoProfileOnStart setting propagation implemented correctly.

The setting value change handler follows the established pattern for other boolean toggle settings in this file.


287-293: LGTM! Toggle event handler implemented correctly.

The implementation mirrors other toggle handlers (e.g., Toggle_DesktopLayoutOnStart_Toggled) with proper IsLoaded guard and settings manager integration.

HandheldCompanion/Targets/ViGEmTarget.cs (1)

13-13: LGTM! HIDmode enum value updated correctly.

The change from HIDmode.NoController to HIDmode.None aligns with the enum refactoring described in the PR objectives.

HandheldCompanion/Managers/VirtualManager.cs (3)

45-46: LGTM! HIDmode initialization updated correctly.

The default values have been updated from HIDmode.NoController to HIDmode.None, consistent with the enum refactoring.


202-202: LGTM! Suspend method updated correctly.

The call to SetControllerMode(HIDmode.None) properly reflects the renamed enum value.


398-400: LGTM! Case statement updated correctly.

The switch case for HIDmode.None has been updated with the appropriate comment.

HandheldCompanion/Commands/Functions/HC/DesktopLayoutCommands.cs (2)

74-92: Inconsistent profile cycling behavior compared to HIDModeCommands.

DesktopLayoutCommands cycles: Native → Xbox360 → DualShock4 → Desktop → Native (skipping Auto on single press), while HIDModeCommands cycles: Native → Xbox360 → DualShock4 → Desktop → Auto → Native.

This inconsistency may confuse users. Both commands should have the same cycling sequence, or the difference should be intentional and documented.

Is skipping Auto in the single-press cycle intentional? The double-press (line 99) sets Auto, but single-press skips it.


111-118: IsToggled always returning true may cause UI confusion.

The comment explains this is intentional for Controller Profiles, but always returning true might not reflect the actual state correctly in the UI. Consider whether this property should track a meaningful state.

HandheldCompanion/Properties/Settings.Designer.cs (1)

1440-1487: LGTM - Auto-generated settings properties.

The new settings properties are correctly generated with appropriate defaults that align with the SettingsManager initialization logic.

HandheldCompanion/Managers/LayoutManager.cs (3)

48-56: Declared Updated event appears unused.

The Updated event and UpdatedEventHandler delegate are declared but the AI summary indicates they were "temporarily introduced then removed in the final state." Verify if these are still needed, as they're only invoked for template processing (lines 103, 328) and may not be related to the new controller profile system.


413-418: 1-second debounce may cause noticeable delay.

The 1000ms debounce between profile switches might cause perceptible lag when rapidly switching applications. Consider whether 500ms or less would provide a better user experience while still preventing flapping.

Is the 1-second debounce intentional? Users may notice delays when alt-tabbing between games and desktop applications.


400-459: ApplyControllerProfile logic looks correct.

The method properly handles Auto mode delegation, debouncing, and setting the appropriate HIDmode/HIDstatus/LayoutMode combinations for each profile type.

HandheldCompanion/Managers/ControllerManager.cs (2)

1501-1527: HIDmode.None transition maintains previous semantics

Updating from HIDmode.NoController to HIDmode.None in both WatchdogLoop (VirtualManager.SetControllerMode) and GetDefault keeps the “no emulated controller → dummy Xbox 360” behavior intact, and aligns with the new enum naming. Assuming other call sites have been similarly updated to None, this looks consistent.

Also applies to: 1967-1986


1711-1739: Target-controller hide/unhide on selection correctly reuses profile/layout logic

Using DetermineHideState when a new physical target is selected keeps the HID cloaking behavior consistent with the currently active ControllerProfile and LayoutMode, and preserves the Legion wireless special case for powerCycle. The guardrails (!IsPowerCycling, !controller.IsVirtual(), HIDcloakonconnect) look appropriate; no functional issues spotted here.

HandheldCompanion/Properties/Resources.resx (1)

4035-4073: New controller profile and Auto mode resources look consistent

The new Enum_ControllerProfile_*, ControllerPage_*AutoMode*, and Enum_HIDmode_None strings are named consistently with existing resources and match the new UI elements on ControllerPage.xaml. Combined with the earlier suggestion, wiring cB_ControllerProfile to these keys will give you full localization coverage for the new feature.

HandheldCompanion/Views/Pages/ControllerPage.xaml (1)

158-162: No action needed—HIDmode ↔ cB_HidMode mapping is correct

The HIDmode enum values (None = 0, Xbox360Controller = 1, DualShock4Controller = 2) already align with the ComboBox item indices (0, 1, 2), so the direct SelectedIndex ↔ enum value conversion in the code-behind works correctly. The resource key Enum_HIDmode_None is properly defined in Resources.resx.

Comment on lines +413 to 414
if (mode != HIDmode.None && mode != HIDmode.None) // ← UPDATE
LogManager.LogError("Failed to initialise virtual controller with HIDmode: {0}", mode);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix duplicate condition in validation check.

The condition mode != HIDmode.None && mode != HIDmode.None checks the same value twice, which is redundant. Based on the code context showing HIDmode.NotSelected is used elsewhere (lines 139, 262, 275, 291), this appears to be an incomplete refactoring.

The original condition likely checked for both NoController and NotSelected, but during the enum rename, both were incorrectly changed to None.

🐛 Proposed fix
                 if (vTarget is null)
                 {
-                    if (mode != HIDmode.None && mode != HIDmode.None)
+                    if (mode != HIDmode.None && mode != HIDmode.NotSelected)
                         LogManager.LogError("Failed to initialise virtual controller with HIDmode: {0}", mode);
                     return;
                 }

Alternatively, if only checking for None is sufficient:

-                    if (mode != HIDmode.None && mode != HIDmode.None)
+                    if (mode != HIDmode.None)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (mode != HIDmode.None && mode != HIDmode.None) // ← UPDATE
LogManager.LogError("Failed to initialise virtual controller with HIDmode: {0}", mode);
if (vTarget is null)
{
if (mode != HIDmode.None && mode != HIDmode.NotSelected)
LogManager.LogError("Failed to initialise virtual controller with HIDmode: {0}", mode);
return;
}
🤖 Prompt for AI Agents
In @HandheldCompanion/Managers/VirtualManager.cs around lines 413 - 414, The
validation mistakenly repeats the same check (mode != HIDmode.None && mode !=
HIDmode.None); update the condition to check the intended second enum value
instead of duplicating None—e.g., change it to mode != HIDmode.None && mode !=
HIDmode.NotSelected (or mode != HIDmode.NoController if that matches your enum),
so the LogManager.LogError call that references mode is only reached when mode
is neither None nor the other non-selected state.

Comment on lines +139 to 141
<data name="S" xml:space="preserve">
<value>About</value>
</data>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Suspicious rename of About resource key to “S”

The key data name="S" with value “About” doesn’t follow the established naming convention (e.g., AboutPage_About) and looks like an accidental rename. Unless you’ve explicitly updated all usages to reference Resources.S, this risks breaking existing bindings and makes the resource hard to understand.

I’d strongly recommend renaming this back to a descriptive key (likely AboutPage_About) to match the surrounding entries and avoid confusion.

🤖 Prompt for AI Agents
In @HandheldCompanion/Properties/Resources.resx around lines 139 - 141, The
resource key was accidentally renamed to "S" which breaks conventions and likely
bindings; revert the key name from "S" back to a descriptive identifier (e.g.,
AboutPage_About) in the Resources.resx entry and update any code or XAML
references that currently use Resources.S to use Resources.AboutPage_About (or
the chosen descriptive key) so names stay consistent with surrounding entries
and existing bindings continue to work.

Comment on lines 3 to 9
public enum HIDmode
{
NotSelected = -1,
Xbox360Controller = 0,
DualShock4Controller = 1,
NoController = 2
None = 0,
Xbox360Controller = 1,
DualShock4Controller = 2
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

rg -n "HIDmode" --type=cs

Repository: Valkirie/HandheldCompanion

Length of output: 9651


🏁 Script executed:

rg -n -i "migrat|upgrade|version" --type=cs | head -30

Repository: Valkirie/HandheldCompanion

Length of output: 3159


🏁 Script executed:

rg -n -B3 -A3 "HIDmode\s*=" --type=cs

Repository: Valkirie/HandheldCompanion

Length of output: 6990


🏁 Script executed:

rg -n "class SettingsManager" --type=cs -A 20

Repository: Valkirie/HandheldCompanion

Length of output: 1879


🏁 Script executed:

cat -n HandheldCompanion/Properties/Settings.Designer.cs | sed -n '720,740p'

Repository: Valkirie/HandheldCompanion

Length of output: 989


🏁 Script executed:

rg -n "HIDmode" HandheldCompanion/Properties/Settings.Designer.cs

Repository: Valkirie/HandheldCompanion

Length of output: 202


🏁 Script executed:

fd "\.config$" HandheldCompanion --type f

Repository: Valkirie/HandheldCompanion

Length of output: 98


🏁 Script executed:

cat HandheldCompanion/App.config | grep -A 5 "HIDmode"

Repository: Valkirie/HandheldCompanion

Length of output: 244


🏁 Script executed:

rg -n -B5 -A15 "FirstStart\|NewUpdate" HandheldCompanion/Views/Windows/MainWindow.xaml.cs

Repository: Valkirie/HandheldCompanion

Length of output: 52


🏁 Script executed:

rg -n "NoController" --type=cs

Repository: Valkirie/HandheldCompanion

Length of output: 718


🏁 Script executed:

cat -n HandheldCompanion/Views/Windows/MainWindow.xaml.cs | sed -n '90,180p'

Repository: Valkirie/HandheldCompanion

Length of output: 4164


🏁 Script executed:

rg -n "GetInt.*HIDmode" --type=cs -B 2 -A 2

Repository: Valkirie/HandheldCompanion

Length of output: 1608


🏁 Script executed:

cat -n HandheldCompanion/Managers/SettingsManager.cs | sed -n '69,150p'

Repository: Valkirie/HandheldCompanion

Length of output: 3485


🏁 Script executed:

rg -n "Initialize.*FirstStart\|Initialize.*NewUpdate" --type=cs -B 2 -A 10

Repository: Valkirie/HandheldCompanion

Length of output: 52


🏁 Script executed:

fd "IDevice.cs" --type f

Repository: Valkirie/HandheldCompanion

Length of output: 106


🏁 Script executed:

cat -n HandheldCompanion/Devices/IDevice.cs | sed -n '1,100p' | grep -n "Initialize"

Repository: Valkirie/HandheldCompanion

Length of output: 52


🏁 Script executed:

rg -n "public.*Initialize" HandheldCompanion/Devices/IDevice.cs -A 15

Repository: Valkirie/HandheldCompanion

Length of output: 620


🏁 Script executed:

cat HandheldCompanion/App.config | head -100

Repository: Valkirie/HandheldCompanion

Length of output: 3686


🏁 Script executed:

rg -n "NoController\|enum.*HID" --type=cs -B 2 -A 8 | head -60

Repository: Valkirie/HandheldCompanion

Length of output: 52


🏁 Script executed:

cat -n HandheldCompanion/Utils/HIDUtils.cs

Repository: Valkirie/HandheldCompanion

Length of output: 394


🏁 Script executed:

git log -p --all -- HandheldCompanion/Utils/HIDUtils.cs | head -100

Repository: Valkirie/HandheldCompanion

Length of output: 52


🏁 Script executed:

git log --oneline --all HandheldCompanion/Utils/HIDUtils.cs | head -20

Repository: Valkirie/HandheldCompanion

Length of output: 239


🏁 Script executed:

git log --format="%H %s" --all -- HandheldCompanion/Utils/HIDUtils.cs | head -5

Repository: Valkirie/HandheldCompanion

Length of output: 335


🏁 Script executed:

git show HEAD:HandheldCompanion/Utils/HIDUtils.cs 2>/dev/null || echo "File not found in HEAD"

Repository: Valkirie/HandheldCompanion

Length of output: 289


🏁 Script executed:

rg -n "NoController.*=" --type=cs | head -20

Repository: Valkirie/HandheldCompanion

Length of output: 52


🏁 Script executed:

git show 7c8e61a2:HandheldCompanion/Utils/HIDUtils.cs 2>/dev/null || echo "Not found in that commit"

Repository: Valkirie/HandheldCompanion

Length of output: 297


🏁 Script executed:

git diff 7c8e61a2 HEAD -- HandheldCompanion/Utils/HIDUtils.cs 2>/dev/null

Repository: Valkirie/HandheldCompanion

Length of output: 517


🏁 Script executed:

git show 022c9cb1:HandheldCompanion/Utils/HIDUtils.cs 2>/dev/null

Repository: Valkirie/HandheldCompanion

Length of output: 275


🏁 Script executed:

rg -n "Xbox360Controller = 0" --type=cs

Repository: Valkirie/HandheldCompanion

Length of output: 52


🏁 Script executed:

git log --all --grep="HIDmode\|enum.*HID" --oneline

Repository: Valkirie/HandheldCompanion

Length of output: 719


Breaking change: enum value shift will corrupt legacy persisted settings.

Existing user settings with HIDmode=0 (previously Xbox360Controller) will now be interpreted as None. The default value in app.config has always been 0, so users upgrading will experience unexpected behavior where their configured emulated controller reverts to disabled.

Migration logic should be added in SettingsManager.Start() to detect and upgrade legacy values (e.g., if value is 0 and it's from an old version, map it to Xbox360Controller = 1), or document this as a breaking change requiring users to reconfigure their controller settings.

🤖 Prompt for AI Agents
In @HandheldCompanion/Utils/HIDUtils.cs around lines 3 - 9, The HIDmode enum was
reordered, shifting the previous Xbox360Controller value from 0 to 1 and
breaking upgrades; in SettingsManager.Start() add migration logic that reads the
raw persisted value for HIDmode, detects legacy 0 values (and/or a missing/older
settings version marker), maps them to HIDmode.Xbox360Controller (value 1),
updates the in-memory setting and saves the settings, and only performs this
mapping once (or when a version flag indicates legacy data); reference HIDmode
and the SettingsManager.Start() method to locate where to implement the
migration and persist the corrected setting.

Comment on lines +130 to +137
<!-- Auto Profile on Start -->
<ui:SettingsCard Description="Automatically enable Auto profile when HandheldCompanion starts" Header="Enable Auto profile on start">
<ui:SettingsCard.HeaderIcon>
<ui:FontIcon FontFamily="{DynamicResource SymbolThemeFontFamily}" Glyph="&#xE9A1;" />
</ui:SettingsCard.HeaderIcon>
<ui:ToggleSwitch Name="Toggle_AutoProfileOnStart" Toggled="Toggle_AutoProfileOnStart_Toggled" />
</ui:SettingsCard>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Use localized resource strings instead of hardcoded text.

The new SettingsCard uses hardcoded strings for Header and Description, which is inconsistent with all other settings cards in this file that use resource references (e.g., {l:Static resx:Resources.SettingsPage_EnableDesktopLayoutOnStart}).

This breaks the application's localization pattern and prevents translation of this UI element.

🌐 Suggested fix to use resource strings
-                <!--  Auto Profile on Start  -->
-                <ui:SettingsCard Description="Automatically enable Auto profile when HandheldCompanion starts" Header="Enable Auto profile on start">
+                <!--  Enable Auto profile on start  -->
+                <ui:SettingsCard Description="{l:Static resx:Resources.SettingsPage_EnableAutoProfileOnStartDesc}" Header="{l:Static resx:Resources.SettingsPage_EnableAutoProfileOnStart}">
                     <ui:SettingsCard.HeaderIcon>
                         <ui:FontIcon FontFamily="{DynamicResource SymbolThemeFontFamily}" Glyph="&#xE9A1;" />
                     </ui:SettingsCard.HeaderIcon>

Note: You'll need to add the corresponding resource strings SettingsPage_EnableAutoProfileOnStart and SettingsPage_EnableAutoProfileOnStartDesc to your Resources.resx file.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In @HandheldCompanion/Views/Pages/SettingsPage.xaml around lines 130 - 137, The
SettingsCard for Auto Profile on start currently uses hardcoded
Header/Description text; replace the Header and Description attributes with
localized resource bindings (e.g., Header="{l:Static
resx:Resources.SettingsPage_EnableAutoProfileOnStart}" and
Description="{l:Static
resx:Resources.SettingsPage_EnableAutoProfileOnStartDesc}") for the SettingsCard
that contains Toggle_AutoProfileOnStart and its Toggled handler
Toggle_AutoProfileOnStart_Toggled, and add the corresponding resource keys
SettingsPage_EnableAutoProfileOnStart and
SettingsPage_EnableAutoProfileOnStartDesc to Resources.resx with appropriate
translations.

public class HIDModeCommands : FunctionCommands
{
private const string SettingsName = "HIDmode";
private const string SettingsName = "ControllerProfile"; // ← CHANGED from "HIDmode"
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like an LLM note that you forgot to remove.


Update();

// ← ADD THIS EVENT SUBSCRIPTION
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like an LLM note that you forgot to remove.

ManagerFactory.profileManager.Applied += ProfileManager_Applied;
}

// ← ADD THIS METHOD
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like an LLM note that you forgot to remove.

Update();

ControllerProfile profile = (ControllerProfile)ManagerFactory.settingsManager.GetInt(SettingsName);
ToastManager.SendToast($"Controller Profile", $"{profile}", $"controller_profile_{(int)profile}", true);
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not super familiar with the toast manager implementation throughout the app, is it normal to do them in the methods for setting values in the settings manager?

public override void Execute(bool IsKeyDown, bool IsKeyUp, bool IsBackground)
{
if (IsEnabled)
ControllerProfile currentProfile = (ControllerProfile)ManagerFactory.settingsManager.GetInt("ControllerProfile"); // ← Remove the 'true'
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More LLM notes here

_ => ControllerProfile.Native
};

ManagerFactory.settingsManager.SetProperty(SettingsName, (int)nextProfile); // ← Use SettingsName
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More LLM notes


public override void Dispose()
{
ManagerFactory.settingsManager.SettingValueChanged -= SettingsManager_SettingValueChanged; // ← ADD THIS
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More LLM notes.

if (targetController is LegionController)
if (shouldHide)
{
// todo: Look for a byte within hid report that'd tend to mean both controllers are synced.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You removed a very important bit of information that was learned through manual effort.


public static IController GetDefault(bool profilePage = false)
{
// get HIDmode for the selected profile (could be different than HIDmode in settings if profile has HIDmode)
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More removals of important commentary.

@CasperH2O
Copy link
Copy Markdown
Collaborator Author

@MistakePlaysGit are you planning on following up my comments/feedback? If not, while I agree with this feature, I'd like to close this open pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants