From bafc614946979d3a058fcc90613ddf6b7cd1931b Mon Sep 17 00:00:00 2001 From: Riccardo Balbo Date: Tue, 23 Jun 2026 00:26:56 +0200 Subject: [PATCH 1/4] disable mac press and hold behavior --- jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java index 1396e8682d..8b51c71642 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java @@ -293,6 +293,7 @@ protected void createContext(final AppSettings settings) { useAngle = AppSettings.ANGLE_GLES3.equals(settings.getRenderer()); configureVideoDriverHints(settings); configureOpenGLDriverHints(settings); + SDL_SetHint(SDL_HINT_MAC_PRESS_AND_HOLD, "0"); if (!SDL_InitSubSystem(SDL_WINDOW_SUBSYSTEM_FLAGS)) { throw new IllegalStateException("Unable to initialize SDL video subsystem: " + SDL_GetError()); From 19d4247552651c2db321aa6c417fde08b5808caa Mon Sep 17 00:00:00 2001 From: Riccardo Balbo Date: Tue, 23 Jun 2026 19:14:43 +0200 Subject: [PATCH 2/4] Revert "disable mac press and hold behavior" This reverts commit bafc614946979d3a058fcc90613ddf6b7cd1931b. --- jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java index 8b51c71642..1396e8682d 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java @@ -293,7 +293,6 @@ protected void createContext(final AppSettings settings) { useAngle = AppSettings.ANGLE_GLES3.equals(settings.getRenderer()); configureVideoDriverHints(settings); configureOpenGLDriverHints(settings); - SDL_SetHint(SDL_HINT_MAC_PRESS_AND_HOLD, "0"); if (!SDL_InitSubSystem(SDL_WINDOW_SUBSYSTEM_FLAGS)) { throw new IllegalStateException("Unable to initialize SDL video subsystem: " + SDL_GetError()); From bc8f9c2a301bab7d1779d579fc7b49ad355453d2 Mon Sep 17 00:00:00 2001 From: Riccardo Balbo Date: Tue, 23 Jun 2026 19:21:07 +0200 Subject: [PATCH 3/4] use SDL_GetKeyFromScancode instead of SDL_EVENT_TEXT_INPUT for keychar --- .../com/jme3/input/lwjgl/SdlKeyInput.java | 39 ++++--------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/SdlKeyInput.java b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/SdlKeyInput.java index ccce791a98..b4195e519b 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/SdlKeyInput.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/SdlKeyInput.java @@ -68,8 +68,6 @@ public void initialize() { if (!context.isRenderable()) { return; } - // Text input events are delivered through SDL_EVENT_TEXT_INPUT. - SDL_StartTextInput(context.getWindowHandle()); initialized = true; LOGGER.fine("SDL keyboard created."); } @@ -78,7 +76,8 @@ public void resetContext() { if (!context.isRenderable()) { return; } - SDL_StartTextInput(context.getWindowHandle()); + // nothing to do here + } public void onSDLEvent(SDL_Event event) { @@ -90,34 +89,13 @@ public void onSDLEvent(SDL_Event event) { } final int jmeKey = SdlKeyMap.toJmeKeyCode(key.scancode()); - final KeyInputEvent keyEvent = new KeyInputEvent(jmeKey, '\0', key.down(), key.repeat()); + final int sdlKey = SDL_GetKeyFromScancode(key.scancode(), key.mod(), true); + final char keyChar = sdlKey > 0 && sdlKey <= Character.MAX_VALUE && !Character.isISOControl((char) sdlKey) + ? (char) sdlKey + : '\0'; + final KeyInputEvent keyEvent = new KeyInputEvent(jmeKey, keyChar, key.down(), key.repeat()); keyEvent.setTime(key.timestamp()); keyInputEvents.add(keyEvent); - return; - } - - if (type == SDL_EVENT_TEXT_INPUT) { - if (event.text().windowID() != context.getWindowId()) { - return; - } - - final String text = event.text().textString(); - if (text == null || text.isEmpty()) { - return; - } - - for (int i = 0; i < text.length(); i++) { - final char keyChar = text.charAt(i); - final long time = event.text().timestamp(); - - KeyInputEvent pressed = new KeyInputEvent(KeyInput.KEY_UNKNOWN, keyChar, true, false); - pressed.setTime(time); - keyInputEvents.add(pressed); - - KeyInputEvent released = new KeyInputEvent(KeyInput.KEY_UNKNOWN, keyChar, false, false); - released.setTime(time); - keyInputEvents.add(released); - } } } @@ -146,9 +124,6 @@ public void update() { @Override public void destroy() { - if (context.isRenderable()) { - SDL_StopTextInput(context.getWindowHandle()); - } keyInputEvents.clear(); initialized = false; LOGGER.fine("SDL keyboard destroyed."); From 77286a0e6e37d82a79533329f480f14685650640 Mon Sep 17 00:00:00 2001 From: Riccardo Balbo Date: Tue, 23 Jun 2026 19:59:44 +0200 Subject: [PATCH 4/4] use SDL_GetKeyFromScancode instead of SDL_EVENT_TEXT_INPUT for keychar in ios --- gradle/libs.versions.toml | 2 +- .../com/jme3/input/ios/IosInputHandler.java | 30 +++++-------------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 105ed8fb9a..a46b6d45e2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,7 @@ checkstyle = "13.3.0" jacoco = "0.8.12" lwjgl3 = "3.4.1" angle = "2026-05-09" -libjglios = "0.6" +libjglios = "0.7" saferalloc = "0.0.10" nifty = "1.4.3" spotbugs = "4.9.8" diff --git a/jme3-ios/src/main/java/com/jme3/input/ios/IosInputHandler.java b/jme3-ios/src/main/java/com/jme3/input/ios/IosInputHandler.java index fea1f1c917..b9abb614f2 100644 --- a/jme3-ios/src/main/java/com/jme3/input/ios/IosInputHandler.java +++ b/jme3-ios/src/main/java/com/jme3/input/ios/IosInputHandler.java @@ -1,7 +1,6 @@ package com.jme3.input.ios; import com.jme3.input.RawInputListener; -import com.jme3.input.KeyInput; import com.jme3.input.MouseInput; import com.jme3.input.TouchInput; import com.jme3.input.event.InputEvent; @@ -15,6 +14,8 @@ import java.util.logging.Logger; import org.ngengine.libjglios.core.LibJGLIOSInputBridge; +import static org.ngengine.libjglios.sdl3.SDL3.SDL_GetKeyFromScancode; + public class IosInputHandler implements TouchInput { private static final Logger logger = Logger.getLogger(IosInputHandler.class.getName()); @@ -49,7 +50,7 @@ private int toJmeMouseButton(int sdlButton) { } private int width = 0; private int height = 0; - private final int[] nativeIntData = new int[4]; + private final int[] nativeIntData = new int[5]; private final float[] nativeFloatData = new float[4]; public IosInputHandler() { @@ -277,27 +278,18 @@ void dispatchBridgeEvent(int[] intData, float[] floatData, long time) { break; case LibJGLIOSInputBridge.EVENT_KEY: IosJoyInput.dispatchKeyboardInput(); + int sdlKey = SDL_GetKeyFromScancode(intData[1], intData[4], true); + char keyChar = sdlKey > 0 && sdlKey <= Character.MAX_VALUE && !Character.isISOControl((char) sdlKey) + ? (char) sdlKey + : '\0'; KeyInputEvent key = new KeyInputEvent( IosSdlKeyMap.toJmeKeyCode(intData[1]), - '\0', + keyChar, intData[2] != 0, intData[3] != 0); key.setTime(time); addEvent(key); break; - case LibJGLIOSInputBridge.EVENT_TEXT_INPUT: - if (!isSingleCharTextInput(intData[1])) { - break; - } - IosJoyInput.dispatchKeyboardInput(); - KeyInputEvent text = new KeyInputEvent( - KeyInput.KEY_UNKNOWN, - (char) intData[1], - true, - false); - text.setTime(time); - addEvent(text); - break; case LibJGLIOSInputBridge.EVENT_GAMEPAD_ADDED: case LibJGLIOSInputBridge.EVENT_GAMEPAD_REMOVED: case LibJGLIOSInputBridge.EVENT_GAMEPAD_AXIS: @@ -352,10 +344,4 @@ private float mouseDeltaY(float value) { private boolean isNormalized(float value) { return value >= 0f && value <= 1f; } - - private boolean isSingleCharTextInput(int codePoint) { - return codePoint > 0 - && codePoint <= Character.MAX_VALUE - && !Character.isSurrogate((char) codePoint); - } }