diff options
-rw-r--r-- | intern/ghost/CMakeLists.txt | 8 | ||||
-rw-r--r-- | intern/ghost/SConscript | 2 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_NDOFManager.h | 4 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_NDOFManager3Dconnexion.c | 83 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_NDOFManager3Dconnexion.h | 50 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_NDOFManagerCocoa.h | 19 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_NDOFManagerCocoa.mm | 41 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_SystemCocoa.mm | 1 | ||||
-rw-r--r-- | source/creator/CMakeLists.txt | 4 |
9 files changed, 176 insertions, 36 deletions
diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt index 2538f0612db..0fb6d22b251 100644 --- a/intern/ghost/CMakeLists.txt +++ b/intern/ghost/CMakeLists.txt @@ -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() diff --git a/intern/ghost/SConscript b/intern/ghost/SConscript index d1ecc5e8c13..fb289801e7a 100644 --- a/intern/ghost/SConscript +++ b/intern/ghost/SConscript @@ -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: diff --git a/intern/ghost/intern/GHOST_NDOFManager.h b/intern/ghost/intern/GHOST_NDOFManager.h index 2c213752f94..50f784d89c4 100644 --- a/intern/ghost/intern/GHOST_NDOFManager.h +++ b/intern/ghost/intern/GHOST_NDOFManager.h @@ -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 index 00000000000..2efa0e6d5e8 --- /dev/null +++ b/intern/ghost/intern/GHOST_NDOFManager3Dconnexion.c @@ -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 index 00000000000..9a84c14b4ac --- /dev/null +++ b/intern/ghost/intern/GHOST_NDOFManager3Dconnexion.h @@ -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 diff --git a/intern/ghost/intern/GHOST_NDOFManagerCocoa.h b/intern/ghost/intern/GHOST_NDOFManagerCocoa.h index 8d8081ebb5c..2a1b492dd96 100644 --- a/intern/ghost/intern/GHOST_NDOFManagerCocoa.h +++ b/intern/ghost/intern/GHOST_NDOFManagerCocoa.h @@ -26,7 +26,22 @@ #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; }; diff --git a/intern/ghost/intern/GHOST_NDOFManagerCocoa.mm b/intern/ghost/intern/GHOST_NDOFManagerCocoa.mm index 0d009e17561..4fc4f8016e5 100644 --- a/intern/ghost/intern/GHOST_NDOFManagerCocoa.mm +++ b/intern/ghost/intern/GHOST_NDOFManagerCocoa.mm @@ -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 diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index 01a760609ff..004821a0857 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -51,6 +51,7 @@ #include "GHOST_WindowCocoa.h" #ifdef WITH_INPUT_NDOF #include "GHOST_NDOFManagerCocoa.h" +#include "GHOST_NDOFManager3Dconnexion.h" #endif #include "AssertMacros.h" diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 8ff4ec445ea..c45d59791c2 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -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() |