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:
parent
1d008232f5
commit
a0df79a2ee
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
Reference in New Issue
Block a user