Skip to content

Commit 1871b99

Browse files
committed
Added SDL_EVENT_SCREEN_KEYBOARD_SHOWN and SDL_EVENT_SCREEN_KEYBOARD_HIDDEN
Fixes #13049
1 parent 5441d33 commit 1871b99

29 files changed

+110
-121
lines changed

android-project/app/proguard-rules.pro

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
boolean isAndroidTV();
3131
boolean isChromebook();
3232
boolean isDeXMode();
33-
boolean isScreenKeyboardShown();
3433
boolean isTablet();
3534
void manualBackButton();
3635
int messageboxShowMessageBox(int, java.lang.String, java.lang.String, int[], int[], java.lang.String[], int[]);

android-project/app/src/main/java/org/libsdl/app/SDLActivity.java

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ public enum NativeState {
215215
protected static SDLActivity mSingleton;
216216
protected static SDLSurface mSurface;
217217
protected static SDLDummyEdit mTextEdit;
218-
protected static boolean mScreenKeyboardShown;
219218
protected static ViewGroup mLayout;
220219
protected static SDLClipboardHandler mClipboardHandler;
221220
protected static Hashtable<Integer, PointerIcon> mCursors;
@@ -951,7 +950,7 @@ public void handleMessage(Message msg) {
951950
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
952951
imm.hideSoftInputFromWindow(mTextEdit.getWindowToken(), 0);
953952

954-
mScreenKeyboardShown = false;
953+
onNativeScreenKeyboardHidden();
955954

956955
mSurface.requestFocus();
957956
}
@@ -1070,6 +1069,8 @@ public static native void onNativeTouch(int touchDevId, int pointerFingerId,
10701069
public static native void onNativeSurfaceCreated();
10711070
public static native void onNativeSurfaceChanged();
10721071
public static native void onNativeSurfaceDestroyed();
1072+
public static native void onNativeScreenKeyboardShown();
1073+
public static native void onNativeScreenKeyboardHidden();
10731074
public static native String nativeGetHint(String name);
10741075
public static native boolean nativeGetHintBoolean(String name, boolean default_value);
10751076
public static native void nativeSetenv(String name, String value);
@@ -1205,24 +1206,6 @@ public static boolean shouldMinimizeOnFocusLoss() {
12051206
return false;
12061207
}
12071208

1208-
/**
1209-
* This method is called by SDL using JNI.
1210-
*/
1211-
public static boolean isScreenKeyboardShown()
1212-
{
1213-
if (mTextEdit == null) {
1214-
return false;
1215-
}
1216-
1217-
if (!mScreenKeyboardShown) {
1218-
return false;
1219-
}
1220-
1221-
InputMethodManager imm = (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
1222-
return imm.isAcceptingText();
1223-
1224-
}
1225-
12261209
/**
12271210
* This method is called by SDL using JNI.
12281211
*/
@@ -1442,7 +1425,9 @@ public void run() {
14421425
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
14431426
imm.showSoftInput(mTextEdit, 0);
14441427

1445-
mScreenKeyboardShown = true;
1428+
if (imm.isAcceptingText()) {
1429+
onNativeScreenKeyboardShown();
1430+
}
14461431
}
14471432
}
14481433

include/SDL3/SDL_events.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ typedef enum SDL_EventType
176176
SDL_EVENT_KEYBOARD_ADDED, /**< A new keyboard has been inserted into the system */
177177
SDL_EVENT_KEYBOARD_REMOVED, /**< A keyboard has been removed */
178178
SDL_EVENT_TEXT_EDITING_CANDIDATES, /**< Keyboard text editing candidates */
179+
SDL_EVENT_SCREEN_KEYBOARD_SHOWN, /**< The on-screen keyboard has been shown */
180+
SDL_EVENT_SCREEN_KEYBOARD_HIDDEN, /**< The on-screen keyboard has been hidden */
179181

180182
/* Mouse events */
181183
SDL_EVENT_MOUSE_MOTION = 0x400, /**< Mouse moved */

src/core/android/SDL_android.c

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(
9696
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceDestroyed)(
9797
JNIEnv *env, jclass jcls);
9898

99+
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeScreenKeyboardShown)(
100+
JNIEnv *env, jclass jcls);
101+
102+
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeScreenKeyboardHidden)(
103+
JNIEnv *env, jclass jcls);
104+
99105
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyDown)(
100106
JNIEnv *env, jclass jcls,
101107
jint keycode);
@@ -208,6 +214,8 @@ static JNINativeMethod SDLActivity_tab[] = {
208214
{ "onNativeSurfaceCreated", "()V", SDL_JAVA_INTERFACE(onNativeSurfaceCreated) },
209215
{ "onNativeSurfaceChanged", "()V", SDL_JAVA_INTERFACE(onNativeSurfaceChanged) },
210216
{ "onNativeSurfaceDestroyed", "()V", SDL_JAVA_INTERFACE(onNativeSurfaceDestroyed) },
217+
{ "onNativeScreenKeyboardShown", "()V", SDL_JAVA_INTERFACE(onNativeScreenKeyboardShown) },
218+
{ "onNativeScreenKeyboardHidden", "()V", SDL_JAVA_INTERFACE(onNativeScreenKeyboardHidden) },
211219
{ "onNativeKeyDown", "(I)V", SDL_JAVA_INTERFACE(onNativeKeyDown) },
212220
{ "onNativeKeyUp", "(I)V", SDL_JAVA_INTERFACE(onNativeKeyUp) },
213221
{ "onNativeSoftReturnKey", "()Z", SDL_JAVA_INTERFACE(onNativeSoftReturnKey) },
@@ -352,7 +360,6 @@ static jmethodID midInitTouch;
352360
static jmethodID midIsAndroidTV;
353361
static jmethodID midIsChromebook;
354362
static jmethodID midIsDeXMode;
355-
static jmethodID midIsScreenKeyboardShown;
356363
static jmethodID midIsTablet;
357364
static jmethodID midManualBackButton;
358365
static jmethodID midMinimizeWindow;
@@ -642,7 +649,6 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(JNIEnv *env, jclass cl
642649
midIsAndroidTV = (*env)->GetStaticMethodID(env, mActivityClass, "isAndroidTV", "()Z");
643650
midIsChromebook = (*env)->GetStaticMethodID(env, mActivityClass, "isChromebook", "()Z");
644651
midIsDeXMode = (*env)->GetStaticMethodID(env, mActivityClass, "isDeXMode", "()Z");
645-
midIsScreenKeyboardShown = (*env)->GetStaticMethodID(env, mActivityClass, "isScreenKeyboardShown", "()Z");
646652
midIsTablet = (*env)->GetStaticMethodID(env, mActivityClass, "isTablet", "()Z");
647653
midManualBackButton = (*env)->GetStaticMethodID(env, mActivityClass, "manualBackButton", "()V");
648654
midMinimizeWindow = (*env)->GetStaticMethodID(env, mActivityClass, "minimizeWindow", "()V");
@@ -675,7 +681,6 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(JNIEnv *env, jclass cl
675681
!midIsAndroidTV ||
676682
!midIsChromebook ||
677683
!midIsDeXMode ||
678-
!midIsScreenKeyboardShown ||
679684
!midIsTablet ||
680685
!midManualBackButton ||
681686
!midMinimizeWindow ||
@@ -1242,6 +1247,10 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(JNIEnv *env, j
12421247
}
12431248
#endif
12441249

1250+
if (Android_Window) {
1251+
Android_RestoreScreenKeyboard(SDL_GetVideoDevice(), Android_Window);
1252+
}
1253+
12451254
SDL_UnlockMutex(Android_ActivityMutex);
12461255
}
12471256

@@ -1287,6 +1296,16 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceDestroyed)(JNIEnv *env,
12871296
SDL_UnlockMutex(Android_ActivityMutex);
12881297
}
12891298

1299+
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeScreenKeyboardShown)(JNIEnv *env, jclass jcls)
1300+
{
1301+
SDL_SendScreenKeyboardShown();
1302+
}
1303+
1304+
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeScreenKeyboardHidden)(JNIEnv *env, jclass jcls)
1305+
{
1306+
SDL_SendScreenKeyboardHidden();
1307+
}
1308+
12901309
// Keydown
12911310
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyDown)(
12921311
JNIEnv *env, jclass jcls,
@@ -2149,14 +2168,6 @@ void Android_JNI_HideScreenKeyboard(void)
21492168
Android_JNI_SendMessage(COMMAND_TEXTEDIT_HIDE, 0);
21502169
}
21512170

2152-
bool Android_JNI_IsScreenKeyboardShown(void)
2153-
{
2154-
JNIEnv *env = Android_JNI_GetEnv();
2155-
jboolean is_shown = 0;
2156-
is_shown = (*env)->CallStaticBooleanMethod(env, mActivityClass, midIsScreenKeyboardShown);
2157-
return is_shown;
2158-
}
2159-
21602171
bool Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID)
21612172
{
21622173
JNIEnv *env;

src/core/android/SDL_android.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ extern bool Android_JNI_ShouldMinimizeOnFocusLoss(void);
6767
extern bool Android_JNI_GetAccelerometerValues(float values[3]);
6868
extern void Android_JNI_ShowScreenKeyboard(int input_type, SDL_Rect *inputRect);
6969
extern void Android_JNI_HideScreenKeyboard(void);
70-
extern bool Android_JNI_IsScreenKeyboardShown(void);
7170
extern ANativeWindow *Android_JNI_GetNativeWindow(void);
7271

7372
extern SDL_DisplayOrientation Android_JNI_GetDisplayNaturalOrientation(void);

src/events/SDL_events.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,10 @@ int SDL_GetEventDescription(const SDL_Event *event, char *buf, int buflen)
601601
SDL_EVENT_CASE(SDL_EVENT_TEXT_INPUT)
602602
(void)SDL_snprintf(details, sizeof(details), " (timestamp=%u windowid=%u text='%s')", (uint)event->text.timestamp, (uint)event->text.windowID, event->text.text);
603603
break;
604+
SDL_EVENT_CASE(SDL_EVENT_SCREEN_KEYBOARD_SHOWN)
605+
break;
606+
SDL_EVENT_CASE(SDL_EVENT_SCREEN_KEYBOARD_HIDDEN)
607+
break;
604608

605609
#define PRINT_MOUSEDEV_EVENT(event) (void)SDL_snprintf(details, sizeof(details), " (timestamp=%u which=%u)", (uint)event->mdevice.timestamp, (uint)event->mdevice.which)
606610
SDL_EVENT_CASE(SDL_EVENT_MOUSE_ADDED)

src/events/SDL_keyboard.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,9 @@ SDL_Window *SDL_GetKeyboardFocus(void)
325325

326326
bool SDL_SetKeyboardFocus(SDL_Window *window)
327327
{
328+
#if !defined(SDL_PLATFORM_IOS) && !defined(SDL_PLATFORM_ANDROID)
328329
SDL_VideoDevice *video = SDL_GetVideoDevice();
330+
#endif
329331
SDL_Keyboard *keyboard = &SDL_keyboard;
330332
SDL_Mouse *mouse = SDL_GetMouse();
331333

@@ -357,24 +359,28 @@ bool SDL_SetKeyboardFocus(SDL_Window *window)
357359
if (keyboard->focus && keyboard->focus != window) {
358360
SDL_SendWindowEvent(keyboard->focus, SDL_EVENT_WINDOW_FOCUS_LOST, 0, 0);
359361

362+
#if !defined(SDL_PLATFORM_IOS) && !defined(SDL_PLATFORM_ANDROID)
360363
// Ensures IME compositions are committed
361364
if (SDL_TextInputActive(keyboard->focus)) {
362365
if (video && video->StopTextInput) {
363366
video->StopTextInput(video, keyboard->focus);
364367
}
365368
}
369+
#endif // !SDL_PLATFORM_IOS && !SDL_PLATFORM_ANDROID
366370
}
367371

368372
keyboard->focus = window;
369373

370374
if (keyboard->focus) {
371375
SDL_SendWindowEvent(keyboard->focus, SDL_EVENT_WINDOW_FOCUS_GAINED, 0, 0);
372376

377+
#if !defined(SDL_PLATFORM_IOS) && !defined(SDL_PLATFORM_ANDROID)
373378
if (SDL_TextInputActive(keyboard->focus)) {
374379
if (video && video->StartTextInput) {
375380
video->StartTextInput(video, keyboard->focus, keyboard->focus->text_input_props);
376381
}
377382
}
383+
#endif // !SDL_PLATFORM_IOS && !SDL_PLATFORM_ANDROID
378384
}
379385

380386
SDL_UpdateRelativeMouseMode();

src/video/SDL_sysvideo.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,6 @@ struct SDL_VideoDevice
372372
void (*ShowScreenKeyboard)(SDL_VideoDevice *_this, SDL_Window *window, SDL_PropertiesID props);
373373
void (*HideScreenKeyboard)(SDL_VideoDevice *_this, SDL_Window *window);
374374
void (*SetTextInputProperties)(SDL_VideoDevice *_this, SDL_Window *window, SDL_PropertiesID props);
375-
bool (*IsScreenKeyboardShown)(SDL_VideoDevice *_this, SDL_Window *window);
376375

377376
// Clipboard
378377
const char **(*GetTextMimeTypes)(SDL_VideoDevice *_this, size_t *num_mime_types);
@@ -422,6 +421,7 @@ struct SDL_VideoDevice
422421
bool setting_display_mode;
423422
Uint32 device_caps;
424423
SDL_SystemTheme system_theme;
424+
bool screen_keyboard_shown;
425425

426426
/* * * */
427427
// Data used by the GL drivers
@@ -613,4 +613,7 @@ extern SDL_Capitalization SDL_GetTextInputCapitalization(SDL_PropertiesID props)
613613
extern bool SDL_GetTextInputAutocorrect(SDL_PropertiesID props);
614614
extern bool SDL_GetTextInputMultiline(SDL_PropertiesID props);
615615

616+
extern void SDL_SendScreenKeyboardShown(void);
617+
extern void SDL_SendScreenKeyboardHidden(void);
618+
616619
#endif // SDL_sysvideo_h_

src/video/SDL_video.c

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5823,10 +5823,39 @@ bool SDL_ScreenKeyboardShown(SDL_Window *window)
58235823
{
58245824
CHECK_WINDOW_MAGIC(window, false);
58255825

5826-
if (_this->IsScreenKeyboardShown) {
5827-
return _this->IsScreenKeyboardShown(_this, window);
5826+
return _this->screen_keyboard_shown;
5827+
}
5828+
5829+
void SDL_SendScreenKeyboardShown(void)
5830+
{
5831+
if (_this->screen_keyboard_shown) {
5832+
return;
5833+
}
5834+
5835+
_this->screen_keyboard_shown = true;
5836+
5837+
if (SDL_EventEnabled(SDL_EVENT_SCREEN_KEYBOARD_SHOWN)) {
5838+
SDL_Event event;
5839+
event.type = SDL_EVENT_SCREEN_KEYBOARD_SHOWN;
5840+
event.common.timestamp = 0;
5841+
SDL_PushEvent(&event);
5842+
}
5843+
}
5844+
5845+
void SDL_SendScreenKeyboardHidden(void)
5846+
{
5847+
if (!_this->screen_keyboard_shown) {
5848+
return;
5849+
}
5850+
5851+
_this->screen_keyboard_shown = false;
5852+
5853+
if (SDL_EventEnabled(SDL_EVENT_SCREEN_KEYBOARD_HIDDEN)) {
5854+
SDL_Event event;
5855+
event.type = SDL_EVENT_SCREEN_KEYBOARD_HIDDEN;
5856+
event.common.timestamp = 0;
5857+
SDL_PushEvent(&event);
58285858
}
5829-
return false;
58305859
}
58315860

58325861
int SDL_GetMessageBoxCount(void)

src/video/android/SDL_androidevents.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,6 @@ static void Android_OnResume(void)
156156
}
157157
#endif
158158

159-
// Make sure SW Keyboard is restored when an app becomes foreground
160-
if (Android_Window) {
161-
Android_RestoreScreenKeyboardOnResume(SDL_GetVideoDevice(), Android_Window);
162-
}
163-
164159
SDL_OnApplicationDidEnterForeground();
165160
}
166161

0 commit comments

Comments
 (0)