Restructuring of when screen context and events are started stopped, created and...
authorRcmaniac25 <rcmaniac25@hotmail.com>
Fri, 24 Jan 2014 10:28:48 +0000 (10:28 +0000)
committerDiederick Niehorster <dcnieho@gmail.com>
Fri, 24 Jan 2014 10:28:48 +0000 (10:28 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1659 7f0cb862-5218-0410-a997-914c9d46530a

src/blackberry/fg_init_blackberry.c
src/blackberry/fg_internal_blackberry.h
src/blackberry/fg_main_blackberry.c
src/blackberry/fg_window_blackberry.c

index 5a1a9d9..aaef2cb 100644 (file)
 #include "fg_init.h"
 #include "egl/fg_init_egl.h"
 #include <bps/bps.h>
-#include <bps/navigator.h>
+#include <screen/screen.h>
 
 void fgPlatformInitialize()
 {
     bps_initialize();
 
-    navigator_request_events(0);
-    //XXX rotation lock? navigator_rotation_lock(true);
-
     fghPlatformInitializeEGL();
 
+    /* Prepare for screen events */
+    fgDisplay.pDisplay.event = NULL;
+    fgDisplay.pDisplay.screenContext = NULL;
+
+    /* Create window */
+    if (screen_create_context(&fgDisplay.pDisplay.screenContext, 0)) {
+        fgError("Could not create screen context");
+        return;
+    }
+
     /* Get start time */
     fgState.Time = fgSystemTime();
 
@@ -50,7 +57,8 @@ void fgPlatformCloseDisplay()
 {
     fghPlatformCloseDisplayEGL();
 
-    navigator_stop_events(0);
+    screen_destroy_context(fgDisplay.pDisplay.screenContext);
+    fgDisplay.pDisplay.screenContext = NULL;
 
     bps_shutdown();
 }
index 229ce05..795ff5d 100644 (file)
@@ -41,6 +41,8 @@ typedef struct tagSFG_PlatformDisplay SFG_PlatformDisplay;
 struct tagSFG_PlatformDisplay
 {
     struct tagSFG_PlatformDisplayEGL egl;
+    screen_context_t screenContext;
+       bps_event_t* event;
     EGLNativeWindowType single_native_window;
 };
 
@@ -49,8 +51,6 @@ typedef struct tagSFG_PlatformContext SFG_PlatformContext;
 struct tagSFG_PlatformContext
 {
     struct tagSFG_PlatformContextEGL egl;
-    screen_context_t screenContext;
-    bps_event_t* event;
 };
 
 
index d16f315..9c22184 100644 (file)
@@ -51,6 +51,7 @@ extern void fgPlatformPopWindow( SFG_Window *window );
 extern void fgPlatformHideWindow( SFG_Window *window );
 extern void fgPlatformIconifyWindow( SFG_Window *window );
 extern void fgPlatformShowWindow( SFG_Window *window );
+extern void fgPlatformMainLoopPostWork ( void );
 
 static struct touchscreen touchscreen;
 
@@ -160,7 +161,7 @@ fg_time_t fgPlatformSystemTime ( void )
 void fgPlatformSleepForEvents( fg_time_t msec )
 {
     //XXX: Is this right? Is there a more direct way to access the context?
-    if(fgStructure.CurrentWindow && bps_get_event(&fgStructure.CurrentWindow->Window.pContext.event, (int)msec) != BPS_SUCCESS) {
+    if(fgStructure.CurrentWindow && bps_get_event(&fgDisplay.pDisplay.event, (int)msec) != BPS_SUCCESS) {
         LOGW("BPS couldn't get event");
     }
 }
@@ -256,11 +257,9 @@ void handle_left_mouse(int x, int y, int height, int eventType, SFG_Window* wind
 void fgPlatformProcessSingleEvent ( void )
 {
     int domain;
-    bps_event_t** eventPtr = &fgStructure.CurrentWindow->Window.pContext.event; //XXX Is there a more direct way to access the context?
-    bps_event_t* event;
     do
     {
-        if(*eventPtr != NULL) {
+        if(fgDisplay.pDisplay.event != NULL) {
             SFG_Window* window = fgStructure.CurrentWindow;
             if (window != NULL && window->Window.Handle != NULL) {
                 int size[2];
@@ -268,11 +267,10 @@ void fgPlatformProcessSingleEvent ( void )
                 fghOnReshapeNotify(window,size[0],size[1],GL_FALSE);
             }
 
-            event = *eventPtr;
-            domain = bps_event_get_domain(event);
+            domain = bps_event_get_domain(fgDisplay.pDisplay.event);
             if (domain == screen_get_domain()) {
                 int eventType;
-                screen_event_t screenEvent = screen_event_get_event(event);
+                screen_event_t screenEvent = screen_event_get_event(fgDisplay.pDisplay.event);
                 screen_get_event_property_iv(screenEvent, SCREEN_PROPERTY_TYPE, &eventType);
                 switch (eventType) {
 
@@ -416,13 +414,13 @@ void fgPlatformProcessSingleEvent ( void )
                     break;
                 }
             } else if (domain == navigator_get_domain()) {
-                int eventType = bps_event_get_code(event);
+                int eventType = bps_event_get_code(fgDisplay.pDisplay.event);
                 switch (eventType) {
 
                 case NAVIGATOR_WINDOW_STATE:
                 {
                     LOGI("fgPlatformProcessSingleEvent: NAVIGATOR_WINDOW_STATE");
-                    navigator_window_state_t state = navigator_event_get_window_state(event);
+                    navigator_window_state_t state = navigator_event_get_window_state(fgDisplay.pDisplay.event);
                     switch (state)
                     {
                     case NAVIGATOR_WINDOW_FULLSCREEN:
@@ -444,6 +442,9 @@ void fgPlatformProcessSingleEvent ( void )
                 case NAVIGATOR_EXIT:
                 {
                     LOGI("fgPlatformProcessSingleEvent: NAVIGATOR_EXIT");
+
+                    fgPlatformMainLoopPostWork();
+
                     /* User closed the application for good, let's kill the window */
                     SFG_Window* window = fgStructure.CurrentWindow;
                     if (window != NULL) {
@@ -474,17 +475,32 @@ void fgPlatformProcessSingleEvent ( void )
                 }
             }
         }
-    } while(bps_get_event(eventPtr, 1) == BPS_SUCCESS && *eventPtr != NULL);
+    } while(bps_get_event(&fgDisplay.pDisplay.event, 1) == BPS_SUCCESS && fgDisplay.pDisplay.event != NULL);
 
     /* Reset event to reduce chances of triggering something */
-    *eventPtr = NULL;
+    fgDisplay.pDisplay.event = NULL;
 }
 
 void fgPlatformMainLoopPreliminaryWork ( void )
 {
     LOGI("fgPlatformMainLoopPreliminaryWork");
+
+    /* Request navigator events */
+    navigator_request_events(0);
+       //XXX rotation lock? navigator_rotation_lock(true);
+
+    /* Request window events */
+    screen_request_events(fgDisplay.pDisplay.screenContext);
 }
 
+void fgPlatformMainLoopPostWork ( void )
+{
+       LOGI("fgPlatformMainLoopPostWork");
+
+       screen_stop_events(fgDisplay.pDisplay.screenContext);
+
+       navigator_stop_events(0);
+}
 
 /* deal with work list items */
 void fgPlatformInitWork(SFG_Window* window)
@@ -542,4 +558,3 @@ void fgPlatformVisibilityWork(SFG_Window* window)
         break;
     }
 }
-
index 5201eb5..e6876cf 100644 (file)
@@ -48,16 +48,10 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
         fgWarning("You can't have more than one window on BlackBerry");
         return;
     }
-    window->Window.pContext.event = NULL; //XXX Should probably be done elsewhere. Done here so there is no event at the moment
 
     /* Create window */
-    if (screen_create_context(&window->Window.pContext.screenContext, 0)) {
-        fgError("Could not create screen context");
-        return;
-    }
     screen_window_t sWindow;
-    if (screen_create_window(&sWindow, window->Window.pContext.screenContext)) {
-        screen_destroy_context(window->Window.pContext.screenContext);
+    if (screen_create_window(&sWindow, fgDisplay.pDisplay.screenContext)) {
         fgError("Could not create window");
         return;
     }
@@ -75,13 +69,11 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
 #endif
     if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_FORMAT, &screenFormat)) {
         screen_destroy_window(sWindow);
-        screen_destroy_context(window->Window.pContext.screenContext);
         fgError("Could not set window format");
         return;
     }
     if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_USAGE, &screenUsage)) {
         screen_destroy_window(sWindow);
-        screen_destroy_context(window->Window.pContext.screenContext);
         fgError("Could not set window usage");
         return;
     }
@@ -92,7 +84,6 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
     size[1] = h;
     if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_BUFFER_SIZE, size)) {
         screen_destroy_window(sWindow);
-        screen_destroy_context(window->Window.pContext.screenContext);
         fgError("Could not set window buffer size");
         return;
     }*/
@@ -100,14 +91,10 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
     /* Create window buffers */
     if (screen_create_window_buffers(sWindow, (fgState.DisplayMode & GLUT_DOUBLE) ? 2 : 1)) {
         screen_destroy_window(sWindow);
-        screen_destroy_context(window->Window.pContext.screenContext);
         fgError("Could not create window buffers");
         return;
     }
 
-    /* Request window events */
-    screen_request_events(window->Window.pContext.screenContext); //XXX When multiple screens are supported, this needs to be moved to wherever the screen context is actually created
-
     /* Save window and set state */
     window->Window.Handle = fgDisplay.pDisplay.single_native_window;
     window->State.WorkMask |= GLUT_INIT_WORK;
@@ -138,11 +125,7 @@ void fgPlatformCloseWindow( SFG_Window* window )
 {
     fghPlatformCloseWindowEGL(window);
 
-    screen_stop_events(window->Window.pContext.screenContext);
-
     screen_destroy_window((screen_window_t)window->Window.Handle);
-
-    screen_destroy_context(window->Window.pContext.screenContext);
 }
 
 /*