Adding SDL_HINT_IME_PAN_PADDING "SDL_IME_PAN_PADDING".

Controls the padding between TextInputArea and IME and defaults to 0.
This commit is contained in:
DominusExult 2026-02-13 16:09:22 +01:00
parent 4e2fd57e77
commit a5134cdf3f
3 changed files with 41 additions and 5 deletions

View file

@ -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;

View file

@ -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.

View file

@ -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;