Parcourir la source

[Android] Fixes Bug 2041 - can't get SDL_QUIT event...

Thanks to Denis Bernard!

Also, changed the Android manifest so the app doesn't quit with orientation
changes, and made testgles.c exit properly on Android.
Gabriel Jacobo il y a 12 ans
Parent
commit
22770a8f40

+ 3 - 1
android-project/AndroidManifest.xml

@@ -22,7 +22,9 @@
                  android:allowBackup="true"
                  android:allowBackup="true"
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
         <activity android:name="SDLActivity"
         <activity android:name="SDLActivity"
-                  android:label="@string/app_name">
+                  android:label="@string/app_name"
+                  android:configChanges="keyboardHidden|orientation"
+                  >
             <intent-filter>
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
                 <category android:name="android.intent.category.LAUNCHER" />

+ 3 - 3
android-project/src/org/libsdl/app/SDLActivity.java

@@ -121,13 +121,13 @@ public class SDLActivity extends Activity {
         SDLActivity.nativeQuit();
         SDLActivity.nativeQuit();
 
 
         // Now wait for the SDL thread to quit
         // Now wait for the SDL thread to quit
-        if (mSDLThread != null) {
+        if (SDLActivity.mSDLThread != null) {
             try {
             try {
-                mSDLThread.join();
+                SDLActivity.mSDLThread.join();
             } catch(Exception e) {
             } catch(Exception e) {
                 Log.v("SDL", "Problem stopping thread: " + e);
                 Log.v("SDL", "Problem stopping thread: " + e);
             }
             }
-            mSDLThread = null;
+            SDLActivity.mSDLThread = null;
 
 
             //Log.v("SDL", "Finished waiting for SDL thread");
             //Log.v("SDL", "Finished waiting for SDL thread");
         }
         }

+ 7 - 0
src/core/android/SDL_android.c

@@ -283,9 +283,16 @@ void Java_org_libsdl_app_SDLActivity_nativeLowMemory(
 void Java_org_libsdl_app_SDLActivity_nativeQuit(
 void Java_org_libsdl_app_SDLActivity_nativeQuit(
                                     JNIEnv* env, jclass cls)
                                     JNIEnv* env, jclass cls)
 {
 {
+    /* Discard previous events. The user should have handled state storage
+     * in SDL_APP_WILLENTERBACKGROUND. After nativeQuit() is called, no
+     * events other than SDL_QUIT and SDL_APP_TERMINATING should fire */
+    SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);
     /* Inject a SDL_QUIT event */
     /* Inject a SDL_QUIT event */
     SDL_SendQuit();
     SDL_SendQuit();
     SDL_SendAppEvent(SDL_APP_TERMINATING);
     SDL_SendAppEvent(SDL_APP_TERMINATING);
+    /* Resume the event loop so that the app can catch SDL_QUIT which
+     * should now be the top event in the event queue. */
+    if (!SDL_SemValue(Android_ResumeSem)) SDL_SemPost(Android_ResumeSem);
 }
 }
 
 
 /* Pause */
 /* Pause */

+ 3 - 1
src/video/android/SDL_androidevents.c

@@ -82,7 +82,9 @@ Android_PumpEvents(_THIS)
             isPaused = 0;
             isPaused = 0;
             
             
             /* Restore the GL Context from here, as this operation is thread dependent */
             /* Restore the GL Context from here, as this operation is thread dependent */
-            android_egl_context_restore();
+            if (!SDL_HasEvent(SDL_QUIT)) {
+                android_egl_context_restore();
+            }
         }
         }
     }
     }
     else {
     else {

+ 2 - 0
test/testgles.c

@@ -335,7 +335,9 @@ main(int argc, char *argv[])
         SDL_Log("%2.2f frames per second\n",
         SDL_Log("%2.2f frames per second\n",
                ((double) frames * 1000) / (now - then));
                ((double) frames * 1000) / (now - then));
     }
     }
+#if !defined(__ANDROID__)
     quit(0);
     quit(0);
+#endif        
     return 0;
     return 0;
 }
 }