From bdc7ad8f56fa439e18342daa19b61a838afc5908 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 5 Mar 2024 13:34:37 -0800 Subject: [PATCH] Keep track of whether the Android on-screen keyboard was opened by the application Fixes https://github.com/libsdl-org/SDL/issues/9202 (cherry picked from commit edbcef11ffdecab0ac8044c5fef021f5fbeed388) --- src/video/android/SDL_androidevents.c | 10 ++-------- src/video/android/SDL_androidkeyboard.c | 11 +++++++++++ src/video/android/SDL_androidkeyboard.h | 1 + 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/video/android/SDL_androidevents.c b/src/video/android/SDL_androidevents.c index cbb3b02eab..d125c92bd1 100644 --- a/src/video/android/SDL_androidevents.c +++ b/src/video/android/SDL_androidevents.c @@ -150,10 +150,7 @@ void Android_PumpEvents_Blocking(_THIS) #endif /* Make sure SW Keyboard is restored when an app becomes foreground */ - if (SDL_IsTextInputActive() && - SDL_GetHintBoolean(SDL_HINT_ENABLE_SCREEN_KEYBOARD, SDL_TRUE)) { - Android_ShowScreenKeyboard(_this, Android_Window); /* Only showTextInput */ - } + Android_RestoreScreenKeyboardOnResume(_this, Android_Window); } } else { if (videodata->isPausing || SDL_SemTryWait(Android_PauseSem) == 0) { @@ -235,10 +232,7 @@ void Android_PumpEvents_NonBlocking(_THIS) #endif /* Make sure SW Keyboard is restored when an app becomes foreground */ - if (SDL_IsTextInputActive() && - SDL_GetHintBoolean(SDL_HINT_ENABLE_SCREEN_KEYBOARD, SDL_TRUE)) { - Android_ShowScreenKeyboard(_this, Android_Window); /* Only showTextInput */ - } + Android_RestoreScreenKeyboardOnResume(_this, Android_Window); } } else { if (videodata->isPausing || SDL_SemTryWait(Android_PauseSem) == 0) { diff --git a/src/video/android/SDL_androidkeyboard.c b/src/video/android/SDL_androidkeyboard.c index 13b056334d..b55de02977 100644 --- a/src/video/android/SDL_androidkeyboard.c +++ b/src/video/android/SDL_androidkeyboard.c @@ -313,6 +313,8 @@ static SDL_Scancode Android_Keycodes[] = { SDL_SCANCODE_PASTE, /* AKEYCODE_PASTE */ }; +static SDL_bool SDL_screen_keyboard_shown; + static SDL_Scancode TranslateKeycode(int keycode) { SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN; @@ -345,11 +347,20 @@ void Android_ShowScreenKeyboard(_THIS, SDL_Window *window) { SDL_VideoData *videodata = _this->driverdata; Android_JNI_ShowScreenKeyboard(&videodata->textRect); + SDL_screen_keyboard_shown = SDL_TRUE; } void Android_HideScreenKeyboard(_THIS, SDL_Window *window) { Android_JNI_HideScreenKeyboard(); + SDL_screen_keyboard_shown = SDL_FALSE; +} + +void Android_RestoreScreenKeyboardOnResume(_THIS, SDL_Window *window) +{ + if (SDL_screen_keyboard_shown) { + Android_ShowScreenKeyboard(_this, window); + } } SDL_bool Android_IsScreenKeyboardShown(_THIS, SDL_Window *window) diff --git a/src/video/android/SDL_androidkeyboard.h b/src/video/android/SDL_androidkeyboard.h index 1124b4a9e4..4081ac674f 100644 --- a/src/video/android/SDL_androidkeyboard.h +++ b/src/video/android/SDL_androidkeyboard.h @@ -28,6 +28,7 @@ extern int Android_OnKeyUp(int keycode); extern SDL_bool Android_HasScreenKeyboardSupport(_THIS); extern void Android_ShowScreenKeyboard(_THIS, SDL_Window *window); extern void Android_HideScreenKeyboard(_THIS, SDL_Window *window); +extern void Android_RestoreScreenKeyboardOnResume(_THIS, SDL_Window *window); extern SDL_bool Android_IsScreenKeyboardShown(_THIS, SDL_Window *window); extern void Android_SetTextInputRect(_THIS, const SDL_Rect *rect);