From a5134cdf3fb96629b60f3fa6dc9f05db42ef1740 Mon Sep 17 00:00:00 2001 From: DominusExult Date: Fri, 13 Feb 2026 16:09:22 +0100 Subject: [PATCH] Adding SDL_HINT_IME_PAN_PADDING "SDL_IME_PAN_PADDING". Controls the padding between TextInputArea and IME and defaults to 0. --- .../main/java/org/libsdl/app/SDLActivity.java | 19 +++++++++++++++---- include/SDL3/SDL_hints.h | 17 +++++++++++++++++ src/video/uikit/SDL_uikitviewcontroller.m | 10 +++++++++- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java index a8ae227b84..d72ac52f24 100644 --- a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java +++ b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java @@ -1388,10 +1388,20 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh * the bottom edge of the input region and the top edge of an input * method (soft keyboard) */ - static final int HEIGHT_PADDING = 15; + static int getPanPadding() { + try { + String hint = nativeGetHint("SDL_IME_PAN_PADDING"); + if (hint != null) { + return Integer.parseInt(hint); + } + } catch (NumberFormatException ignored) { + } + return 0; + } public int input_type; public int x, y, w, h; + private final int panPadding; public ShowTextInputTask(int input_type, int x, int y, int w, int h) { this.input_type = input_type; @@ -1399,19 +1409,20 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh this.y = y; this.w = w; this.h = h; + this.panPadding = getPanPadding(); /* Minimum size of 1 pixel, so it takes focus. */ if (this.w <= 0) { this.w = 1; } - if (this.h + HEIGHT_PADDING <= 0) { - this.h = 1 - HEIGHT_PADDING; + if (this.h + panPadding <= 0) { + this.h = 1 - panPadding; } } @Override public void run() { - RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(w, h + HEIGHT_PADDING); + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(w, h + panPadding); params.leftMargin = x; params.topMargin = y; diff --git a/include/SDL3/SDL_hints.h b/include/SDL3/SDL_hints.h index 992243853f..158ea3185b 100644 --- a/include/SDL3/SDL_hints.h +++ b/include/SDL3/SDL_hints.h @@ -1219,6 +1219,23 @@ extern "C" { */ #define SDL_HINT_IME_IMPLEMENTED_UI "SDL_IME_IMPLEMENTED_UI" +/** + * A variable controlling the padding in pixels added above the on-screen + * keyboard to keep the text input area visible. + * + * This padding is used on platforms with on-screen keyboards (iOS, Android) + * to ensure there is extra breathing room between the text input area and + * the top of the keyboard when panning the view. + * + * The variable can be set to a number representing the padding in pixels. + * The default value is "0". + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.6.0. + */ +#define SDL_HINT_IME_PAN_PADDING "SDL_IME_PAN_PADDING" + /** * A variable controlling whether the home indicator bar on iPhone X and later * should be hidden. diff --git a/src/video/uikit/SDL_uikitviewcontroller.m b/src/video/uikit/SDL_uikitviewcontroller.m index ffb822d919..5e272a27fa 100644 --- a/src/video/uikit/SDL_uikitviewcontroller.m +++ b/src/video/uikit/SDL_uikitviewcontroller.m @@ -642,7 +642,15 @@ static void SDLCALL SDL_HideHomeIndicatorHintChanged(void *userdata, const char #endif if (self.keyboardHeight && self.textInputRect.h) { - int rectbottom = (int)(self.textInputRect.y + self.textInputRect.h); + /* Get the pan padding from the hint (in pixels). The text input rect + * and view bounds are in UIKit points, so divide by the scale factor + * to keep the visual gap consistent across platforms. + * The iOS IME seems to apply a 15 pixel padding, so to keep it consistent + * with Android we subtract 15 pixels here. */ + const char *hint = SDL_GetHint(SDL_HINT_IME_PAN_PADDING); + int panPadding = (hint && *hint) ? SDL_atoi(hint) : 0; + int padding = (int)((panPadding - 15) / self.view.contentScaleFactor); + int rectbottom = (int)(self.textInputRect.y + self.textInputRect.h + padding); int keybottom = (int)(self.view.bounds.size.height - self.keyboardHeight); if (keybottom < rectbottom) { offset.y = keybottom - rectbottom;