ruffsl

joined 2 years ago
MODERATOR OF
[–] ruffsl@programming.dev 1 points 1 day ago (1 children)

Congrats on solving your issue, and thanks for updated the post with the solution! It's really slick how NixOS makes adding a kernel patch to your config no more complex than it would take patching any dot file. Hope the up streaming of your device info goes smoothly.

[–] ruffsl@programming.dev 5 points 2 days ago (3 children)

Encountered an odd Bluetooth issue last week with a motherboard that had a combined Bluetooth and Wi-Fi radio chip set. Wi-Fi worked, but the Bluetooth hardware wasn't even detected. This was after migrating from a Windows install with known working Bluetooth drivers on the same motherboard.

Found a solved thread for the same motherboard SKU where power cycling after disconnecting the desktop power supply from AC for 30 sec resolved it. Didn't believe it, but tried it anyway and it worked. Guessing the Windows driver must have put the Bluetooth transceiver in a funny state that the mainline Linux kernel couldn't recover, but resting the chipset with a through power cycle with internal voltage supplies zeroed made the difference in re-initializing the hardware.

Just a wild suggestion...

[–] ruffsl@programming.dev 2 points 1 week ago (1 children)

This is cool! Still reading over the wiki yet, but do you know what they term multiplexing controllers as? I'd like to learn how they implement the same controller assist functionality for merging simultaneous inputs for the same axis.

There's very little documentation on how the property game consoles implement this accessibility feature, and I'd love to learn how others have implemented the signal mixing logic from a multi user input perspective.

 

CtrlAssist v0.4.0 introduces demultiplexing functionality along with enhancements to the system tray and rumble targeting. The updated README now features FAQ and Cookbook sections with practical examples, such as the "Double Agent Tag Team" scenario, where a single assist controller uses a demux to help multiple primary players across separate mux instances, and the "Couch Co-Op Swap" scenario, in which two players take turns assisting each other using toggle mode, with force feedback following the currently active controller by default.

While controller demultiplexing was a requested feature from a prior release, I didn't have a concrete use case until I found myself helping a pair of youngsters play couch co-op multiplayer games with each other. Instead of needing separate assist controllers for each player, otherwise charging/pairing four controllers in total, being able to unicast between mux instances with a single assist controller made juggling both inputs much simpler. Then after being roped into the "It Takes Two" session myself, I found being able to swap primary and assist players outright much simpler when both helping and playing, allowing the Helpee to also aid the Helper when it really does take two.

New Features

Demux Operation Mode

CtrlAssist now supports demultiplexing (demux), allowing a single physical controller to be split into multiple virtual gamepads. This complements the existing multiplexing (mux) functionality and enables more advanced input routing scenarios.

Demux Modes:

  • Unicast (default): Routes primary controller input to the currently active virtual gamepad. Cycle between virtual gamepads using the reserved Mode button.
    • Assist multiple players across separate mux instances
  • Multicast: Broadcasts primary controller input to all virtual gamepads simultaneously.
    • Replicate controller input for advanced input multiplexing pipelines

Active Rumble Targeting

A new "Active" rumble target has been added as the default option for mux operations. This routes force feedback to whichever controllers are currently active according to the selected mode:

  • Toggle Mode: Rumble follows the currently active controller
  • Priority/Average Modes: Rumble sent to both controllers, same as before

Expanded Documentation

The README has been significantly expanded with:

  • FAQ Section: Addresses common questions about who CtrlAssist is for, why it was developed, game compatibility, supported controllers, and running multiple instances
  • Cookbook Section: Provides practical examples demonstrating complex multi-instance setups:
    • Couch Co-Op Swap: Two players alternating assistance
    • Double Agent Tag Team: One assist controller helping multiple primary players

Breaking Changes

  • The rumble target enum options now defaults to "Active" instead of "Both"
  • Configuration file format has been extended to accommodate separate mux and demux settings

Installation

CtrlAssist v0.4.0 can be installed via:

  • Cargo: cargo install ctrlassist --force
  • Flatpak: Download the bundle from the releases page and install with flatpak install
 

CtrlAssist v0.4.0 introduces demultiplexing functionality along with enhancements to the system tray and rumble targeting. The updated README now features FAQ and Cookbook sections with practical examples, such as the "Double Agent Tag Team" scenario, where a single assist controller uses a demux to help multiple primary players across separate mux instances, and the "Couch Co-Op Swap" scenario, in which two players take turns assisting each other using toggle mode, with force feedback following the currently active controller by default.

While controller demultiplexing was a requested feature from a prior release, I didn't have a concrete use case until I found myself helping a pair of youngsters play couch co-op multiplayer games with each other. Instead of needing separate assist controllers for each player, otherwise charging/pairing four controllers in total, being able to unicast between mux instances with a single assist controller made juggling both inputs much simpler. Then after being roped into the "It Takes Two" session myself, I found being able to swap primary and assist players outright much simpler when both helping and playing, allowing the Helpee to also aid the Helper when it really does take two.

New Features

Demux Operation Mode

CtrlAssist now supports demultiplexing (demux), allowing a single physical controller to be split into multiple virtual gamepads. This complements the existing multiplexing (mux) functionality and enables more advanced input routing scenarios.

Demux Modes:

  • Unicast (default): Routes primary controller input to the currently active virtual gamepad. Cycle between virtual gamepads using the reserved Mode button.
    • Assist multiple players across separate mux instances
  • Multicast: Broadcasts primary controller input to all virtual gamepads simultaneously.
    • Replicate controller input for advanced input multiplexing pipelines

Active Rumble Targeting

A new "Active" rumble target has been added as the default option for mux operations. This routes force feedback to whichever controllers are currently active according to the selected mode:

  • Toggle Mode: Rumble follows the currently active controller
  • Priority/Average Modes: Rumble sent to both controllers, same as before

Expanded Documentation

The README has been significantly expanded with:

  • FAQ Section: Addresses common questions about who CtrlAssist is for, why it was developed, game compatibility, supported controllers, and running multiple instances
  • Cookbook Section: Provides practical examples demonstrating complex multi-instance setups:
    • Couch Co-Op Swap: Two players alternating assistance
    • Double Agent Tag Team: One assist controller helping multiple primary players

Breaking Changes

  • The rumble target enum options now defaults to "Active" instead of "Both"
  • Configuration file format has been extended to accommodate separate mux and demux settings

Installation

CtrlAssist v0.4.0 can be installed via:

  • Cargo: cargo install ctrlassist --force
  • Flatpak: Download the bundle from the releases page and install with flatpak install
 

CtrlAssist v0.4.0 introduces demultiplexing functionality along with enhancements to the system tray and rumble targeting. The updated README now features FAQ and Cookbook sections with practical examples, such as the "Double Agent Tag Team" scenario, where a single assist controller uses a demux to help multiple primary players across separate mux instances, and the "Couch Co-Op Swap" scenario, in which two players take turns assisting each other using toggle mode, with force feedback following the currently active controller by default.

While controller demultiplexing was a requested feature from a prior release, I didn't have a concrete use case until I found myself helping a pair of youngsters play couch co-op multiplayer games with each other. Instead of needing separate assist controllers for each player, otherwise charging/pairing four controllers in total, being able to unicast between mux instances with a single assist controller made juggling both inputs much simpler. Then after being roped into the "It Takes Two" session myself, I found being able to swap primary and assist players outright much simpler when both helping and playing, allowing the Helpee to also aid the Helper when it really does take two.

New Features

Demux Operation Mode

CtrlAssist now supports demultiplexing (demux), allowing a single physical controller to be split into multiple virtual gamepads. This complements the existing multiplexing (mux) functionality and enables more advanced input routing scenarios.

Demux Modes:

  • Unicast (default): Routes primary controller input to the currently active virtual gamepad. Cycle between virtual gamepads using the reserved Mode button.
    • Assist multiple players across separate mux instances
  • Multicast: Broadcasts primary controller input to all virtual gamepads simultaneously.
    • Replicate controller input for advanced input multiplexing pipelines

Active Rumble Targeting

A new "Active" rumble target has been added as the default option for mux operations. This routes force feedback to whichever controllers are currently active according to the selected mode:

  • Toggle Mode: Rumble follows the currently active controller
  • Priority/Average Modes: Rumble sent to both controllers, same as before

Expanded Documentation

The README has been significantly expanded with:

  • FAQ Section: Addresses common questions about who CtrlAssist is for, why it was developed, game compatibility, supported controllers, and running multiple instances
  • Cookbook Section: Provides practical examples demonstrating complex multi-instance setups:
    • Couch Co-Op Swap: Two players alternating assistance
    • Double Agent Tag Team: One assist controller helping multiple primary players

Breaking Changes

  • The rumble target enum options now defaults to "Active" instead of "Both"
  • Configuration file format has been extended to accommodate separate mux and demux settings

Installation

CtrlAssist v0.4.0 can be installed via:

  • Cargo: cargo install ctrlassist --force
  • Flatpak: Download the bundle from the releases page and install with flatpak install
[–] ruffsl@programming.dev 7 points 3 weeks ago (1 children)

Admittedly, it's pretty niche software. But for those who grew up using equivalents on gaming consoles such as Xbox or PlayStation, it was (still is) a pivotal accessibility feature.

And it's not necessarily only for those with physical disabilities or reflexive motor skill issues. Sometimes you'd like to introduce a really good story based game to a novice player that you know just doesn't have (yet or never) the coordination or muscle memory to complete it.

My grandparents never grew up playing videogames, and some of my nieces and nephews in the family are too young to grasp complex game mechanics. However, all of them really enjoyed playing with a control assist, where they could take the initiative in gameplay, like choosing dialogue options, steering saddled horses, flying broomsticks, exploring the world at their discretion, and I could just coast along in the backseat, fixing their camera angles, steering them back on course when lost, rescuing them in high stake combat encounters, etc.

In some ways, you could think about it as co-oping for single player games, but because it's per controller, you can do the same thing for multiplayer games as well. Like to help level the age gap in PvP games with your older sister versus your younger brother.

Before we ever played with control assist, I tried the classic method of tossing around the one controller like a hot potato, but it's just not the same in a number of ways. For one, having to relinquish a single controller really breaks immersion, as your suddenly fumbling about between living room chairs only your game characters on death's door from an unexpected boss encounter. It also deprives them of that haptics, where they can learn more easily attack patterns or UX interaction that conventionally telegraph via force feedback.

There is perhaps some functionality for solo players as well, such as splitting hand control across multiple gamepads. Like if your hands/arms were of different sizes, or you wanted to play other than with the controller on your lap, you could just easily dual wield controllers mux together the left and right sides-in-reach, or mux a regular handheld gamepad with something more like a Xbox Adaptive Controller for when dexterity or convenience demands.

Although, I think the majority of folks will find the assist co-op scenario for single player games the most appealing aspect. As others have replied on prior release posts, like parents helping their kids through their first playthrough ever, it's really an underrated feature for game consoles, and bringing that to gaming on Linux was really appreciated.

 

Announcing the release of CtrlAssist v0.3.0, which introduces significant new features and usability improvements. CtrlAssist brings "controller assist" functionality to Linux gaming by allowing multiple physical controllers to operate as a single virtual input device. This enables collaborative play and customizable gamepad setups, making it easier for players of all ages and abilities to enjoy games together.

Major Features

System Tray Interface

This release introduces a graphical system tray application that provides desktop integration for managing controller multiplexing. Users can now:

  • Configure primary and assist controller assignments via dropdown menus
  • Start and stop the mux without using the command line
  • Adjust settings through a context menu interface
  • Receive desktop notifications for status changes
  • Persist configuration across sessions

The tray interface supports live reconfiguration of device-invariant settings (mux mode and rumble target) while the mux is running.

Multiple Hiding Strategies

Controller hiding now supports three distinct strategies:

  • None: No hiding, manual configuration required
  • Steam: Automatically manages Steam's controller blacklist via config.vdf modification
  • System: Restricts device permissions system-wide (requires root access)

The Steam hiding strategy enables proper functionality in sandboxed environments without requiring elevated privileges, addressing a key limitation for Flatpak users.

Live Runtime Updates

The mux runtime now supports dynamic reconfiguration without restart for:

  • Mux mode changes (Priority, Average, Toggle)
  • Rumble target adjustments (Primary, Assist, Both, None)

This functionality is available through both the system tray and programmatic (D-BUS) interfaces, allowing users to adapt behavior during gameplay sessions.

Flatpak Distribution

CtrlAssist is now packaged as a Flatpak application with:

  • Automated GitHub Actions workflow for release builds
  • Desktop entry and metainfo for application catalogs
  • Proper sandbox permissions for device access
  • Support for Steam configuration modifications within the sandbox

Flatpak bundles are automatically built and attached to GitHub releases.

Additional Improvements

  • Configuration persistence to $XDG_CONFIG_HOME/ctrlassist/config.toml
  • Controller selection by name with best-effort matching across sessions
  • Enhanced documentation with installation instructions for both Cargo and Flatpak
  • New pixel art banner and application icon (via Aseprite)
  • Improved force feedback device recovery after disconnection
  • Better error handling and user feedback throughout the application

Installation

CtrlAssist v0.3.0 can be installed via:

  • Cargo: cargo install ctrlassist --force
  • Flatpak: Download the bundle from the releases page and install with flatpak install

Full installation instructions are available in the README.

Breaking Changes

The --hide flag now requires an enum value (none, steam, system) instead of being a boolean flag. Users upgrading from v0.2.x should update their scripts accordingly:

  • Previous: ctrlassist mux --hide
  • Current: ctrlassist mux --hide system
 

Announcing the release of CtrlAssist v0.3.0, which introduces significant new features and usability improvements. CtrlAssist brings "controller assist" functionality to Linux gaming by allowing multiple physical controllers to operate as a single virtual input device. This enables collaborative play and customizable gamepad setups, making it easier for players of all ages and abilities to enjoy games together.

Major Features

System Tray Interface

This release introduces a graphical system tray application that provides desktop integration for managing controller multiplexing. Users can now:

  • Configure primary and assist controller assignments via dropdown menus
  • Start and stop the mux without using the command line
  • Adjust settings through a context menu interface
  • Receive desktop notifications for status changes
  • Persist configuration across sessions

The tray interface supports live reconfiguration of device-invariant settings (mux mode and rumble target) while the mux is running.

Multiple Hiding Strategies

Controller hiding now supports three distinct strategies:

  • None: No hiding, manual configuration required
  • Steam: Automatically manages Steam's controller blacklist via config.vdf modification
  • System: Restricts device permissions system-wide (requires root access)

The Steam hiding strategy enables proper functionality in sandboxed environments without requiring elevated privileges, addressing a key limitation for Flatpak users.

Live Runtime Updates

The mux runtime now supports dynamic reconfiguration without restart for:

  • Mux mode changes (Priority, Average, Toggle)
  • Rumble target adjustments (Primary, Assist, Both, None)

This functionality is available through both the system tray and programmatic (D-BUS) interfaces, allowing users to adapt behavior during gameplay sessions.

Flatpak Distribution

CtrlAssist is now packaged as a Flatpak application with:

  • Automated GitHub Actions workflow for release builds
  • Desktop entry and metainfo for application catalogs
  • Proper sandbox permissions for device access
  • Support for Steam configuration modifications within the sandbox

Flatpak bundles are automatically built and attached to GitHub releases.

Additional Improvements

  • Configuration persistence to $XDG_CONFIG_HOME/ctrlassist/config.toml
  • Controller selection by name with best-effort matching across sessions
  • Enhanced documentation with installation instructions for both Cargo and Flatpak
  • New pixel art banner and application icon (via Aseprite)
  • Improved force feedback device recovery after disconnection
  • Better error handling and user feedback throughout the application

Installation

CtrlAssist v0.3.0 can be installed via:

  • Cargo: cargo install ctrlassist --force
  • Flatpak: Download the bundle from the releases page and install with flatpak install

Full installation instructions are available in the README.

Breaking Changes

The --hide flag now requires an enum value (none, steam, system) instead of being a boolean flag. Users upgrading from v0.2.x should update their scripts accordingly:

  • Previous: ctrlassist mux --hide
  • Current: ctrlassist mux --hide system
 

Announcing the release of CtrlAssist v0.3.0, which introduces significant new features and usability improvements. CtrlAssist brings "controller assist" functionality to Linux gaming by allowing multiple physical controllers to operate as a single virtual input device. This enables collaborative play and customizable gamepad setups, making it easier for players of all ages and abilities to enjoy games together.

Major Features

System Tray Interface

This release introduces a graphical system tray application that provides desktop integration for managing controller multiplexing. Users can now:

  • Configure primary and assist controller assignments via dropdown menus
  • Start and stop the mux without using the command line
  • Adjust settings through a context menu interface
  • Receive desktop notifications for status changes
  • Persist configuration across sessions

The tray interface supports live reconfiguration of device-invariant settings (mux mode and rumble target) while the mux is running.

Multiple Hiding Strategies

Controller hiding now supports three distinct strategies:

  • None: No hiding, manual configuration required
  • Steam: Automatically manages Steam's controller blacklist via config.vdf modification
  • System: Restricts device permissions system-wide (requires root access)

The Steam hiding strategy enables proper functionality in sandboxed environments without requiring elevated privileges, addressing a key limitation for Flatpak users.

Live Runtime Updates

The mux runtime now supports dynamic reconfiguration without restart for:

  • Mux mode changes (Priority, Average, Toggle)
  • Rumble target adjustments (Primary, Assist, Both, None)

This functionality is available through both the system tray and programmatic (D-BUS) interfaces, allowing users to adapt behavior during gameplay sessions.

Flatpak Distribution

CtrlAssist is now packaged as a Flatpak application with:

  • Automated GitHub Actions workflow for release builds
  • Desktop entry and metainfo for application catalogs
  • Proper sandbox permissions for device access
  • Support for Steam configuration modifications within the sandbox

Flatpak bundles are automatically built and attached to GitHub releases.

Additional Improvements

  • Configuration persistence to $XDG_CONFIG_HOME/ctrlassist/config.toml
  • Controller selection by name with best-effort matching across sessions
  • Enhanced documentation with installation instructions for both Cargo and Flatpak
  • New pixel art banner and application icon (via Aseprite)
  • Improved force feedback device recovery after disconnection
  • Better error handling and user feedback throughout the application

Installation

CtrlAssist v0.3.0 can be installed via:

  • Cargo: cargo install ctrlassist --force
  • Flatpak: Download the bundle from the releases page and install with flatpak install

Full installation instructions are available in the README.

Breaking Changes

The --hide flag now requires an enum value (none, steam, system) instead of being a boolean flag. Users upgrading from v0.2.x should update their scripts accordingly:

  • Previous: ctrlassist mux --hide
  • Current: ctrlassist mux --hide system
[–] ruffsl@programming.dev 1 points 3 weeks ago

Thank you for all the efforts the admins put into maintaining this place!

[–] ruffsl@programming.dev 1 points 1 month ago

oh, my hand typing was atrocious, that's what I get for not voice dictating with my regular assistive tech.

[–] ruffsl@programming.dev 1 points 1 month ago (1 children)

Indeed it's just a placeholder logo until a real human artist would like to contribute, as I'm no talented graphics designer myself. I still think it serves a purpose to quickly and visually illustrate what the project does, as all of the key words and terminology used by similar efforts never reached a consensus or becoming a household names.

Xbox initially called this Copilot (lol, on brand), Apple calls this buddy mode, PlayStation just filled it under Access™, so something to link words to an intuition is better than nothing at the moment. If you have any suggested SEO for folks to find this is that's what their looking for, let me know. I've been in the trench for too long to know less technical jargon folks would use.

I'm also already transparent in using AI for rubber duck sessions in the public pull requests, so anyone agents AI would already probably object to its origins.

[–] ruffsl@programming.dev 10 points 1 month ago

I'm no graphic artist, and with my disabilities it certainly would have taken me much longer to type out the same docs. Also, emojiis is what I grew up with back when AOL chat and sms char limits where the norm. LLMs have been a boon for assistive technology users, but admittedly a crux for those who less experience in computer science; though not much different from any double edge sword.

[–] ruffsl@programming.dev 16 points 1 month ago (1 children)

Full disclosure AI is used, but I keep all transparent. You can read through GitHub PR reviews I use Copilot to rubber duck with, and committed the No Banana prompt for the banner logo in case folks where curious. I've a disability that impairs my typing, partly the motivation behind developing this projects, so I also use LLM to grammatically correct and format my voice dictated commits and tickets.

 

Excited to announce release v0.2.0 for CtrlAssist, adding rumble pass-through support and significant improvements to controller multiplexing! CtrlAssist brings "controller assist" functionality to Linux gaming by allowing multiple physical controllers to operate as a single virtual input device. This enables collaborative play and customizable gamepad setups, making it easier for players of all ages and abilities to enjoy games together.

🎯 What's New

Rumble Pass-Through

Force feedback can now be forwarded to paired physical controllers! Configure which controller(s) receive rumble effects—route them to Primary, Assist, both, or neither. Share every haptic encounter from turbulence, engine failure, and hard landings with your co-pilot. Even better: if a controller disconnects mid-game (swapping batteries, USB cords, etc.), CtrlAssist automatically recovers and restores all force feedback effects when it reconnects.

Smoother Input Transitions

All assist modes now feature improved synchronization for more natural gameplay:

  • Joysticks snap cleanly: When assistance begins or ends, both X and Y axes update together—no more jarring diagonal-to-cardinal transitions
  • Toggle mode syncs instantly: Switching between Primary and Assist now mirrors the active controller's complete current state, eliminating phantom inputs from buttons or sticks that were held during the switch

Better Device Discovery

Controllers device trees are now discovered more reliably, preventing edge cases where multiple similar devices could cause conflicts. This also improves device hiding and rumble pass-through selection.

🛠️ Under the Hood

  • Refactored input handling for consistency across all three modes
  • Fixed button mapping quirks across physical and virtual device boundaries
  • Improved error handling and logging for edge cases and issue reporting
  • More graceful shutdown on Ctrl+C with robust cleanup

📦 Install and Upgrade

cargo install ctrlassist --force

Full changelog available at the GitHub release page.


Note: If you have experience with Arch or modding SteamOS, I could use also some help in fixing/documenting SteamDeck support, as I've not the hardware on hand and most of my Linux development has been on NixOS and Ubuntu thus far:

 

Excited to announce release v0.2.0 for CtrlAssist, adding rumble pass-through support and significant improvements to controller multiplexing! CtrlAssist brings "controller assist" functionality to Linux gaming by allowing multiple physical controllers to operate as a single virtual input device. This enables collaborative play and customizable gamepad setups, making it easier for players of all ages and abilities to enjoy games together.

🎯 What's New

Rumble Pass-Through

Force feedback can now be forwarded to paired physical controllers! Configure which controller(s) receive rumble effects—route them to Primary, Assist, both, or neither. Share every haptic encounter from turbulence, engine failure, and hard landings with your co-pilot. Even better: if a controller disconnects mid-game (swapping batteries, USB cords, etc.), CtrlAssist automatically recovers and restores all force feedback effects when it reconnects.

Smoother Input Transitions

All assist modes now feature improved synchronization for more natural gameplay:

  • Joysticks snap cleanly: When assistance begins or ends, both X and Y axes update together—no more jarring diagonal-to-cardinal transitions
  • Toggle mode syncs instantly: Switching between Primary and Assist now mirrors the active controller's complete current state, eliminating phantom inputs from buttons or sticks that were held during the switch

Better Device Discovery

Controllers device trees are now discovered more reliably, preventing edge cases where multiple similar devices could cause conflicts. This also improves device hiding and rumble pass-through selection.

🛠️ Under the Hood

  • Refactored input handling for consistency across all three modes
  • Fixed button mapping quirks across physical and virtual device boundaries
  • Improved error handling and logging for edge cases and issue reporting
  • More graceful shutdown on Ctrl+C with robust cleanup

📦 Install and Upgrade

cargo install ctrlassist --force

Full changelog available at the GitHub release page.


Note: If you have experience with Arch or modding SteamOS, I could use also some help in fixing/documenting SteamDeck support, as I've not the hardware on hand and most of my Linux development has been on NixOS and Ubuntu thus far:

 

Excited to announce release v0.2.0 for CtrlAssist, adding rumble pass-through support and significant improvements to controller multiplexing! CtrlAssist brings "controller assist" functionality to Linux gaming by allowing multiple physical controllers to operate as a single virtual input device. This enables collaborative play and customizable gamepad setups, making it easier for players of all ages and abilities to enjoy games together.

🎯 What's New

Rumble Pass-Through

Force feedback can now be forwarded to paired physical controllers! Configure which controller(s) receive rumble effects—route them to Primary, Assist, both, or neither. Share every haptic encounter from turbulence, engine failure, and hard landings with your co-pilot. Even better: if a controller disconnects mid-game (swapping batteries, USB cords, etc.), CtrlAssist automatically recovers and restores all force feedback effects when it reconnects.

Smoother Input Transitions

All assist modes now feature improved synchronization for more natural gameplay:

  • Joysticks snap cleanly: When assistance begins or ends, both X and Y axes update together—no more jarring diagonal-to-cardinal transitions
  • Toggle mode syncs instantly: Switching between Primary and Assist now mirrors the active controller's complete current state, eliminating phantom inputs from buttons or sticks that were held during the switch

Better Device Discovery

Controllers device trees are now discovered more reliably, preventing edge cases where multiple similar devices could cause conflicts. This also improves device hiding and rumble pass-through selection.

🛠️ Under the Hood

  • Refactored input handling for consistency across all three modes
  • Fixed button mapping quirks across physical and virtual device boundaries
  • Improved error handling and logging for edge cases and issue reporting
  • More graceful shutdown on Ctrl+C with robust cleanup

📦 Install and Upgrade

cargo install ctrlassist --force

Full changelog available at the GitHub release page.


Note: If you have experience with Arch or modding SteamOS, I could use also some help in fixing/documenting SteamDeck support, as I've not the hardware on hand and most of my Linux development has been on NixOS and Ubuntu thus far:

[–] ruffsl@programming.dev 7 points 1 month ago

Indeed, I've encountered a few games on Steam that gracefully switch multiple controllers, but only by giving exclusive input on a first come-first-serve bases (i.e. which ever controller moves first after some cool down of inactivity from both). Hollow Knight: Silksong being one such example, as I couldn't necessarily drive separate axis from different controllers simultaneously, thus one such motivation for passing the game only one virtual controller and optionally hiding the rest to avoid input conflicts.

I'd be happy if Steam were to adopt such an accessibility feature into Steam input directly, much like Xbox and PlayStation. Perhaps they'll take more of an interest in multi controller configurations with the upcoming refresh of the Steam Controller, given the wireless dongle is meant for multi device pairing.

 

CtrlAssist – an open source project to bring more accessible, collaborative gaming to Linux! Inspired by PC gaming sessions with my own family, where both young and old relish exploring rich stories with immersive worlds (like Witcher 3, RDR3, Hogwarts Legacy, etc) but find coordinated combat or movement control too challenging to play solo, CtrlAssist lets you combine multiple controllers into one virtual gamepad, much like assist features on dedicated game consoles.

Whether your helping grandparents through tough boss fights, or co-oping with nieces and nephews to level age gaps, CtrlAssist aims to make PC gaming on Linux fun and accessible for everyone. While I’m certain similar utilities exist, I also just wanted a holiday hobby project to practice Rust development while scratching a personal itch.

Please give it a try, share your feedback in the relevant discussion categories, or check out the open issues if you’d like to contribute, help is always welcome!

#RustLang #LinuxGaming #Accessibility #OpenSource #CtrlAssist

[–] ruffsl@programming.dev 1 points 1 month ago

Not sure if something like that would even support x86 or C99, so would probably still need an older mainframe and early GCC source tree. Could probably get by with a virtual emulator for the former.

[–] ruffsl@programming.dev 1 points 2 months ago

Would be good to cross post this to:
https://programming.dev/c/nix

view more: next ›