Moving non-Windows platform-specific code lower in the file again to avoid declaratio...
authorJohn F. Fay <johnffay@nettally.com>
Sun, 29 Jan 2012 04:25:56 +0000 (04:25 +0000)
committerJohn F. Fay <johnffay@nettally.com>
Sun, 29 Jan 2012 04:25:56 +0000 (04:25 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1021 7f0cb862-5218-0410-a997-914c9d46530a

src/Common/freeglut_joystick.c
src/mswin/freeglut_joystick_mswin.c

index 5cfa430..962b0f1 100644 (file)
@@ -388,6 +388,7 @@ static void fghJoystickAddHatElement ( SFG_Joystick* joy, CFDictionaryRef hat );
 \r
 \r
 /* External function declarations (mostly platform-specific) */\r
+extern void fgPlatformJoystickOpen( SFG_Joystick* joy );\r
 extern void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident );\r
 extern void fgPlatformJoystickClose ( int ident );\r
 \r
@@ -398,132 +399,6 @@ extern void fgPlatformJoystickClose ( int ident );
 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
  */\r
 static void fghJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )\r
@@ -1054,109 +929,16 @@ static void fghJoystickAddHatElement ( SFG_Joystick *joy, CFDictionaryRef button
 }\r
 #endif\r
 \r
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
-/* Inspired by\r
-   http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp\r
+/*\r
+ *  Platform-Specific Code\r
  */\r
-#    if FREEGLUT_LIB_PRAGMAS\r
-#        pragma comment (lib, "advapi32.lib")\r
-#    endif\r
-\r
-static int fghJoystickGetOEMProductName ( SFG_Joystick* joy, char *buf, int buf_sz )\r
-{\r
-    char buffer [ 256 ];\r
-\r
-    char OEMKey [ 256 ];\r
-\r
-    HKEY  hKey;\r
-    DWORD dwcb;\r
-    LONG  lr;\r
-\r
-    if ( joy->error )\r
-        return 0;\r
-\r
-    /* Open .. MediaResources\CurrentJoystickSettings */\r
-    _snprintf ( buffer, sizeof(buffer), "%s\\%s\\%s",\r
-                REGSTR_PATH_JOYCONFIG, joy->jsCaps.szRegKey,\r
-                REGSTR_KEY_JOYCURR );\r
-\r
-    lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey);\r
-\r
-    if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
-    /* Get OEM Key name */\r
-    dwcb = sizeof(OEMKey);\r
-\r
-    /* JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. */\r
-    _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->js_id + 1, REGSTR_VAL_JOYOEMNAME );\r
-\r
-    lr = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEMKey, &dwcb);\r
-    RegCloseKey ( hKey );\r
-\r
-    if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
-    /* Open OEM Key from ...MediaProperties */\r
-    _snprintf ( buffer, sizeof(buffer), "%s\\%s", REGSTR_PATH_JOYOEM, OEMKey );\r
-\r
-    lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey );\r
-\r
-    if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
-    /* Get OEM Name */\r
-    dwcb = buf_sz;\r
 \r
-    lr = RegQueryValueEx ( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) buf,\r
-                             &dwcb );\r
-    RegCloseKey ( hKey );\r
-\r
-    if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
-    return 1;\r
-}\r
-#endif\r
-\r
-\r
-static void fghJoystickOpen( SFG_Joystick* joy )\r
-{\r
-    int i = 0;\r
 #if TARGET_HOST_MACINTOSH\r
+void fgPlatformJoystickOpen( SFG_Joystick* joy )\r
+{\r
+       int i = 0;\r
     OSStatus err;\r
-#endif\r
-#if TARGET_HOST_MAC_OSX\r
-        IOReturn rv;\r
-        SInt32 score;\r
-        IOCFPlugInInterface **plugin;\r
-\r
-        HRESULT pluginResult;\r
-\r
-        CFDictionaryRef props;\r
-    CFTypeRef topLevelElement;\r
-#endif\r
-#if TARGET_HOST_POSIX_X11\r
-#    if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
-       char *cp;\r
-#    endif\r
-#    ifdef JS_NEW\r
-       unsigned char u;\r
-#    else\r
-#      if defined( __linux__ ) || TARGET_HOST_SOLARIS\r
-         int counter = 0;\r
-#      endif\r
-#    endif\r
-#endif\r
 \r
-    /* Silence gcc, the correct #ifdefs would be too fragile... */\r
-    (void)i;\r
-\r
-    /*\r
-     * Default values (for no joystick -- each conditional will reset the\r
-     * error flag)\r
-     */\r
-    joy->error = TRUE;\r
-    joy->num_axes = joy->num_buttons = 0;\r
-    joy->name[ 0 ] = '\0';\r
-\r
-#if TARGET_HOST_MACINTOSH\r
     /* XXX FIXME: get joystick name in Mac */\r
 \r
     err = ISpStartup( );\r
@@ -1254,9 +1036,37 @@ static void fghJoystickOpen( SFG_Joystick* joy )
     }\r
     else\r
         joy->num_buttons = joy->num_axes = 0;\r
+}\r
+\r
+\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 fgPlatformJoystickOpen( SFG_Joystick* joy )\r
+{\r
+    IOReturn rv;\r
+    SInt32 score;\r
+    IOCFPlugInInterface **plugin;\r
+\r
+    HRESULT pluginResult;\r
+\r
+    CFDictionaryRef props;\r
+    CFTypeRef topLevelElement;\r
+\r
     if( joy->id >= numDevices )\r
     {\r
         fgWarning( "device index out of range in fgJoystickOpen()" );\r
@@ -1304,71 +1114,77 @@ static void fghJoystickOpen( SFG_Joystick* joy )
     enumerateElements( topLevelElement );\r
 \r
     CFRelease( props );\r
-#endif\r
-\r
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
-    joy->js.dwFlags = JOY_RETURNALL;\r
-    joy->js.dwSize  = sizeof( joy->js );\r
+}\r
 \r
-    memset( &joy->jsCaps, 0, sizeof( joy->jsCaps ) );\r
 \r
-    joy->error =\r
-        ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) !=\r
-          JOYERR_NOERROR );\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( joy->jsCaps.wNumAxes == 0 )\r
-    {\r
-        joy->num_axes = 0;\r
-        joy->error = GL_TRUE;\r
-    }\r
-    else\r
+    if( numDevices < 0 )\r
     {\r
-        /* Device name from jsCaps is often "Microsoft PC-joystick driver",\r
-         * at least for USB.  Try to get the real name from the registry.\r
-         */\r
-        if ( ! fghJoystickGetOEMProductName( joy, joy->name,\r
-                                             sizeof( joy->name ) ) )\r
-        {\r
-            fgWarning( "JS: Failed to read joystick name from registry" );\r
-            strncpy( joy->name, joy->jsCaps.szPname, sizeof( joy->name ) );\r
-        }\r
+        /* do first-time init (since we can't over-ride jsInit, hmm */\r
+        numDevices = 0;\r
 \r
-        /* Windows joystick drivers may provide any combination of\r
-         * X,Y,Z,R,U,V,POV - not necessarily the first n of these.\r
-         */\r
-        if( joy->jsCaps.wCaps & JOYCAPS_HASPOV )\r
+        mach_port_t masterPort;\r
+        IOReturn rv = IOMasterPort( bootstrap_port, &masterPort );\r
+        if( rv != kIOReturnSuccess )\r
         {\r
-            joy->num_axes = _JS_MAX_AXES;\r
-            joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0;  /* POV Y */\r
-            joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0;  /* POV X */\r
+            fgWarning( "error getting master Mach port" );\r
+            return;\r
         }\r
-        else\r
-            joy->num_axes = 6;\r
-\r
-        joy->min[ 5 ] = ( float )joy->jsCaps.wVmin;\r
-        joy->max[ 5 ] = ( float )joy->jsCaps.wVmax;\r
-        joy->min[ 4 ] = ( float )joy->jsCaps.wUmin;\r
-        joy->max[ 4 ] = ( float )joy->jsCaps.wUmax;\r
-        joy->min[ 3 ] = ( float )joy->jsCaps.wRmin;\r
-        joy->max[ 3 ] = ( float )joy->jsCaps.wRmax;\r
-        joy->min[ 2 ] = ( float )joy->jsCaps.wZmin;\r
-        joy->max[ 2 ] = ( float )joy->jsCaps.wZmax;\r
-        joy->min[ 1 ] = ( float )joy->jsCaps.wYmin;\r
-        joy->max[ 1 ] = ( float )joy->jsCaps.wYmax;\r
-        joy->min[ 0 ] = ( float )joy->jsCaps.wXmin;\r
-        joy->max[ 0 ] = ( float )joy->jsCaps.wXmax;\r
+        fghJoystickFindDevices( masterPort );\r
     }\r
 \r
-    /* Guess all the rest judging on the axes extremals */\r
-    for( i = 0; i < joy->num_axes; i++ )\r
+    if ( ident >= numDevices )\r
     {\r
-        joy->center   [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f;\r
-        joy->dead_band[ i ] = 0.0f;\r
-        joy->saturate [ i ] = 1.0f;\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 fgPlatformJoystickOpen( SFG_Joystick* joy )\r
+{\r
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
+       int i = 0;\r
+       char *cp;\r
+#endif\r
+#ifdef JS_NEW\r
+       unsigned char u;\r
+#else\r
+#  if defined( __linux__ ) || TARGET_HOST_SOLARIS\r
+       int i = 0;\r
+    int counter = 0;\r
+#  endif\r
+#endif\r
+\r
 #if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
     for( i = 0; i < _JS_MAX_AXES; i++ )\r
         joy->os->cache_axes[ i ] = 0.0f;\r
@@ -1546,9 +1362,77 @@ static void fghJoystickOpen( SFG_Joystick* joy )
         joy->saturate [ i ] = 1.0f;\r
     }\r
 #endif\r
+}\r
+\r
+\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
+\r
+\r
+static void fghJoystickOpen( SFG_Joystick* joy )\r
+{\r
+    /*\r
+     * Default values (for no joystick -- each conditional will reset the\r
+     * error flag)\r
+     */\r
+    joy->error = TRUE;\r
+    joy->num_axes = joy->num_buttons = 0;\r
+    joy->name[ 0 ] = '\0';\r
+\r
+       fgPlatformJoystickOpen ( joy );\r
+\r
+}\r
+\r
 /*\r
  * This function replaces the constructor method in the JS library.\r
  */\r
index e154223..93e7c99 100644 (file)
 \r
 \r
 #if !defined(_WIN32_WCE)\r
+#    include <windows.h>\r
+#    include <mmsystem.h>\r
+#    include <regstr.h>\r
+\r
+\r
+\r
+/* Inspired by\r
+   http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp\r
+ */\r
+#  if FREEGLUT_LIB_PRAGMAS\r
+#      pragma comment (lib, "advapi32.lib")\r
+#  endif\r
+\r
+static int fghJoystickGetOEMProductName ( SFG_Joystick* joy, char *buf, int buf_sz )\r
+{\r
+    char buffer [ 256 ];\r
+\r
+    char OEMKey [ 256 ];\r
+\r
+    HKEY  hKey;\r
+    DWORD dwcb;\r
+    LONG  lr;\r
+\r
+    if ( joy->error )\r
+        return 0;\r
+\r
+    /* Open .. MediaResources\CurrentJoystickSettings */\r
+    _snprintf ( buffer, sizeof(buffer), "%s\\%s\\%s",\r
+                REGSTR_PATH_JOYCONFIG, joy->jsCaps.szRegKey,\r
+                REGSTR_KEY_JOYCURR );\r
+\r
+    lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey);\r
+\r
+    if ( lr != ERROR_SUCCESS ) return 0;\r
+\r
+    /* Get OEM Key name */\r
+    dwcb = sizeof(OEMKey);\r
+\r
+    /* JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. */\r
+    _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->js_id + 1, REGSTR_VAL_JOYOEMNAME );\r
+\r
+    lr = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEMKey, &dwcb);\r
+    RegCloseKey ( hKey );\r
+\r
+    if ( lr != ERROR_SUCCESS ) return 0;\r
+\r
+    /* Open OEM Key from ...MediaProperties */\r
+    _snprintf ( buffer, sizeof(buffer), "%s\\%s", REGSTR_PATH_JOYOEM, OEMKey );\r
+\r
+    lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey );\r
+\r
+    if ( lr != ERROR_SUCCESS ) return 0;\r
+\r
+    /* Get OEM Name */\r
+    dwcb = buf_sz;\r
+\r
+    lr = RegQueryValueEx ( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) buf,\r
+                             &dwcb );\r
+    RegCloseKey ( hKey );\r
+\r
+    if ( lr != ERROR_SUCCESS ) return 0;\r
+\r
+    return 1;\r
+}\r
+\r
+\r
+void fgPlatformJoystickOpen( SFG_Joystick* joy )\r
+{\r
+       int i = 0;\r
+\r
+    joy->js.dwFlags = JOY_RETURNALL;\r
+    joy->js.dwSize  = sizeof( joy->js );\r
+\r
+    memset( &joy->jsCaps, 0, sizeof( joy->jsCaps ) );\r
+\r
+    joy->error =\r
+        ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) !=\r
+          JOYERR_NOERROR );\r
+\r
+    if( joy->jsCaps.wNumAxes == 0 )\r
+    {\r
+        joy->num_axes = 0;\r
+        joy->error = GL_TRUE;\r
+    }\r
+    else\r
+    {\r
+        /* Device name from jsCaps is often "Microsoft PC-joystick driver",\r
+         * at least for USB.  Try to get the real name from the registry.\r
+         */\r
+        if ( ! fghJoystickGetOEMProductName( joy, joy->name,\r
+                                             sizeof( joy->name ) ) )\r
+        {\r
+            fgWarning( "JS: Failed to read joystick name from registry" );\r
+            strncpy( joy->name, joy->jsCaps.szPname, sizeof( joy->name ) );\r
+        }\r
+\r
+        /* Windows joystick drivers may provide any combination of\r
+         * X,Y,Z,R,U,V,POV - not necessarily the first n of these.\r
+         */\r
+        if( joy->jsCaps.wCaps & JOYCAPS_HASPOV )\r
+        {\r
+            joy->num_axes = _JS_MAX_AXES;\r
+            joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0;  /* POV Y */\r
+            joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0;  /* POV X */\r
+        }\r
+        else\r
+            joy->num_axes = 6;\r
+\r
+        joy->min[ 5 ] = ( float )joy->jsCaps.wVmin;\r
+        joy->max[ 5 ] = ( float )joy->jsCaps.wVmax;\r
+        joy->min[ 4 ] = ( float )joy->jsCaps.wUmin;\r
+        joy->max[ 4 ] = ( float )joy->jsCaps.wUmax;\r
+        joy->min[ 3 ] = ( float )joy->jsCaps.wRmin;\r
+        joy->max[ 3 ] = ( float )joy->jsCaps.wRmax;\r
+        joy->min[ 2 ] = ( float )joy->jsCaps.wZmin;\r
+        joy->max[ 2 ] = ( float )joy->jsCaps.wZmax;\r
+        joy->min[ 1 ] = ( float )joy->jsCaps.wYmin;\r
+        joy->max[ 1 ] = ( float )joy->jsCaps.wYmax;\r
+        joy->min[ 0 ] = ( float )joy->jsCaps.wXmin;\r
+        joy->max[ 0 ] = ( float )joy->jsCaps.wXmax;\r
+    }\r
+\r
+    /* Guess all the rest judging on the axes extremals */\r
+    for( i = 0; i < joy->num_axes; i++ )\r
+    {\r
+        joy->center   [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f;\r
+        joy->dead_band[ i ] = 0.0f;\r
+        joy->saturate [ i ] = 1.0f;\r
+    }\r
+}\r
+\r
+\r
+\r
 void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
 {\r
     switch( ident )\r