#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();
{
fghPlatformCloseDisplayEGL();
- navigator_stop_events(0);
+ screen_destroy_context(fgDisplay.pDisplay.screenContext);
+ fgDisplay.pDisplay.screenContext = NULL;
bps_shutdown();
}
struct tagSFG_PlatformDisplay
{
struct tagSFG_PlatformDisplayEGL egl;
+ screen_context_t screenContext;
+ bps_event_t* event;
EGLNativeWindowType single_native_window;
};
struct tagSFG_PlatformContext
{
struct tagSFG_PlatformContextEGL egl;
- screen_context_t screenContext;
- bps_event_t* event;
};
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;
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");
}
}
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];
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) {
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:
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) {
}
}
}
- } 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)
break;
}
}
-
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;
}
#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;
}
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;
}*/
/* 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;
{
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);
}
/*