OSX: Compilefix for ndof symbols get magled when used extern C, now use discrete...
authorJens Verwiebe <info@jensverwiebe.de>
Fri, 13 Sep 2013 15:18:17 +0000 (15:18 +0000)
committerJens Verwiebe <info@jensverwiebe.de>
Fri, 13 Sep 2013 15:18:17 +0000 (15:18 +0000)
intern/ghost/CMakeLists.txt
intern/ghost/SConscript
intern/ghost/intern/GHOST_NDOFManager.h
intern/ghost/intern/GHOST_NDOFManager3Dconnexion.c [new file with mode: 0644]
intern/ghost/intern/GHOST_NDOFManager3Dconnexion.h [new file with mode: 0644]
intern/ghost/intern/GHOST_NDOFManagerCocoa.h
intern/ghost/intern/GHOST_NDOFManagerCocoa.mm
intern/ghost/intern/GHOST_SystemCocoa.mm
source/creator/CMakeLists.txt

index 2538f0612db001e344ccfa87fae48004bb945064..0fb6d22b251ec5adbbcee12296c384edcc534882 100644 (file)
@@ -191,6 +191,10 @@ elseif(APPLE)
                                intern/GHOST_NDOFManagerCocoa.mm
                                intern/GHOST_NDOFManagerCocoa.h
                        )
+                       list(APPEND SRC2
+                               intern/GHOST_NDOFManager3Dconnexion.c
+                               intern/GHOST_NDOFManager3Dconnexion.h
+                       )
                endif()
 
        else()
@@ -318,4 +322,6 @@ endif()
 add_definitions(-DGLEW_STATIC)
 
 blender_add_lib(bf_intern_ghost "${SRC}" "${INC}" "${INC_SYS}")
-
+if(WITH_INPUT_NDOF)
+blender_add_lib(bf_intern_ghostndof3dconnexion "${SRC2}" "${INC}" "${INC_SYS}")
+endif()
index d1ecc5e8c13a43642ee61c9c0f6b8f3acc7d9968..fb289801e7a38731ad4790a9f95ca26aff9d337f 100644 (file)
@@ -33,6 +33,7 @@ Import ('env')
 window_system = env['OURPLATFORM']
 
 sources = env.Glob('intern/*.cpp')
+sources2 = env.Glob('intern/GHOST_NDOFManager3Dconnexion.c')
 if window_system == 'darwin':
     sources += env.Glob('intern/*.mm')
 
@@ -156,6 +157,7 @@ if window_system in ('win32-vc', 'win64-vc'):
 
 elif env['WITH_GHOST_COCOA']:   # always use default-Apple-gcc for objC language, for gnu-compilers do not support it fully yet
     env.BlenderLib ('bf_intern_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15], cc_compilerchange='/usr/bin/gcc', cxx_compilerchange='/usr/bin/g++' )
+    env.BlenderLib ('bf_intern_ghostndof3dconnexion', sources2, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15], cc_compilerchange='/usr/bin/gcc', cxx_compilerchange='/usr/bin/g++' )
     print "GHOST COCOA WILL BE COMPILED WITH APPLE GCC"
 
 else:
index 2c213752f94cafef8c9854457aeaddc95c709817..50f784d89c4636af56e0a2acac9c1ca5dfdbf9e1 100644 (file)
@@ -109,10 +109,6 @@ public:
 
        virtual ~GHOST_NDOFManager() {}
 
-       // whether multi-axis functionality is available (via the OS or driver)
-       // does not imply that a device is plugged in or being used
-       virtual bool available() = 0;
-
        // each platform's device detection should call this
        // use standard USB/HID identifiers
        bool setDevice(unsigned short vendor_id, unsigned short product_id);
diff --git a/intern/ghost/intern/GHOST_NDOFManager3Dconnexion.c b/intern/ghost/intern/GHOST_NDOFManager3Dconnexion.c
new file mode 100644 (file)
index 0000000..2efa0e6
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s):
+ *   Jake Kauth on 9/12/13.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifdef WITH_INPUT_NDOF
+
+#include <ConnexionClientAPI.h>
+#include <stdio.h>
+
+#include "GHOST_NDOFManager3Dconnexion.h"
+
+/* It is to be noted that these implementations are linked in as
+ * 'extern "C"' calls from GHOST_NDOFManagerCocoa.
+ * This is done in order to
+ * preserve weak linking capability (which as of clang-3.3 and xcode5
+ * breaks weak linking when there is name mangling of c++ libraries.)
+ *
+ * We need to have the weak linked file as pure C.  Therefore we build a 
+ * compiled bridge from the real weak linked calls and the calls within C++
+
+ */
+
+OSErr GHOST_NDOFManager3Dconnexion_available(void)
+{
+    // extern unsigned int InstallConnexionHandlers() __attribute__((weak_import));
+    // Make the linker happy for the framework check (see link below for more info)
+    // http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html
+    return InstallConnexionHandlers != 0;
+    // this means that the driver is installed and dynamically linked to blender
+}
+
+OSErr GHOST_NDOFManager3Dconnexion_oldDRV()
+{
+    //extern unsigned int SetConnexionClientButtonMask() __attribute__((weak_import));
+    // Make the linker happy for the framework check (see link below for more info)
+    // http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html
+    return SetConnexionClientButtonMask != 0;
+    // this means that the driver has this symbol
+}
+
+UInt16                 GHOST_NDOFManager3Dconnexion_RegisterConnexionClient                            (UInt32 signature, UInt8 *name, UInt16 mode, UInt32 mask) {
+    return RegisterConnexionClient(signature,  name,  mode,  mask);
+};
+void                   GHOST_NDOFManager3Dconnexion_SetConnexionClientButtonMask               (UInt16 clientID, UInt32 buttonMask){
+    return SetConnexionClientButtonMask( clientID,  buttonMask);
+};
+void                   GHOST_NDOFManager3Dconnexion_UnregisterConnexionClient                  (UInt16 clientID){
+    return UnregisterConnexionClient( clientID);
+};
+OSErr                  GHOST_NDOFManager3Dconnexion_InstallConnexionHandlers                   (ConnexionMessageHandlerProc messageHandler, ConnexionAddedHandlerProc addedHandler, ConnexionRemovedHandlerProc removedHandler){
+    return InstallConnexionHandlers( messageHandler,  addedHandler,  removedHandler);
+    
+    
+};
+void                   GHOST_NDOFManager3Dconnexion_CleanupConnexionHandlers                   (void){
+    return CleanupConnexionHandlers();
+};
+OSErr  GHOST_NDOFManager3Dconnexion_ConnexionControl(UInt32 message, SInt32 param, SInt32 *result){
+return ConnexionControl( message,  param, result);
+}
+
+
+#endif // WITH_INPUT_NDOF
diff --git a/intern/ghost/intern/GHOST_NDOFManager3Dconnexion.h b/intern/ghost/intern/GHOST_NDOFManager3Dconnexion.h
new file mode 100644 (file)
index 0000000..9a84c14
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s):
+ *   Jake Kauth on 9/12/13.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __GHOST_NDOFMANAGER3DCONNEXION_H__
+#define __GHOST_NDOFMANAGER3DCONNEXION_H__
+
+#ifdef WITH_INPUT_NDOF
+#include <ConnexionClientAPI.h>
+
+
+OSErr GHOST_NDOFManager3Dconnexion_available(void);
+OSErr GHOST_NDOFManager3Dconnexion_oldDRV(void);
+OSErr                  GHOST_NDOFManager3Dconnexion_InstallConnexionHandlers(ConnexionMessageHandlerProc messageHandler, ConnexionAddedHandlerProc addedHandler, ConnexionRemovedHandlerProc removedHandler);
+void                   GHOST_NDOFManager3Dconnexion_CleanupConnexionHandlers(void);
+UInt16                 GHOST_NDOFManager3Dconnexion_RegisterConnexionClient(UInt32 signature, UInt8 *name, UInt16 mode, UInt32 mask);
+void                   GHOST_NDOFManager3Dconnexion_SetConnexionClientButtonMask(UInt16 clientID, UInt32 buttonMask);
+void                   GHOST_NDOFManager3Dconnexion_UnregisterConnexionClient(UInt16 clientID);
+OSErr  GHOST_NDOFManager3Dconnexion_ConnexionControl(UInt32 message, SInt32 param, SInt32 *result);
+
+extern OSErr InstallConnexionHandlers(ConnexionMessageHandlerProc messageHandler, ConnexionAddedHandlerProc addedHandler, ConnexionRemovedHandlerProc removedHandler) __attribute__((weak_import));
+extern void            CleanupConnexionHandlers(void) __attribute__((weak_import));
+extern UInt16 RegisterConnexionClient(UInt32 signature, UInt8 *name, UInt16 mode, UInt32 mask) __attribute__((weak_import));
+extern void SetConnexionClientButtonMask(UInt16 clientID, UInt32 buttonMask) __attribute__((weak_import));
+extern void UnregisterConnexionClient(UInt16 clientID) __attribute__((weak_import));
+extern OSErr   ConnexionControl(UInt32 message, SInt32 param, SInt32 *result) __attribute__((weak_import));
+
+
+#endif // WITH_INPUT_NDOF
+
+#endif // #include guard
index 8d8081ebb5c5b10030003c5389eac90a8576bcfa..2a1b492dd96221396484850f037c82e252668002 100644 (file)
 
 #ifdef WITH_INPUT_NDOF
 
+
+extern "C" {
+#include <ConnexionClientAPI.h>
+#include <stdio.h>
+}
+
+
 #include "GHOST_NDOFManager.h"
+extern "C"  OSErr   GHOST_NDOFManager3Dconnexion_available(void);
+extern "C"  OSErr   GHOST_NDOFManager3Dconnexion_oldDRV(void);
+extern "C"  OSErr   GHOST_NDOFManager3Dconnexion_InstallConnexionHandlers(ConnexionMessageHandlerProc messageHandler, ConnexionAddedHandlerProc addedHandler, ConnexionRemovedHandlerProc removedHandler);
+extern "C"  void GHOST_NDOFManager3Dconnexion_CleanupConnexionHandlers(void);
+extern "C"  UInt16  GHOST_NDOFManager3Dconnexion_RegisterConnexionClient(UInt32 signature, UInt8 *name, UInt16 mode, UInt32 mask);
+extern "C"  void    GHOST_NDOFManager3Dconnexion_SetConnexionClientButtonMask(UInt16 clientID, UInt32 buttonMask);
+extern "C"  void       GHOST_NDOFManager3Dconnexion_UnregisterConnexionClient(UInt16 clientID);
+extern "C"  OSErr      GHOST_NDOFManager3Dconnexion_ConnexionControl(UInt32 message, SInt32 param, SInt32 *result);
 
 // Event capture is handled within the NDOF manager on Macintosh,
 // so there's no need for SystemCocoa to look for them.
@@ -40,9 +55,7 @@ public:
 
        // whether multi-axis functionality is available (via the OS or driver)
        // does not imply that a device is plugged in or being used
-       bool available();
-       bool oldDRV();
-
+    
 private:
        unsigned short m_clientID;
 };
index 0d009e175615c86f140aa6e7b1df829545d63566..4fc4f8016e52902c867e956f41ef94f50cfb686e 100644 (file)
@@ -24,6 +24,7 @@
 #ifdef WITH_INPUT_NDOF
 
 #include "GHOST_NDOFManagerCocoa.h"
+#include "GHOST_NDOFManager3Dconnexion.h"
 #include "GHOST_SystemCocoa.h"
 
 extern "C" {
@@ -31,6 +32,7 @@ extern "C" {
        #include <stdio.h>
        }
 
+
 // static functions need to talk to these objects:
 static GHOST_SystemCocoa* ghost_system = NULL;
 static GHOST_NDOFManager* ndof_manager = NULL;
@@ -50,7 +52,7 @@ static void NDOF_DeviceAdded(io_connect_t connection)
 
        // determine exactly which device is plugged in
        SInt32 result = 0;
-       ConnexionControl(kConnexionCtlGetDeviceID, 0, &result);
+       GHOST_NDOFManager3Dconnexion_ConnexionControl(kConnexionCtlGetDeviceID, 0, &result);
        unsigned short vendorID = result >> 16;
        unsigned short productID = result & 0xffff;
 
@@ -123,27 +125,27 @@ static void NDOF_DeviceEvent(io_connect_t connection, natural_t messageType, voi
 GHOST_NDOFManagerCocoa::GHOST_NDOFManagerCocoa(GHOST_System& sys)
     : GHOST_NDOFManager(sys)
 {
-       if (available())
+       if (GHOST_NDOFManager3Dconnexion_available())
        {
                // give static functions something to talk to:
                ghost_system = dynamic_cast<GHOST_SystemCocoa*>(&sys);
                ndof_manager = this;
 
-               OSErr error = InstallConnexionHandlers(NDOF_DeviceEvent, NDOF_DeviceAdded, NDOF_DeviceRemoved);
+               OSErr error = GHOST_NDOFManager3Dconnexion_InstallConnexionHandlers(NDOF_DeviceEvent, NDOF_DeviceAdded, NDOF_DeviceRemoved);
                if (error) {
                        printf("ndof: error %d while installing handlers\n", error);
                        return;
                }
 
                // Pascal string *and* a four-letter constant. How old-skool.
-               m_clientID = RegisterConnexionClient('blnd', (UInt8*) "\007blender",
+               m_clientID = GHOST_NDOFManager3Dconnexion_RegisterConnexionClient('blnd', (UInt8*) "\007blender",
                                                     kConnexionClientModeTakeOver, kConnexionMaskAll);
 
                // printf("ndof: client id = %d\n", m_clientID);
 
-               if (oldDRV()) {
+               if (GHOST_NDOFManager3Dconnexion_oldDRV()) {
                        has_old_driver = false;
-                       SetConnexionClientButtonMask(m_clientID, kConnexionMaskAllButtons);
+                       GHOST_NDOFManager3Dconnexion_SetConnexionClientButtonMask(m_clientID, kConnexionMaskAllButtons);
                }
                else {
                        printf("ndof: old 3Dx driver installed, some buttons may not work\n");
@@ -157,31 +159,14 @@ GHOST_NDOFManagerCocoa::GHOST_NDOFManagerCocoa(GHOST_System& sys)
 
 GHOST_NDOFManagerCocoa::~GHOST_NDOFManagerCocoa()
 {
-       if (available())
+       if (GHOST_NDOFManager3Dconnexion_available())
        {
-               UnregisterConnexionClient(m_clientID);
-               CleanupConnexionHandlers();
+               GHOST_NDOFManager3Dconnexion_UnregisterConnexionClient(m_clientID);
+        GHOST_NDOFManager3Dconnexion_UnregisterConnexionClient(m_clientID);
+
+               GHOST_NDOFManager3Dconnexion_CleanupConnexionHandlers();
                ghost_system = NULL;
                ndof_manager = NULL;
        }
 }
-extern "C" {
-       bool GHOST_NDOFManagerCocoa::available()
-       {
-               extern OSErr InstallConnexionHandlers() __attribute__((weak_import));
-               // Make the linker happy for the framework check (see link below for more info)
-               // http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html
-               return InstallConnexionHandlers != NULL;
-               // this means that the driver is installed and dynamically linked to blender
-       }
-
-       bool GHOST_NDOFManagerCocoa::oldDRV()
-       {
-               extern OSErr SetConnexionClientButtonMask() __attribute__((weak_import));
-               // Make the linker happy for the framework check (see link below for more info)
-               // http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html
-               return SetConnexionClientButtonMask != NULL;
-               // this means that the driver has this symbol
-       }
-}
 #endif // WITH_INPUT_NDOF
index 01a760609ff90a813550e78414829dcb2a3a1145..004821a0857a2e4f7f7518b1fdc5b558a542ea93 100644 (file)
@@ -51,6 +51,7 @@
 #include "GHOST_WindowCocoa.h"
 #ifdef WITH_INPUT_NDOF
 #include "GHOST_NDOFManagerCocoa.h"
+#include "GHOST_NDOFManager3Dconnexion.h"
 #endif
 
 #include "AssertMacros.h"
index 8ff4ec445ea2e755239a9c830943a005bb72d37e..c45d59791c206f1c32ac83e9bb954a0b5adfb8a2 100644 (file)
@@ -992,6 +992,10 @@ endif()
                list(APPEND BLENDER_SORTED_LIBS bf_quicktime)
        endif()
 
+       if(WITH_INPUT_NDOF)
+               list(APPEND BLENDER_SORTED_LIBS bf_intern_ghostndof3dconnexion)
+       endif()
+       
        if(WITH_MOD_BOOLEAN)
                list(APPEND BLENDER_SORTED_LIBS extern_carve)
        endif()