Document android app lifecycle; kill app when window is closed, until pausing/restoring windows is possible

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1292 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
beuc 2012-05-03 16:40:20 +00:00
parent 1d008232f5
commit a0df79a2ee
3 changed files with 60 additions and 21 deletions

View File

@ -303,37 +303,27 @@ int32_t handle_input(struct android_app* app, AInputEvent* event) {
*/ */
void handle_cmd(struct android_app* app, int32_t cmd) { void handle_cmd(struct android_app* app, int32_t cmd) {
switch (cmd) { switch (cmd) {
case APP_CMD_SAVE_STATE: /* App life cycle, in that order: */
/* The system has asked us to save our current state. Do so. */ case APP_CMD_START:
LOGI("handle_cmd: APP_CMD_SAVE_STATE"); LOGI("handle_cmd: APP_CMD_START");
break; break;
case APP_CMD_INIT_WINDOW: 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: /* surfaceCreated */
/* The window is being shown, get it ready. */ /* The window is being shown, get it ready. */
LOGI("handle_cmd: APP_CMD_INIT_WINDOW"); LOGI("handle_cmd: APP_CMD_INIT_WINDOW");
fgDisplay.pDisplay.single_window->Window.Handle = app->window; fgDisplay.pDisplay.single_window->Window.Handle = app->window;
/* glPlatformOpenWindow was waiting for Handle to be defined and /* glPlatformOpenWindow was waiting for Handle to be defined and
will now return from fgPlatformProcessSingleEvent() */ will now return from fgPlatformProcessSingleEvent() */
break; 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: case APP_CMD_GAINED_FOCUS:
LOGI("handle_cmd: APP_CMD_GAINED_FOCUS"); LOGI("handle_cmd: APP_CMD_GAINED_FOCUS");
break; break;
case APP_CMD_LOST_FOCUS:
LOGI("handle_cmd: APP_CMD_LOST_FOCUS");
break;
case APP_CMD_CONFIG_CHANGED:
/* Handle rotation / orientation change */
LOGI("handle_cmd: APP_CMD_CONFIG_CHANGED");
break;
case APP_CMD_WINDOW_RESIZED: case APP_CMD_WINDOW_RESIZED:
LOGI("handle_cmd: APP_CMD_WINDOW_RESIZED"); LOGI("handle_cmd: APP_CMD_WINDOW_RESIZED");
if (fgDisplay.pDisplay.single_window->Window.pContext.egl.Surface != EGL_NO_SURFACE) if (fgDisplay.pDisplay.single_window->Window.pContext.egl.Surface != EGL_NO_SURFACE)
@ -341,6 +331,48 @@ void handle_cmd(struct android_app* app, int32_t cmd) {
after the next SwapBuffer */ after the next SwapBuffer */
glutPostRedisplay(); glutPostRedisplay();
break; 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_LOW_MEMORY:
LOGI("handle_cmd: APP_CMD_LOW_MEMORY");
break;
default: default:
LOGI("handle_cmd: unhandled cmd=%d", cmd); LOGI("handle_cmd: unhandled cmd=%d", cmd);
} }

View File

@ -26,6 +26,9 @@
#ifndef __FG_MAIN_ANDROID_H__ #ifndef __FG_MAIN_ANDROID_H__
#define __FG_MAIN_ANDROID_H__ #define __FG_MAIN_ANDROID_H__
#include <GL/freeglut.h>
#include "fg_internal.h"
extern void fgPlatformProcessSingleEvent(void); extern void fgPlatformProcessSingleEvent(void);
extern void fgPlatformReshapeWindow(SFG_Window *window, int width, int height); extern void fgPlatformReshapeWindow(SFG_Window *window, int width, int height);
extern void fgPlatformDisplayWindow(SFG_Window *window); extern void fgPlatformDisplayWindow(SFG_Window *window);

View File

@ -49,6 +49,7 @@
#include <android/asset_manager.h> #include <android/asset_manager.h>
#include <android/native_window.h> #include <android/native_window.h>
#include "android/native_app_glue/android_native_app_glue.h" #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 LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "FreeGLUT", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "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"); 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 /* Finish processing all events (namely APP_CMD_DESTROY) before
exiting thread */ exiting thread */
while (!app->destroyRequested) while (!app->destroyRequested)