From 9f930856ab6222e1a6f0b7c6204399388fc5cefe Mon Sep 17 00:00:00 2001 From: Rcmaniac25 Date: Mon, 9 Sep 2013 12:31:04 -0400 Subject: [PATCH] Restructuring of when screen context and events are started stopped, created and destroyed --- .../src/blackberry/fg_init_blackberry.c | 18 ++++++--- .../src/blackberry/fg_internal_blackberry.h | 4 +- .../src/blackberry/fg_main_blackberry.c | 39 +++++++++++++------ .../src/blackberry/fg_window_blackberry.c | 19 +-------- 4 files changed, 43 insertions(+), 37 deletions(-) diff --git a/freeglut/freeglut/src/blackberry/fg_init_blackberry.c b/freeglut/freeglut/src/blackberry/fg_init_blackberry.c index 5a1a9d9..aaef2cb 100644 --- a/freeglut/freeglut/src/blackberry/fg_init_blackberry.c +++ b/freeglut/freeglut/src/blackberry/fg_init_blackberry.c @@ -29,17 +29,24 @@ #include "fg_init.h" #include "egl/fg_init_egl.h" #include -#include +#include 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(); } diff --git a/freeglut/freeglut/src/blackberry/fg_internal_blackberry.h b/freeglut/freeglut/src/blackberry/fg_internal_blackberry.h index 229ce05..795ff5d 100644 --- a/freeglut/freeglut/src/blackberry/fg_internal_blackberry.h +++ b/freeglut/freeglut/src/blackberry/fg_internal_blackberry.h @@ -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; }; diff --git a/freeglut/freeglut/src/blackberry/fg_main_blackberry.c b/freeglut/freeglut/src/blackberry/fg_main_blackberry.c index d16f315..9c22184 100644 --- a/freeglut/freeglut/src/blackberry/fg_main_blackberry.c +++ b/freeglut/freeglut/src/blackberry/fg_main_blackberry.c @@ -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; } } - diff --git a/freeglut/freeglut/src/blackberry/fg_window_blackberry.c b/freeglut/freeglut/src/blackberry/fg_window_blackberry.c index 5201eb5..e6876cf 100644 --- a/freeglut/freeglut/src/blackberry/fg_window_blackberry.c +++ b/freeglut/freeglut/src/blackberry/fg_window_blackberry.c @@ -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); } /*