Added BlackBerry PlayBook support Bug memleak when getting the number of mouse button...
authorRcmaniac25 <rcmaniac25@hotmail.com>
Fri, 24 Jan 2014 10:35:05 +0000 (10:35 +0000)
committerDiederick Niehorster <dcnieho@gmail.com>
Fri, 24 Jan 2014 10:35:05 +0000 (10:35 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1674 7f0cb862-5218-0410-a997-914c9d46530a

CMakeLists.txt
blackberry.toolchain.cmake
src/blackberry/fg_main_blackberry.c
src/blackberry/fg_state_blackberry.c
src/blackberry/fg_window_blackberry.c
src/fg_internal.h

index 28bab9d..6feb753 100644 (file)
@@ -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()
index 4c9d264..47198f9 100644 (file)
@@ -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")
index 89474d0..4aa6759 100644 (file)
 #include "fg_internal.h"
 #include "egl/fg_window_egl.h"
 
+#ifdef __PLAYBOOK__
+#include <sys/slog.h>
+#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 <slog2.h>
 #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 <sys/keycodes.h>
 #include <input/screen_helpers.h>
 #include <bps/bps.h>
@@ -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 */
index c7991a9..246ba04 100644 (file)
 //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 )
         {
index 0b7d80b..e88653c 100644 (file)
@@ -32,7 +32,6 @@
 #include "fg_internal.h"
 #include "egl/fg_window_egl.h"
 #include <screen/screen.h>
-#include <bps/screen.h>
 
 /*
  * 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)) {
index 6c1060f..6698865 100644 (file)
@@ -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)
 #   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