Don't block Android event loop until all relevant events reach the app.
authorGabriel Jacobo <gabomdq@gmail.com>
Thu, 27 Sep 2012 15:00:34 -0300
changeset 6469 ce84310d85ef
parent 6468 6af2a8db95d0
child 6470 ca793191b67a
Don't block Android event loop until all relevant events reach the app.
src/video/android/SDL_androidevents.c
--- a/src/video/android/SDL_androidevents.c	Thu Sep 27 10:41:16 2012 -0700
+++ b/src/video/android/SDL_androidevents.c	Thu Sep 27 15:00:34 2012 -0300
@@ -23,11 +23,15 @@
 #if SDL_VIDEO_DRIVER_ANDROID
 
 #include "SDL_androidevents.h"
+#include "SDL_events.h"
 
 void
 Android_PumpEvents(_THIS)
 {
     static int isPaused = 0;
+#if SDL_ANDROID_BLOCK_ON_PAUSE
+    static int isPausing = 0;
+#endif
     /* No polling necessary */
 
     /*
@@ -36,10 +40,12 @@
      * When the resume semaphore is signaled, SDL_GL_CreateContext is called which in turn calls Java code
      * SDLActivity::createGLContext -> SDLActivity:: initEGL -> SDLActivity::createEGLSurface -> SDLActivity::createEGLContext
      */
-    if (isPaused) {
+
 #if SDL_ANDROID_BLOCK_ON_PAUSE
+    if (isPaused && !isPausing) {
         if(SDL_SemWait(Android_ResumeSem) == 0) {
 #else
+    if (isPaused) {
         if(SDL_SemTryWait(Android_ResumeSem) == 0) {
 #endif
             isPaused = 0;
@@ -53,10 +59,25 @@
         }
     }
     else {
+#if SDL_ANDROID_BLOCK_ON_PAUSE
+        if( isPausing || SDL_SemTryWait(Android_PauseSem) == 0 ) {
+            /* We've been signaled to pause, but before we block ourselves, we need to make sure that
+            SDL_WINDOWEVENT_FOCUS_LOST and SDL_WINDOWEVENT_MINIMIZED have reached the app */
+            if (SDL_HasEvent(SDL_WINDOWEVENT)) {
+                isPausing = 1;
+            }
+            else {
+                isPausing = 0;
+                isPaused = 1;
+            }
+        }
+#else
         if(SDL_SemTryWait(Android_PauseSem) == 0) {
             /* If we fall in here, the system is/was paused */
             isPaused = 1;
         }
+#endif
+
     }
 }