From 1756bdee48e0b2fdc7bdbe0b6f4e11062eecd412 Mon Sep 17 00:00:00 2001 From: Sylvain Beucler Date: Thu, 3 May 2012 16:40:20 +0000 Subject: [PATCH 1/1] Document android app lifecycle; kill app when window is closed, until pausing/restoring windows is possible git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1292 7f0cb862-5218-0410-a997-914c9d46530a --- src/android/fg_main_android.c | 72 +++++++++++++++++++++++++++----------- src/android/fg_main_android.h | 3 ++ src/android/fg_runtime_android.c | 4 +++ 3 files changed, 59 insertions(+), 20 deletions(-) diff --git a/src/android/fg_main_android.c b/src/android/fg_main_android.c index 1e30b10..52700fe 100644 --- a/src/android/fg_main_android.c +++ b/src/android/fg_main_android.c @@ -303,43 +303,75 @@ int32_t handle_input(struct android_app* app, AInputEvent* event) { */ void handle_cmd(struct android_app* app, int32_t cmd) { switch (cmd) { - case APP_CMD_SAVE_STATE: - /* The system has asked us to save our current state. Do so. */ - LOGI("handle_cmd: APP_CMD_SAVE_STATE"); + /* App life cycle, in that order: */ + case APP_CMD_START: + LOGI("handle_cmd: APP_CMD_START"); + break; + case APP_CMD_RESUME: + LOGI("handle_cmd: APP_CMD_RESUME"); + /* If coming back from a pause: */ + /* - Recreate window context and surface */ + /* - Call user-defined hook to restore resources (textures...) */ + /* - Unpause GLUT callbacks */ break; - case APP_CMD_INIT_WINDOW: + case APP_CMD_INIT_WINDOW: /* surfaceCreated */ /* The window is being shown, get it ready. */ LOGI("handle_cmd: APP_CMD_INIT_WINDOW"); fgDisplay.pDisplay.single_window->Window.Handle = app->window; /* glPlatformOpenWindow was waiting for Handle to be defined and will now return from fgPlatformProcessSingleEvent() */ break; - case APP_CMD_TERM_WINDOW: - /* The window is being hidden or closed, clean it up. */ - LOGI("handle_cmd: APP_CMD_TERM_WINDOW"); - fgDestroyWindow(fgDisplay.pDisplay.single_window); - fgDisplay.pDisplay.single_window = NULL; - break; - case APP_CMD_DESTROY: - LOGI("handle_cmd: APP_CMD_DESTROY"); - /* glue has already set android_app->destroyRequested=1 */ - break; case APP_CMD_GAINED_FOCUS: LOGI("handle_cmd: APP_CMD_GAINED_FOCUS"); break; + case APP_CMD_WINDOW_RESIZED: + LOGI("handle_cmd: APP_CMD_WINDOW_RESIZED"); + if (fgDisplay.pDisplay.single_window->Window.pContext.egl.Surface != EGL_NO_SURFACE) + /* Make ProcessSingleEvent detect the new size, only available + after the next SwapBuffer */ + glutPostRedisplay(); + break; + + case APP_CMD_SAVE_STATE: /* onSaveInstanceState */ + /* The system has asked us to save our current state, when it + pauses the application without destroying it right after. */ + /* app->savedState = ... */ + /* app->savedStateSize = ... */ + LOGI("handle_cmd: APP_CMD_SAVE_STATE"); + break; + case APP_CMD_PAUSE: + LOGI("handle_cmd: APP_CMD_PAUSE"); + /* - Pause GLUT callbacks */ + break; case APP_CMD_LOST_FOCUS: LOGI("handle_cmd: APP_CMD_LOST_FOCUS"); break; + case APP_CMD_TERM_WINDOW: /* surfaceDestroyed */ + /* The application is being hidden, but may be restored */ + /* TODO: Pausing/resuming windows not ready yet, so killing it now */ + fgDestroyWindow(fgDisplay.pDisplay.single_window); + fgDisplay.pDisplay.single_window = NULL; + LOGI("handle_cmd: APP_CMD_TERM_WINDOW"); + break; + case APP_CMD_STOP: + LOGI("handle_cmd: APP_CMD_STOP"); + break; + case APP_CMD_DESTROY: /* Activity.onDestroy */ + LOGI("handle_cmd: APP_CMD_DESTROY"); + /* User closed the application for good, let's kill the window */ + if (fgDisplay.pDisplay.single_window != NULL) { + fgDestroyWindow(fgDisplay.pDisplay.single_window); + fgDisplay.pDisplay.single_window = NULL; + } + /* glue has already set android_app->destroyRequested=1 */ + break; + case APP_CMD_CONFIG_CHANGED: /* Handle rotation / orientation change */ LOGI("handle_cmd: APP_CMD_CONFIG_CHANGED"); break; - case APP_CMD_WINDOW_RESIZED: - LOGI("handle_cmd: APP_CMD_WINDOW_RESIZED"); - if (fgDisplay.pDisplay.single_window->Window.pContext.egl.Surface != EGL_NO_SURFACE) - /* Make ProcessSingleEvent detect the new size, only available - after the next SwapBuffer */ - glutPostRedisplay(); + case APP_CMD_LOW_MEMORY: + LOGI("handle_cmd: APP_CMD_LOW_MEMORY"); break; default: LOGI("handle_cmd: unhandled cmd=%d", cmd); diff --git a/src/android/fg_main_android.h b/src/android/fg_main_android.h index 5900db2..0f1f2ba 100644 --- a/src/android/fg_main_android.h +++ b/src/android/fg_main_android.h @@ -26,6 +26,9 @@ #ifndef __FG_MAIN_ANDROID_H__ #define __FG_MAIN_ANDROID_H__ +#include +#include "fg_internal.h" + extern void fgPlatformProcessSingleEvent(void); extern void fgPlatformReshapeWindow(SFG_Window *window, int width, int height); extern void fgPlatformDisplayWindow(SFG_Window *window); diff --git a/src/android/fg_runtime_android.c b/src/android/fg_runtime_android.c index acac390..b5d6cad 100644 --- a/src/android/fg_runtime_android.c +++ b/src/android/fg_runtime_android.c @@ -49,6 +49,7 @@ #include #include #include "android/native_app_glue/android_native_app_glue.h" +#include "android/fg_main_android.h" #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "FreeGLUT", __VA_ARGS__)) #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "FreeGLUT", __VA_ARGS__)) @@ -160,6 +161,9 @@ void android_main(struct android_app* app) { LOGI("android_main: end"); + /* TODO: Pausing/resuming windows not ready yet, so exiting now */ + exit(0); + /* Finish processing all events (namely APP_CMD_DESTROY) before exiting thread */ while (!app->destroyRequested) -- 1.7.10.4