diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/EditBoxMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/EditBoxMixin.java new file mode 100644 index 0000000..ccd9b93 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/EditBoxMixin.java @@ -0,0 +1,18 @@ +package dev.isxander.controlify.mixins.feature.screenop.vanilla; + +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessorProvider; +import dev.isxander.controlify.screenop.compat.vanilla.EditBoxComponentProcessor; +import net.minecraft.client.gui.components.EditBox; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(EditBox.class) +public class EditBoxMixin implements ComponentProcessorProvider { + @Unique private final ComponentProcessor processor = new EditBoxComponentProcessor(); + + @Override + public ComponentProcessor componentProcessor() { + return processor; + } +} diff --git a/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java index c34745e..ee82599 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java @@ -16,6 +16,10 @@ public interface ComponentProcessor extends ComponentProcessorProvider { default void onFocusGained(ScreenProcessor screen, Controller controller) { } + default boolean shouldKeepFocusOnKeyboardMode(ScreenProcessor screen) { + return false; + } + @Override default ComponentProcessor componentProcessor() { return this; diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java index e8aaa13..bbc9924 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java @@ -65,10 +65,10 @@ public class ScreenProcessor { public void onInputModeChanged(InputMode mode) { switch (mode) { case KEYBOARD_MOUSE -> { - boolean focusingEditBox = getFocusTree().stream() - .anyMatch(component -> component instanceof EditBox); + boolean shouldKeepFocus = getFocusTree().stream() + .anyMatch(component -> ComponentProcessorProvider.provide(component).shouldKeepFocusOnKeyboardMode(this)); - if (!focusingEditBox) { + if (!shouldKeepFocus) { ((ScreenAccessor) screen).invokeClearFocus(); } } diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/EditBoxComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/EditBoxComponentProcessor.java new file mode 100644 index 0000000..cb962aa --- /dev/null +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/EditBoxComponentProcessor.java @@ -0,0 +1,11 @@ +package dev.isxander.controlify.screenop.compat.vanilla; + +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ScreenProcessor; + +public class EditBoxComponentProcessor implements ComponentProcessor { + @Override + public boolean shouldKeepFocusOnKeyboardMode(ScreenProcessor screen) { + return true; + } +} diff --git a/src/main/resources/controlify.mixins.json b/src/main/resources/controlify.mixins.json index d8871fb..5c47581 100644 --- a/src/main/resources/controlify.mixins.json +++ b/src/main/resources/controlify.mixins.json @@ -67,6 +67,7 @@ "feature.screenop.vanilla.CreateWorldScreenMixin", "feature.screenop.vanilla.CreativeModeInventoryScreenAccessor", "feature.screenop.vanilla.CreativeModeInventoryScreenMixin", + "feature.screenop.vanilla.EditBoxMixin", "feature.screenop.vanilla.JoinMultiplayerScreenAccessor", "feature.screenop.vanilla.JoinMultiplayerScreenMixin", "feature.screenop.vanilla.LanguageSelectionListEntryMixin",