android: better clean-up on exit
[freeglut] / src / android / fg_window_android.c
index bbd17fd..4c5d9d2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * freeglut_window_android.c
+ * fg_window_android.c
  *
  * Window management methods for Android
  *
@@ -30,6 +30,7 @@
 #include <GL/freeglut.h>
 #include "fg_internal.h"
 #include "egl/fg_window_egl.h"
+#include "android/fg_main_android.h"
 
 /*
  * Opens a window. Requires a SFG_Window object created and attached
@@ -40,19 +41,17 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
                            GLboolean sizeUse, int w, int h,
                            GLboolean gameMode, GLboolean isSubWindow )
 {
-  printf("fgPlatformOpenWindow %p ID=%d\n", (void*)window, window->ID);
-
   /* TODO: only one full-screen window possible? */
   static int nb_windows = 0;
   if (nb_windows == 0) {
     nb_windows++;
     fgDisplay.pDisplay.single_window = window;
-    printf("=> %p ID=%d\n", (void*)fgDisplay.pDisplay.single_window, fgDisplay.pDisplay.single_window->ID);
   } else {
     return;
   }
 
-  fghCreateNewContextEGL(window);
+  fghChooseConfig(&window->Window.pContext.egl.Config);
+  window->Window.Context = fghCreateNewContextEGL(window);
 
   /* Wait until window is available and OpenGL context is created */
   /* Normally events are processed through glutMainLoop(), but the
@@ -67,8 +66,16 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
   }
 
   EGLDisplay display = fgDisplay.pDisplay.egl.Display;
-  EGLint format = fgDisplay.pDisplay.single_window->Window.pContext.egl.ContextFormat;
-  ANativeWindow_setBuffersGeometry(window->Window.Handle, 0, 0, format);
+
+  /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
+   * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
+   * As soon as we picked a EGLConfig, we can safely reconfigure the
+   * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
+  EGLint vid;
+  eglGetConfigAttrib(display, window->Window.pContext.egl.Config,
+                    EGL_NATIVE_VISUAL_ID, &vid);
+  ANativeWindow_setBuffersGeometry(window->Window.Handle, 0, 0, vid);
+
   fghPlatformOpenWindowEGL(window);
 
   window->State.Visible = GL_TRUE;
@@ -83,11 +90,6 @@ void fgPlatformCloseWindow( SFG_Window* window )
   /* Window pre-created by Android, no way to delete it */
 }
 
-void fgPlatformSetWindow ( SFG_Window *window )
-{
-  /* TODO: only a single window possible? */
-}
-
 /*
  * This function makes the current window visible
  */