[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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
diff --git a/android-project/AndroidManifest.xml b/android-project/AndroidManifest.xml
index 0e4ad41..a05b566 100644
--- a/android-project/AndroidManifest.xml
+++ b/android-project/AndroidManifest.xml
@@ -22,7 +22,9 @@
android:allowBackup="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<activity android:name="SDLActivity"
- android:label="@string/app_name">
+ android:label="@string/app_name"
+ android:configChanges="keyboardHidden|orientation"
+ >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java
index f7cb9ab..773ec43 100644
--- a/android-project/src/org/libsdl/app/SDLActivity.java
+++ b/android-project/src/org/libsdl/app/SDLActivity.java
@@ -121,13 +121,13 @@ public class SDLActivity extends Activity {
SDLActivity.nativeQuit();
// Now wait for the SDL thread to quit
- if (mSDLThread != null) {
+ if (SDLActivity.mSDLThread != null) {
try {
- mSDLThread.join();
+ SDLActivity.mSDLThread.join();
} catch(Exception e) {
Log.v("SDL", "Problem stopping thread: " + e);
}
- mSDLThread = null;
+ SDLActivity.mSDLThread = null;
//Log.v("SDL", "Finished waiting for SDL thread");
}
diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c
index 6fc6f07..4c47ae5 100644
--- a/src/core/android/SDL_android.c
+++ b/src/core/android/SDL_android.c
@@ -283,9 +283,16 @@ void Java_org_libsdl_app_SDLActivity_nativeLowMemory(
void Java_org_libsdl_app_SDLActivity_nativeQuit(
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 */
SDL_SendQuit();
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 */
diff --git a/src/video/android/SDL_androidevents.c b/src/video/android/SDL_androidevents.c
index 9be49cf..7a57ff5 100644
--- a/src/video/android/SDL_androidevents.c
+++ b/src/video/android/SDL_androidevents.c
@@ -82,7 +82,9 @@ Android_PumpEvents(_THIS)
isPaused = 0;
/* 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 {
diff --git a/test/testgles.c b/test/testgles.c
index 4e1bc07..314ec7c 100644
--- a/test/testgles.c
+++ b/test/testgles.c
@@ -335,7 +335,9 @@ main(int argc, char *argv[])
SDL_Log("%2.2f frames per second\n",
((double) frames * 1000) / (now - then));
}
+#if !defined(__ANDROID__)
quit(0);
+#endif
return 0;
}