android: make code 're-entrant' - i.e. NativeActivity can restart the program without...
authorSylvain Beucler <beuc@beuc.net>
Thu, 3 May 2012 14:12:35 +0000 (14:12 +0000)
committerSylvain Beucler <beuc@beuc.net>
Thu, 3 May 2012 14:12:35 +0000 (14:12 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1291 7f0cb862-5218-0410-a997-914c9d46530a

src/android/fg_init_android.c
src/android/fg_internal_android.h
src/android/fg_main_android.c
src/android/fg_runtime_android.c
src/android/fg_structure_android.c
src/android/fg_window_android.c

index 98ddb03..06ffa58 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <GL/freeglut.h>
 #include "fg_internal.h"
+#include "fg_init.h"
 #include "egl/fg_init_egl.h"
 
 void fgPlatformInitialize()
index c072136..c5d146e 100644 (file)
@@ -104,7 +104,8 @@ struct tagSFG_PlatformJoystick
 typedef struct tagSFG_PlatformWindowState SFG_PlatformWindowState;
 struct tagSFG_PlatformWindowState
 {
-    int unused;
+    int32_t LastHeight;
+    int32_t LastWidth;
 };
 
 #endif  /* FREEGLUT_INTERNAL_ANDROID_H */
index 6a0ca46..1e30b10 100644 (file)
@@ -318,6 +318,7 @@ void handle_cmd(struct android_app* app, int32_t cmd) {
     /* 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");
@@ -347,9 +348,6 @@ void handle_cmd(struct android_app* app, int32_t cmd) {
 
 void fgPlatformProcessSingleEvent ( void )
 {
-  static int32_t last_width = -1;
-  static int32_t last_height = -1;
-
   /* When the screen is resized, the window handle still points to the
      old window until the next SwapBuffer, while it's crucial to set
      the size (onShape) correctly before the next onDisplay callback.
@@ -363,9 +361,9 @@ void fgPlatformProcessSingleEvent ( void )
   if (window != NULL && window->Window.Handle != NULL) {
     int32_t width = ANativeWindow_getWidth(window->Window.Handle);
     int32_t height = ANativeWindow_getHeight(window->Window.Handle);
-    if (width != last_width || height != last_height) {
-      last_width = width;
-      last_height = height;
+    if (width != window->State.pWState.LastWidth || height != window->State.pWState.LastHeight) {
+      window->State.pWState.LastWidth = width;
+      window->State.pWState.LastHeight = height;
       LOGI("width=%d, height=%d", width, height);
       if( FETCH_WCB( *window, Reshape ) )
        INVOKE_WCB( *window, Reshape, ( width, height ) );
index 253db95..acac390 100644 (file)
@@ -154,6 +154,8 @@ void android_main(struct android_app* app) {
     char progname[5] = "self";
     char* argv[] = {progname, NULL};
     main(1, argv);
+    /* FreeGLUT will exit() by itself if
+       GLUT_ACTION_ON_WINDOW_CLOSE == GLUT_ACTION_EXIT */
   }
 
   LOGI("android_main: end");
@@ -163,7 +165,8 @@ void android_main(struct android_app* app) {
   while (!app->destroyRequested)
       fgPlatformProcessSingleEvent();
 
-  /* In theory we should let NativeActivity restart us, however this
-     doesn't work well yet, so force exit */
-  exit(0);
+  /* Let NativeActivity restart us */
+  /* Users may want to forcibly exit() in their main() anyway because
+     NativeActivity doesn't dlclose() us, so all statically-assigned
+     variables keep their old values on restart.. */
 }
index b7acd20..e0a6eb8 100644 (file)
@@ -33,4 +33,6 @@
 void fgPlatformCreateWindow ( SFG_Window *window )
 {
   fghPlatformCreateWindowEGL(window);
+  window->State.pWState.LastWidth = -1;
+  window->State.pWState.LastHeight = -1;
 }
index 4c5d9d2..a6ce201 100644 (file)
@@ -42,11 +42,10 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
                            GLboolean gameMode, GLboolean isSubWindow )
 {
   /* TODO: only one full-screen window possible? */
-  static int nb_windows = 0;
-  if (nb_windows == 0) {
-    nb_windows++;
+  if (fgDisplay.pDisplay.single_window == NULL) {
     fgDisplay.pDisplay.single_window = window;
   } else {
+    fgWarning("You can't have more than one window on Android");
     return;
   }