* interspersed\r
*/\r
\r
-/* XXX It might be better to poll the operating system for the numbers of buttons and\r
- * XXX axes and then dynamically allocate the arrays.\r
- */\r
-#define _JS_MAX_BUTTONS 32\r
-\r
#if TARGET_HOST_MACINTOSH\r
-# define _JS_MAX_AXES 9\r
# include <InputSprocket.h>\r
#endif\r
\r
#if TARGET_HOST_MAC_OSX\r
-# define _JS_MAX_AXES 16\r
# include <mach/mach.h>\r
# include <IOKit/IOkitLib.h>\r
# include <IOKit/hid/IOHIDLib.h>\r
#endif\r
\r
#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
-# define _JS_MAX_AXES 8\r
# include <windows.h>\r
# include <mmsystem.h>\r
# include <regstr.h>\r
#endif\r
\r
#if TARGET_HOST_POSIX_X11\r
-# define _JS_MAX_AXES 16\r
# ifdef HAVE_SYS_IOCTL_H\r
# include <sys/ioctl.h>\r
# endif\r
#endif\r
\r
/*\r
- * Definition of "SFG_Joystick" structure -- based on JS's "jsJoystick" object class.\r
- * See "js.h" lines 80-178.\r
- */\r
-typedef struct tagSFG_Joystick SFG_Joystick;\r
-struct tagSFG_Joystick\r
-{\r
-#if TARGET_HOST_MACINTOSH\r
-#define ISP_NUM_AXIS 9\r
-#define ISP_NUM_NEEDS 41\r
- ISpElementReference isp_elem [ ISP_NUM_NEEDS ];\r
- ISpNeed isp_needs [ ISP_NUM_NEEDS ];\r
-#endif\r
-\r
-#if TARGET_HOST_MAC_OSX\r
- IOHIDDeviceInterface ** hidDev;\r
- IOHIDElementCookie buttonCookies[41];\r
- IOHIDElementCookie axisCookies[_JS_MAX_AXES];\r
- long minReport[_JS_MAX_AXES],\r
- maxReport[_JS_MAX_AXES];\r
-#endif\r
-\r
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
- JOYCAPS jsCaps;\r
- JOYINFOEX js;\r
- UINT js_id;\r
-#endif\r
-\r
-\r
-#if TARGET_HOST_POSIX_X11\r
-# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)\r
- struct os_specific_s *os;\r
-# endif\r
-\r
-# ifdef JS_NEW\r
- struct js_event js;\r
- int tmp_buttons;\r
- float tmp_axes [ _JS_MAX_AXES ];\r
-# else\r
- struct JS_DATA_TYPE js;\r
-# endif\r
-\r
- char fname [ 128 ];\r
- int fd;\r
-#endif\r
-\r
- int id;\r
- GLboolean error;\r
- char name [ 128 ];\r
- int num_axes;\r
- int num_buttons;\r
-\r
- float dead_band[ _JS_MAX_AXES ];\r
- float saturate [ _JS_MAX_AXES ];\r
- float center [ _JS_MAX_AXES ];\r
- float max [ _JS_MAX_AXES ];\r
- float min [ _JS_MAX_AXES ];\r
-};\r
-\r
-/*\r
* Functions associated with the "jsJoystick" class in PLIB\r
*/\r
#if TARGET_HOST_MAC_OSX\r
\r
\r
/* External function declarations (mostly platform-specific) */\r
+extern void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident );\r
extern void fgPlatformJoystickClose ( int ident );\r
\r
/*\r
#define MAX_NUM_JOYSTICKS 2\r
static SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ];\r
\r
+/*\r
+ * Platform-Specific Code\r
+ */\r
+\r
+#if TARGET_HOST_MACINTOSH\r
+void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
+{\r
+ fgJoystick[ ident ]->id = ident;\r
+ snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */\r
+ fgJoystick[ ident ]->error = GL_FALSE;\r
+}\r
+\r
+\r
+void fgPlatformJoystickClose ( int ident )\r
+{\r
+ ISpSuspend( );\r
+ ISpStop( );\r
+ ISpShutdown( );\r
+}\r
+#endif\r
+\r
+#if TARGET_HOST_MAC_OSX\r
+void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
+{\r
+ fgJoystick[ ident ]->id = ident;\r
+ fgJoystick[ ident ]->error = GL_FALSE;\r
+ fgJoystick[ ident ]->num_axes = 0;\r
+ fgJoystick[ ident ]->num_buttons = 0;\r
+\r
+ if( numDevices < 0 )\r
+ {\r
+ /* do first-time init (since we can't over-ride jsInit, hmm */\r
+ numDevices = 0;\r
+\r
+ mach_port_t masterPort;\r
+ IOReturn rv = IOMasterPort( bootstrap_port, &masterPort );\r
+ if( rv != kIOReturnSuccess )\r
+ {\r
+ fgWarning( "error getting master Mach port" );\r
+ return;\r
+ }\r
+ fghJoystickFindDevices( masterPort );\r
+ }\r
+\r
+ if ( ident >= numDevices )\r
+ {\r
+ fgJoystick[ ident ]->error = GL_TRUE;\r
+ return;\r
+ }\r
+\r
+ /* get the name now too */\r
+ CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] );\r
+ CFTypeRef ref = CFDictionaryGetValue( properties,\r
+ CFSTR( kIOHIDProductKey ) );\r
+ if (!ref)\r
+ ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) );\r
+\r
+ if( !ref ||\r
+ !CFStringGetCString( ( CFStringRef )ref, name, 128,\r
+ CFStringGetSystemEncoding( ) ) )\r
+ {\r
+ fgWarning( "error getting device name" );\r
+ name[ 0 ] = '\0';\r
+ }\r
+}\r
+\r
+\r
+void fgPlatformJoystickClose ( int ident )\r
+{\r
+ ( *( fgJoystick[ ident ]->hidDev ) )->\r
+ close( fgJoystick[ ident ]->hidDev );\r
+}\r
+#endif\r
+\r
+#if TARGET_HOST_POSIX_X11\r
+void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
+{\r
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
+ fgJoystick[ ident ]->id = ident;\r
+ fgJoystick[ ident ]->error = GL_FALSE;\r
+\r
+ fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) );\r
+ memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) );\r
+ if( ident < USB_IDENT_OFFSET )\r
+ fgJoystick[ ident ]->os->is_analog = 1;\r
+ if( fgJoystick[ ident ]->os->is_analog )\r
+ snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident );\r
+ else\r
+ snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", UHIDDEV,\r
+ ident - USB_IDENT_OFFSET );\r
+#elif defined( __linux__ )\r
+ fgJoystick[ ident ]->id = ident;\r
+ fgJoystick[ ident ]->error = GL_FALSE;\r
+\r
+ snprintf( fgJoystick[ident]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident );\r
+\r
+ if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 )\r
+ snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident );\r
+#endif\r
+}\r
+\r
+\r
+void fgPlatformJoystickClose ( int ident )\r
+{\r
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
+ if( fgJoystick[ident]->os )\r
+ {\r
+ if( ! fgJoystick[ ident ]->error )\r
+ close( fgJoystick[ ident ]->os->fd );\r
+#ifdef HAVE_USB_JS\r
+ if( fgJoystick[ ident ]->os->hids )\r
+ free (fgJoystick[ ident ]->os->hids);\r
+ if( fgJoystick[ ident ]->os->hid_data_buf )\r
+ free( fgJoystick[ ident ]->os->hid_data_buf );\r
+#endif\r
+ free( fgJoystick[ident]->os );\r
+ }\r
+#endif\r
+\r
+ if( ! fgJoystick[ident]->error )\r
+ close( fgJoystick[ ident ]->fd );\r
+}\r
+#endif\r
+\r
+\r
\r
/*\r
* Read the raw joystick data\r
fgJoystick[ ident ]->num_axes = fgJoystick[ ident ]->num_buttons = 0;\r
fgJoystick[ ident ]->error = GL_TRUE;\r
\r
-#if TARGET_HOST_MACINTOSH\r
- fgJoystick[ ident ]->id = ident;\r
- snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */\r
- fgJoystick[ ident ]->error = GL_FALSE;\r
-#endif\r
-\r
-#if TARGET_HOST_MAC_OSX\r
- fgJoystick[ ident ]->id = ident;\r
- fgJoystick[ ident ]->error = GL_FALSE;\r
- fgJoystick[ ident ]->num_axes = 0;\r
- fgJoystick[ ident ]->num_buttons = 0;\r
-\r
- if( numDevices < 0 )\r
- {\r
- /* do first-time init (since we can't over-ride jsInit, hmm */\r
- numDevices = 0;\r
-\r
- mach_port_t masterPort;\r
- IOReturn rv = IOMasterPort( bootstrap_port, &masterPort );\r
- if( rv != kIOReturnSuccess )\r
- {\r
- fgWarning( "error getting master Mach port" );\r
- return;\r
- }\r
- fghJoystickFindDevices( masterPort );\r
- }\r
-\r
- if ( ident >= numDevices )\r
- {\r
- fgJoystick[ ident ]->error = GL_TRUE;\r
- return;\r
- }\r
-\r
- /* get the name now too */\r
- CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] );\r
- CFTypeRef ref = CFDictionaryGetValue( properties,\r
- CFSTR( kIOHIDProductKey ) );\r
- if (!ref)\r
- ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) );\r
-\r
- if( !ref ||\r
- !CFStringGetCString( ( CFStringRef )ref, name, 128,\r
- CFStringGetSystemEncoding( ) ) )\r
- {\r
- fgWarning( "error getting device name" );\r
- name[ 0 ] = '\0';\r
- }\r
-#endif\r
-\r
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
- switch( ident )\r
- {\r
- case 0:\r
- fgJoystick[ ident ]->js_id = JOYSTICKID1;\r
- fgJoystick[ ident ]->error = GL_FALSE;\r
- break;\r
- case 1:\r
- fgJoystick[ ident ]->js_id = JOYSTICKID2;\r
- fgJoystick[ ident ]->error = GL_FALSE;\r
- break;\r
- default:\r
- fgJoystick[ ident ]->num_axes = 0;\r
- fgJoystick[ ident ]->error = GL_TRUE;\r
- return;\r
- }\r
-#endif\r
-\r
-#if TARGET_HOST_POSIX_X11\r
-# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
- fgJoystick[ ident ]->id = ident;\r
- fgJoystick[ ident ]->error = GL_FALSE;\r
-\r
- fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) );\r
- memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) );\r
- if( ident < USB_IDENT_OFFSET )\r
- fgJoystick[ ident ]->os->is_analog = 1;\r
- if( fgJoystick[ ident ]->os->is_analog )\r
- snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident );\r
- else\r
- snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", UHIDDEV,\r
- ident - USB_IDENT_OFFSET );\r
-# elif defined( __linux__ )\r
- fgJoystick[ ident ]->id = ident;\r
- fgJoystick[ ident ]->error = GL_FALSE;\r
-\r
- snprintf( fgJoystick[ident]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident );\r
-\r
- if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 )\r
- snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident );\r
-# endif\r
-#endif\r
+ fgPlatformJoystickInit( fgJoystick, ident );\r
\r
fghJoystickOpen( fgJoystick[ ident ] );\r
}\r
}\r
}\r
\r
-/*\r
- *\r
- */\r
-\r
-#if TARGET_HOST_MACINTOSH\r
-void fgPlatformJoystickClose ( int ident )\r
-{\r
- ISpSuspend( );\r
- ISpStop( );\r
- ISpShutdown( );\r
-}\r
-#endif\r
-\r
-#if TARGET_HOST_MAC_OSX\r
-void fgPlatformJoystickClose ( int ident )\r
-{\r
- ( *( fgJoystick[ ident ]->hidDev ) )->\r
- close( fgJoystick[ ident ]->hidDev );\r
-}\r
-#endif\r
-\r
-#if TARGET_HOST_POSIX_X11\r
-void fgPlatformJoystickClose ( int ident )\r
-{\r
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
- if( fgJoystick[ident]->os )\r
- {\r
- if( ! fgJoystick[ ident ]->error )\r
- close( fgJoystick[ ident ]->os->fd );\r
-#ifdef HAVE_USB_JS\r
- if( fgJoystick[ ident ]->os->hids )\r
- free (fgJoystick[ ident ]->os->hids);\r
- if( fgJoystick[ ident ]->os->hid_data_buf )\r
- free( fgJoystick[ ident ]->os->hid_data_buf );\r
-#endif\r
- free( fgJoystick[ident]->os );\r
- }\r
-#endif\r
-\r
- if( ! fgJoystick[ident]->error )\r
- close( fgJoystick[ ident ]->fd );\r
-}\r
-#endif\r
-\r
\r
void fgJoystickClose( void )\r
{\r