Commit f0a4fea89f984d031fef00c39fa22d7221fed814

Sam Lantinga 2019-04-25T14:17:07

Fixed bug 4608 - Android: not getting SDL_WINDOWEVENT_FOCUS_GAINED on start of our app Dan Ginsburg I've seen this on several devices including Moto Z running Android 7 and a Snapdragon 845 running Android 9. What happens is as follows: SDLActivity.onWindowFocusChanged(true) happens pretty early on, but it's before we've done SDL_CreateWindow and so Android_Window is 0x0 thus this message does not get sent: JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeFocusChanged)( JNIEnv *env, jclass cls, jboolean hasFocus) { SDL_LockMutex(Android_ActivityMutex); if (Android_Window) { __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativeFocusChanged()"); SDL_SendWindowEvent(Android_Window, (hasFocus ? SDL_WINDOWEVENT_FOCUS_GAINED : SDL_WINDOWEVENT_FOCUS_LOST), 0, 0); } SDL_UnlockMutex(Android_ActivityMutex); } When the window does get created, in Android_CreateWindow it does this: window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */ window->flags &= ~SDL_WINDOW_HIDDEN; window->flags |= SDL_WINDOW_SHOWN; /* only one window on Android */ window->flags |= SDL_WINDOW_INPUT_FOCUS; /* always has input focus */ /* One window, it always has focus */ SDL_SetMouseFocus(window); SDL_SetKeyboardFocus(window); The SDL_SetKeyboardFocus does send an SDL_WINDOWEVENT_FOCUS_GAINED message, but it gets eaten in SDL_SendWindowEvent because we've forced SDL_WINDOW_INPUT_FOCUS beforehand: case SDL_WINDOWEVENT_FOCUS_GAINED: if (window->flags & SDL_WINDOW_INPUT_FOCUS) { return 0; } window->flags |= SDL_WINDOW_INPUT_FOCUS; SDL_OnWindowFocusGained(window); break; I can fix the problem if I comment out this line from Android_CreateWindow: window->flags |= SDL_WINDOW_INPUT_FOCUS; /* always has input focus */ I would propose that as a fix unless there is a reason not to.

1
2
3
4
5
6
7
8
9
10
11
12
diff --git a/src/video/android/SDL_androidwindow.c b/src/video/android/SDL_androidwindow.c
index 5e34c28..c99ca70 100644
--- a/src/video/android/SDL_androidwindow.c
+++ b/src/video/android/SDL_androidwindow.c
@@ -61,7 +61,6 @@ Android_CreateWindow(_THIS, SDL_Window * window)
     window->flags &= ~SDL_WINDOW_RESIZABLE;     /* window is NEVER resizeable */
     window->flags &= ~SDL_WINDOW_HIDDEN;
     window->flags |= SDL_WINDOW_SHOWN;          /* only one window on Android */
-    window->flags |= SDL_WINDOW_INPUT_FOCUS;    /* always has input focus */
 
     /* One window, it always has focus */
     SDL_SetMouseFocus(window);