From 55c9811a2b747c4e4a6e4744457f4e78ce6a01cc Mon Sep 17 00:00:00 2001 From: slprime <31038811+slprime@users.noreply.github.com> Date: Fri, 25 Sep 2026 22:17:38 +0300 Subject: [PATCH] Fix search autofocus losing the first typed character (#1045) --- .../java/codechicken/nei/AutoFocusWidget.java | 81 ++++++++++++++++--- .../java/codechicken/nei/LayoutManager.java | 2 + 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/src/main/java/codechicken/nei/AutoFocusWidget.java b/src/main/java/codechicken/nei/AutoFocusWidget.java index e0b553ef..583e1275 100644 --- a/src/main/java/codechicken/nei/AutoFocusWidget.java +++ b/src/main/java/codechicken/nei/AutoFocusWidget.java @@ -7,8 +7,10 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.settings.GameSettings; +import net.minecraft.util.ChatAllowedCharacters; import org.lwjgl.input.Keyboard; @@ -30,6 +32,8 @@ public class AutoFocusWidget implements IContainerInputHandler { protected boolean autofocus = false; protected Point mouse; + protected Point pendingMouse; + protected GuiTextField textInputHolder; public AutoFocusWidget() { GuiContainerManager.addInputHandler(this); @@ -38,32 +42,83 @@ public class AutoFocusWidget implements IContainerInputHandler { public void load(GuiContainer gui) { this.autofocus = LayoutManager.searchField.isVisible() && NEIClientConfig.searchWidgetAutofocus() != 0 && isAllowedGuiAutoSearchFocus(gui); - this.mouse = getMousePosition(); + this.mouse = null; + this.pendingMouse = null; + + if (this.autofocus) { + beginTextInput(); + } + } + + protected void beginTextInput() { + if (this.textInputHolder == null) { + this.textInputHolder = new GuiTextField(Minecraft.getMinecraft().fontRenderer, 0, 0, 0, 0); + } + + this.textInputHolder.setFocused(true); + } + + protected void endTextInput() { + if (this.textInputHolder != null) { + this.textInputHolder.setFocused(false); + } + } + + public void guiTick() { + if (!this.autofocus) { + return; + } + + final Point current = getMousePosition(); + + if (this.mouse == null) { + if (current.equals(this.pendingMouse)) { + this.mouse = current; + } + + this.pendingMouse = current; + } else if (!this.mouse.equals(current)) { + cancel(); + } + } + + protected void cancel() { + if (this.autofocus) { + this.autofocus = false; + endTextInput(); + } } @Override public boolean keyTyped(GuiContainer gui, char keyChar, int keyCode) { if (this.autofocus) { - this.autofocus = false; - - if (!this.mouse.equals(getMousePosition())) { - return false; - } if (NEIClientConfig.searchWidgetAutofocus() == 2 && GameSettings.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindInventory)) { + cancel(); return false; } if (keyCode == Keyboard.KEY_RETURN || keyCode == Keyboard.KEY_NUMPADENTER || keyCode == Keyboard.KEY_ESCAPE) { + cancel(); return false; } + if (!ChatAllowedCharacters.isAllowedCharacter(keyChar)) { + return false; + } + + this.autofocus = false; + LayoutManager.searchField.setFocus(true); + endTextInput(); + + final String oldText = LayoutManager.searchField.text(); LayoutManager.searchField.handleKeyPress(keyCode, keyChar); - return true; + + return !LayoutManager.searchField.text().equals(oldText); } return false; @@ -76,13 +131,13 @@ public class AutoFocusWidget implements IContainerInputHandler { @Override public boolean mouseClicked(GuiContainer gui, int mousex, int mousey, int button) { - this.autofocus = false; + cancel(); return false; } @Override public boolean mouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) { - this.autofocus = false; + cancel(); return false; } @@ -91,22 +146,22 @@ public class AutoFocusWidget implements IContainerInputHandler { @Override public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) { - this.autofocus = false; + cancel(); } @Override public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime) { - this.autofocus = false; + cancel(); } @Override public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) { - this.autofocus = false; + cancel(); } @Override public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button) { - this.autofocus = false; + cancel(); } protected boolean isAllowedGuiAutoSearchFocus(GuiContainer gui) { diff --git a/src/main/java/codechicken/nei/LayoutManager.java b/src/main/java/codechicken/nei/LayoutManager.java index bb10c9d6..9db9e197 100644 --- a/src/main/java/codechicken/nei/LayoutManager.java +++ b/src/main/java/codechicken/nei/LayoutManager.java @@ -803,6 +803,8 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH if (!isEnabled()) return; + AutoFocusWidget.instance.guiTick(); + for (Widget widget : drawWidgets) widget.update(); }