Add global option to disable automatic controller switching#796
Open
adamrb wants to merge 4 commits intoisXander:multiversion/devfrom
Open
Add global option to disable automatic controller switching#796adamrb wants to merge 4 commits intoisXander:multiversion/devfrom
adamrb wants to merge 4 commits intoisXander:multiversion/devfrom
Conversation
The automatic controller switching behavior (where the active controller switches to whichever last provided input) makes it impossible to run multiple game instances side-by-side with different controllers. This adds a toggleable "Auto-Switch Controllers" option in global settings (default: enabled) that gates the tickInactiveController() loop. When disabled, a "Current Controller" dropdown appears allowing manual controller selection. The dropdown dynamically refreshes on controller hotplug events by rebuilding the settings screen.
isXander
requested changes
Feb 24, 2026
src/main/java/dev/isxander/controlify/gui/screen/GlobalSettingsScreenFactory.java
Outdated
Show resolved
Hide resolved
src/main/java/dev/isxander/controlify/config/dto/GlobalConfig.java
Outdated
Show resolved
Hide resolved
When auto-switch is disabled, the manually selected controller is now saved as preferredControllerUid in the config. On game startup or controller hotplug, the preferred controller is automatically restored if available. The preference is only updated from the UI dropdown to avoid being overwritten by fallback selections on disconnect.
- Revert version bump in gradle.properties - Move auto-switch guard inside tickInactiveController() so inactive controllers still get ticked - Remove memory-leaking event listeners from GlobalSettingsScreenFactory - Replace optionalFieldOf with proper DataFixer migration (schema v2) that adds auto_switch_controllers and preferred_controller_uid defaults
…/auto-switch-controllers-toggle
isXander
requested changes
Feb 26, 2026
Comment on lines
+32
to
+37
| if (global.get("auto_switch_controllers").result().isEmpty()) { | ||
| global = global.set("auto_switch_controllers", root.createBoolean(true)); | ||
| } | ||
| if (global.get("preferred_controller_uid").result().isEmpty()) { | ||
| global = global.set("preferred_controller_uid", root.createString("")); | ||
| } |
Owner
There was a problem hiding this comment.
Single source of truth.
Allow this fix to take the GlobalSettings in its constructor, and refer to the defaults that way, rather than providing them again here.
| if (selector != null) selector.setAvailable(!opt.pendingValue()); | ||
| }) | ||
| .build()) | ||
| .option(Util.make(() -> { |
Owner
There was a problem hiding this comment.
.option has a supplier overload. no need for Util.make here
| .text(Component.translatable("controlify.gui.current_controller.tooltip")) | ||
| .build()) | ||
| .binding( | ||
| "", |
Owner
There was a problem hiding this comment.
a comment or two for future reference explaining what an empty string represents'd be good
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Motivation
The automatic controller switching makes it impossible to run multiple game instances side-by-side with different controllers, since pressing a button on controller B in one instance causes the other instance to also switch to controller B.
Implementation notes
tickInactiveController()so inactive controllers still get ticked for state trackingTest plan
preferred_controller_uid)