From 265a4c1c07f001dce197024c77ecad3d6aa9b111 Mon Sep 17 00:00:00 2001 From: Rcmaniac25 Date: Fri, 24 Jan 2014 10:35:05 +0000 Subject: [PATCH] Added BlackBerry PlayBook support Bug memleak when getting the number of mouse buttons on a non-PlayBook where an appropriate device is found and the value is returned git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1674 7f0cb862-5218-0410-a997-914c9d46530a --- CMakeLists.txt | 26 ++++++++++---- blackberry.toolchain.cmake | 31 +++++++++++++---- src/blackberry/fg_main_blackberry.c | 60 ++++++++++++++++++++++++++++++++- src/blackberry/fg_state_blackberry.c | 20 +++++++---- src/blackberry/fg_window_blackberry.c | 3 +- src/fg_internal.h | 10 +++++- 6 files changed, 128 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 28bab9d..6feb753 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,10 +269,16 @@ IF(ANDROID) # -llog for native Android logging LIST(APPEND LIBS android log) ELSEIF(BLACKBERRY) - # -lbps for event loop - # -lslog2 for logging - # -screen for native screen - LIST(APPEND LIBS bps slog2 screen) + if(PLAYBOOK) + # -lbps for event loop + # -screen for native screen + LIST(APPEND LIBS bps screen) + ELSE() + # -lbps for event loop + # -lslog2 for logging + # -screen for native screen + LIST(APPEND LIBS bps slog2 screen) + ENDIF() ENDIF() INCLUDE(CheckFunctionExists) @@ -487,7 +493,11 @@ ELSEIF(FREEGLUT_GLES2) IF(ANDROID) SET(PC_LIBS_PRIVATE "-llog -landroid -lGLESv2 -lEGL -lm") ELSEIF(BLACKBERRY) - SET(PC_LIBS_PRIVATE "-lbps -lslog2 -lscreen -lGLESv2 -lEGL -lm") + IF(PLAYBOOK) + SET(PC_LIBS_PRIVATE "-lbps -lscreen -lGLESv2 -lEGL -lm") + ELSE() + SET(PC_LIBS_PRIVATE "-lbps -lslog2 -lscreen -lGLESv2 -lEGL -lm") + ENDIF() ELSE() SET(PC_LIBS_PRIVATE "-lX11 -lXxf86vm -lXrandr -lGLESv2 -lEGL -lm") ENDIF() @@ -495,7 +505,11 @@ ELSEIF(FREEGLUT_GLES1) IF(ANDROID) SET(PC_LIBS_PRIVATE "-llog -landroid -lGLESv1_CM -lEGL -lm") ELSEIF(BLACKBERRY) - SET(PC_LIBS_PRIVATE "-lbps -lslog2 -lscreen -lGLESv1_CM -lEGL -lm") + IF(PLAYBOOK) + SET(PC_LIBS_PRIVATE "-lbps -lscreen -lGLESv1_CM -lEGL -lm") + ELSE() + SET(PC_LIBS_PRIVATE "-lbps -lslog2 -lscreen -lGLESv1_CM -lEGL -lm") + ENDIF() ELSE() SET(PC_LIBS_PRIVATE "-lX11 -lXxf86vm -lXrandr -lGLESv1_CM -lEGL -lm") ENDIF() diff --git a/blackberry.toolchain.cmake b/blackberry.toolchain.cmake index 4c9d264..47198f9 100644 --- a/blackberry.toolchain.cmake +++ b/blackberry.toolchain.cmake @@ -32,6 +32,11 @@ set( BLACKBERRY_TARGET_ROOT "$ENV{QNX_TARGET}" ) set( CMAKE_SYSTEM_NAME Linux ) set( CMAKE_SYSTEM_VERSION 1 ) +# Check for PlayBook +if( EXISTS "${BLACKBERRY_TARGET_ROOT}/usr/include" ) +set( PLAYBOOK True ) +endif() + # STL version: by default gnustl_static will be used set( BLACKBERRY_USE_STLPORT FALSE CACHE BOOL "Experimental: use stlport_static instead of gnustl_static") mark_as_advanced( BLACKBERRY_USE_STLPORT ) @@ -91,15 +96,29 @@ else() endif() # Includes -list( APPEND BLACKBERRY_SYSTEM_INCLUDE_DIRS "${BLACKBERRY_TARGET_ROOT}/qnx6/usr/include" ) +if( PLAYBOOK ) + list( APPEND BLACKBERRY_SYSTEM_INCLUDE_DIRS "${BLACKBERRY_TARGET_ROOT}/usr/include" ) +else() + list( APPEND BLACKBERRY_SYSTEM_INCLUDE_DIRS "${BLACKBERRY_TARGET_ROOT}/qnx6/usr/include" ) +endif() # Flags and preprocessor definitions if( BLACKBERRY_ARCHITECTURE STREQUAL "arm" ) - set( BLACKBERRY_CC_FLAGS " -V4.6.3,gcc_ntoarmv7le -D__QNX__" ) - set( BLACKBERRY_CXX_FLAGS " -V4.6.3,gcc_ntoarmv7le -Y_gpp -D__QNX__" ) + if( PLAYBOOK ) + set( BLACKBERRY_CC_FLAGS " -V4.4.2,gcc_ntoarmv7le -D__PLAYBOOK__" ) + set( BLACKBERRY_CXX_FLAGS " -V4.4.2,gcc_ntoarmv7le -Y_gpp -D__PLAYBOOK__" ) + else() + set( BLACKBERRY_CC_FLAGS " -V4.6.3,gcc_ntoarmv7le -D__QNX__" ) + set( BLACKBERRY_CXX_FLAGS " -V4.6.3,gcc_ntoarmv7le -Y_gpp -D__QNX__" ) + endif() else() - set( BLACKBERRY_CC_FLAGS " -V4.6.3,gcc_ntox86 -D__QNX__" ) - set( BLACKBERRY_CXX_FLAGS " -V4.6.3,gcc_ntox86 -Y_gpp -D__QNX__" ) + if( PLAYBOOK ) + set( BLACKBERRY_CC_FLAGS " -V4.4.2,gcc_ntox86 -D__PLAYBOOK__" ) + set( BLACKBERRY_CXX_FLAGS " -V4.4.2,gcc_ntox86 -Y_gpp -D__PLAYBOOK__" ) + else() + set( BLACKBERRY_CC_FLAGS " -V4.6.3,gcc_ntox86 -D__QNX__" ) + set( BLACKBERRY_CXX_FLAGS " -V4.6.3,gcc_ntox86 -Y_gpp -D__QNX__" ) + endif() endif() set( BLACKBERRY 1 ) @@ -131,7 +150,7 @@ set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "linker flags" ) SET( CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "" CACHE STRING "linker flags") SET( CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "" CACHE STRING "linker flags") set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "linker flags" ) -set( CMAKE_EXE_LINKER_FLAGS "-lstdc++ -lm -lEGL -lGLESv2 -lbps -lscreen" CACHE STRING "linker flags" ) +set( CMAKE_EXE_LINKER_FLAGS "-lstdc++" CACHE STRING "linker flags" ) # Finish flags set( BLACKBERRY_CXX_FLAGS "${BLACKBERRY_CXX_FLAGS}" CACHE INTERNAL "Extra BlackBerry compiler flags") diff --git a/src/blackberry/fg_main_blackberry.c b/src/blackberry/fg_main_blackberry.c index 89474d0..4aa6759 100644 --- a/src/blackberry/fg_main_blackberry.c +++ b/src/blackberry/fg_main_blackberry.c @@ -31,6 +31,18 @@ #include "fg_internal.h" #include "egl/fg_window_egl.h" +#ifdef __PLAYBOOK__ +#include +#ifdef NDEBUG +#define LOGI(...) +#else +#define LOGI(...) ((void)slogf(1337, _SLOG_INFO, __VA_ARGS__)) +#endif +#define LOGW(...) ((void)slogf(1337, _SLOG_WARNING, __VA_ARGS__)) +#ifndef SLOG2_FA_SIGNED +#define SLOG2_FA_SIGNED(x) (x) +#endif +#else #include #ifdef NDEBUG #define LOGI(...) @@ -38,6 +50,7 @@ #define LOGI(...) ((void)slog2fa(NULL, 1337, SLOG2_INFO, __VA_ARGS__, SLOG2_FA_END)) #endif #define LOGW(...) ((void)slog2fa(NULL, 1337, SLOG2_WARNING, __VA_ARGS__, SLOG2_FA_END)) +#endif #include #include #include @@ -355,7 +368,11 @@ void fgPlatformProcessSingleEvent ( void ) { mtouch_event_t touchEvent; screen_get_mtouch_event(screenEvent, &touchEvent, 0); +#ifndef __PLAYBOOK__ screen_get_event_property_iv(screenEvent, SCREEN_PROPERTY_KEY_MODIFIERS, &mod); +#else + mod = 0; +#endif LOGI("fgPlatformProcessSingleEvent: SCREEN_EVENT_MTOUCH_*: Type: 0x%X, X: %d, Y: %d, Contact Id: %d, Mod: 0x%X", SLOG2_FA_SIGNED(eventType), SLOG2_FA_SIGNED(touchEvent.x), SLOG2_FA_SIGNED(touchEvent.y), SLOG2_FA_SIGNED(touchEvent.contact_id), SLOG2_FA_SIGNED(mod)); @@ -397,8 +414,12 @@ void fgPlatformProcessSingleEvent ( void ) // This is a mouse move event, it is applicable to a device with a usb mouse or simulator. screen_get_event_property_iv(screenEvent, SCREEN_PROPERTY_BUTTONS, &buttons); screen_get_event_property_iv(screenEvent, SCREEN_PROPERTY_SOURCE_POSITION, position); +#ifndef __PLAYBOOK__ screen_get_event_property_iv(screenEvent, SCREEN_PROPERTY_MOUSE_WHEEL, &wheel); screen_get_event_property_iv(screenEvent, SCREEN_PROPERTY_KEY_MODIFIERS, &mod); +#else + wheel = mod = 0; +#endif int size[2]; screen_get_window_property_iv(window->Window.Handle, SCREEN_PROPERTY_BUFFER_SIZE, size); @@ -552,7 +573,7 @@ void fgPlatformProcessSingleEvent ( void ) break; } } else if (domain == navigator_get_domain()) { - int eventType = bps_event_get_code(fgDisplay.pDisplay.event); + unsigned int eventType = bps_event_get_code(fgDisplay.pDisplay.event); switch (eventType) { case NAVIGATOR_WINDOW_STATE: @@ -636,6 +657,11 @@ void fgPlatformProcessSingleEvent ( void ) /* Rotate and resize the window */ fgPlatformRotateWindow(window, navigator_event_get_orientation_angle(fgDisplay.pDisplay.event)); fgPlatformFlushCommands(); +#ifdef __PLAYBOOK__ + /* PlayBook doesn't indicate what the new size will be, so we need to retrieve it from the window itself */ + window->State.pWState.newWidth = glutGet(GLUT_WINDOW_WIDTH); + window->State.pWState.newHeight = glutGet(GLUT_WINDOW_HEIGHT); +#endif fghOnReshapeNotify(window, window->State.pWState.newWidth, window->State.pWState.newHeight, GL_FALSE); /* Reset sizes */ @@ -667,6 +693,7 @@ void fgPlatformProcessSingleEvent ( void ) LOGI("fgPlatformProcessSingleEvent: NAVIGATOR_ORIENTATION_DONE/NAVIGATOR_ORIENTATION_RESULT"); break; +#ifndef __PLAYBOOK__ case NAVIGATOR_KEYBOARD_STATE: { LOGI("fgPlatformProcessSingleEvent: NAVIGATOR_KEYBOARD_STATE"); @@ -732,6 +759,7 @@ void fgPlatformProcessSingleEvent ( void ) window->State.pWState.newWidth = navigator_event_get_orientation_size_width(fgDisplay.pDisplay.event); window->State.pWState.newHeight = navigator_event_get_orientation_size_height(fgDisplay.pDisplay.event); break; +#endif case 0: //Doesn't exist in header, but shows up when keyboard shows and resizes break; @@ -741,6 +769,29 @@ void fgPlatformProcessSingleEvent ( void ) break; } } +#ifdef __PLAYBOOK__ + else if(domain == virtualkeyboard_get_domain()) { + unsigned int eventType = bps_event_get_code(fgDisplay.pDisplay.event); + switch (eventType) { + case VIRTUALKEYBOARD_EVENT_VISIBLE: + break; + + case VIRTUALKEYBOARD_EVENT_HIDDEN: + LOGI("fgPlatformProcessSingleEvent: VIRTUALKEYBOARD_EVENT_HIDDEN"); + fgPlatformHandleKeyboardHeight(window, 0); + break; + + case VIRTUALKEYBOARD_EVENT_INFO: + LOGI("fgPlatformProcessSingleEvent: VIRTUALKEYBOARD_EVENT_INFO"); + fgPlatformHandleKeyboardHeight(window, virtualkeyboard_event_get_height(fgDisplay.pDisplay.event)); + break; + + default: + LOGW("fgPlatformProcessSingleEvent: unknown virtualkeyboard event: 0x%X", eventType); + break; + } + } +#endif } while(bps_get_event(&fgDisplay.pDisplay.event, 1) == BPS_SUCCESS && fgDisplay.pDisplay.event != NULL); /* Reset event to reduce chances of triggering something */ @@ -757,6 +808,11 @@ void fgPlatformMainLoopPreliminaryWork ( void ) /* Allow rotation */ navigator_rotation_lock(false); +#ifdef __PLAYBOOK__ + /* Request keyboard events */ + virtualkeyboard_request_events(0); +#endif + /* Request window events */ screen_request_events(fgDisplay.pDisplay.screenContext); } @@ -768,7 +824,9 @@ void fgPlatformMainLoopPostWork ( void ) /* Stop all events */ screen_stop_events(fgDisplay.pDisplay.screenContext); +#ifndef __PLAYBOOK__ navigator_stop_events(0); +#endif } /* deal with work list items */ diff --git a/src/blackberry/fg_state_blackberry.c b/src/blackberry/fg_state_blackberry.c index c7991a9..246ba04 100644 --- a/src/blackberry/fg_state_blackberry.c +++ b/src/blackberry/fg_state_blackberry.c @@ -35,8 +35,10 @@ //From fg_state_android.c int fgPlatformGlutDeviceGet ( GLenum eWhat ) { +#ifndef __PLAYBOOK__ int deviceCount, i, value; screen_device_t* devices; +#endif switch( eWhat ) { @@ -51,7 +53,8 @@ int fgPlatformGlutDeviceGet ( GLenum eWhat ) case GLUT_NUM_MOUSE_BUTTONS: /* BlackBerry has a touchscreen, which we can consider a 1-button mouse at min. - Otherwise check for an actual mouse, else get max touch points */ + Otherwise check for an actual mouse, else get max touch points. PlayBook does not support this. */ +#ifndef __PLAYBOOK__ if(!screen_get_context_property_iv(fgDisplay.pDisplay.screenContext, SCREEN_PROPERTY_DEVICE_COUNT, &deviceCount)) { devices = (screen_device_t*)calloc(deviceCount, sizeof(screen_device_t)); if(!screen_get_context_property_pv(fgDisplay.pDisplay.screenContext, SCREEN_PROPERTY_DEVICES, (void**)devices)) { @@ -60,6 +63,7 @@ int fgPlatformGlutDeviceGet ( GLenum eWhat ) if(!screen_get_device_property_iv(devices[i], SCREEN_PROPERTY_TYPE, &value) && value == SCREEN_EVENT_POINTER && !screen_get_device_property_iv(devices[i], SCREEN_PROPERTY_BUTTON_COUNT, &value)) { + free(devices); return value; } } @@ -68,12 +72,14 @@ int fgPlatformGlutDeviceGet ( GLenum eWhat ) if(!screen_get_device_property_iv(devices[i], SCREEN_PROPERTY_TYPE, &value) && value == SCREEN_EVENT_MTOUCH_TOUCH && !screen_get_device_property_iv(devices[i], SCREEN_PROPERTY_MAXIMUM_TOUCH_ID, &value)) { + free(devices); return value; } } } free(devices); } +#endif /* Backup, pretend it's a 1-button mouse */ return 1; @@ -101,18 +107,20 @@ int fgPlatformGlutGet ( GLenum eWhat ) { if ( fgStructure.CurrentWindow == NULL ) return 0; + int size[2]; int orientation; if ( screen_get_window_property_iv(fgStructure.CurrentWindow->Window.Handle, SCREEN_PROPERTY_BUFFER_SIZE, size) != 0 ) return 0; if ( screen_get_window_property_iv(fgStructure.CurrentWindow->Window.Handle, SCREEN_PROPERTY_ROTATION, &orientation) != 0 ) - return 0; + return 0; + int orientationDif = abs(orientation - fgStructure.CurrentWindow->State.pWState.originalRotation); if (orientationDif == 90 || orientationDif == 270) { - /* Swap dim. if screen is rotated */ - int tmp = size[0]; - size[0] = size[1]; - size[1] = tmp; + /* Swap dim. if screen is rotated */ + int tmp = size[0]; + size[0] = size[1]; + size[1] = tmp; } switch ( eWhat ) { diff --git a/src/blackberry/fg_window_blackberry.c b/src/blackberry/fg_window_blackberry.c index 0b7d80b..e88653c 100644 --- a/src/blackberry/fg_window_blackberry.c +++ b/src/blackberry/fg_window_blackberry.c @@ -32,7 +32,6 @@ #include "fg_internal.h" #include "egl/fg_window_egl.h" #include -#include /* * Opens a window. Requires a SFG_Window object created and attached @@ -65,7 +64,7 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title, #elif GL_VERSION_ES_CM_1_0 || GL_VERSION_ES_CL_1_0 || GL_VERSION_ES_CM_1_1 || GL_VERSION_ES_CL_1_1 int screenUsage = SCREEN_USAGE_OPENGL_ES1 | SCREEN_USAGE_ROTATION; #endif -#ifndef __X86__ +#if !defined(__X86__) && !defined(__PLAYBOOK__) screenUsage |= SCREEN_USAGE_DISPLAY; // Physical device copy directly into physical display #endif if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_FORMAT, &screenFormat)) { diff --git a/src/fg_internal.h b/src/fg_internal.h index 6c1060f..6698865 100644 --- a/src/fg_internal.h +++ b/src/fg_internal.h @@ -45,7 +45,7 @@ #elif defined (__ANDROID__) # define TARGET_HOST_ANDROID 1 -#elif defined (__QNXNTO__) +#elif defined (__QNXNTO__) || defined (__PLAYBOOK__) # define TARGET_HOST_BLACKBERRY 1 #elif defined(__posix__) || defined(__unix__) || defined(__linux__) || defined(__sun) @@ -71,6 +71,14 @@ # define TARGET_HOST_MS_WINDOWS 0 #endif +#ifndef TARGET_HOST_ANDROID +# define TARGET_HOST_ANDROID 0 +#endif + +#ifndef TARGET_HOST_BLACKBERRY +# define TARGET_HOST_BLACKBERRY 0 +#endif + #ifndef TARGET_HOST_POSIX_X11 # define TARGET_HOST_POSIX_X11 0 #endif -- 1.7.10.4