Normalized the style of the new joystick a bit.
authorRichard Rauch <rkr@olib.org>
Sat, 14 Feb 2004 08:51:54 +0000 (08:51 +0000)
committerRichard Rauch <rkr@olib.org>
Sat, 14 Feb 2004 08:51:54 +0000 (08:51 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@462 7f0cb862-5218-0410-a997-914c9d46530a

src/freeglut_joystick.c

index 3de906b..6bdccf5 100644 (file)
@@ -1126,7 +1126,7 @@ static void fghJoystickOpen( SFG_Joystick* joy )
     CFTypeRef topLevelElement;
 #endif
 #if TARGET_HOST_UNIX_X11
-#    if defined(__FreeBSD__) || defined(__NetBSD__)
+#    if defined( __FreeBSD__ ) || defined( __NetBSD__ )
        char *cp;
 #    endif
 #    ifdef JS_NEW
@@ -1136,29 +1136,32 @@ static void fghJoystickOpen( SFG_Joystick* joy )
 #    endif
 #endif
 
-    /* Default values (for no joystick -- each conditional will reset the error flag) */
+    /*
+     * Default values (for no joystick -- each conditional will reset the
+     * error flag)
+     */
     joy->error = TRUE;
     joy->num_axes = joy->num_buttons = 0;
-    joy->name [0] = '\0';
+    joy->name[ 0 ] = '\0';
 
 #if TARGET_HOST_MACINTOSH
     /*
      * XXX FIXME: get joystick name in Mac
      */
 
-    err = ISpStartup ();
+    err = ISpStartup( );
 
-    if ( err == noErr )
+    if( err == noErr )
     {
-#define ISP_CHECK_ERR(x) if ( x != noErr ) { joy->error = GL_TRUE; return; }
+#define ISP_CHECK_ERR(x) if( x != noErr ) { joy->error = GL_TRUE; return; }
 
         joy->error = GL_TRUE;
 
         /* initialize the needs structure */
-        ISpNeed temp_isp_needs[isp_num_needs] =
+        ISpNeed temp_isp_needs[ isp_num_needs ] =
         {
-          { "\pX-Axis",    128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
-          { "\pY-Axis",    128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+          { "\pX-Axis",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+          { "\pY-Axis",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
           { "\pZ-Axis",    128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
           { "\pR-Axis",    128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
           { "\pAxis   4",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
@@ -1201,7 +1204,7 @@ static void fghJoystickOpen( SFG_Joystick* joy )
           { "\pButton 31", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
         };
 
-        memcpy ( joy->isp_needs, temp_isp_needs, sizeof(temp_isp_needs) );
+        memcpy( joy->isp_needs, temp_isp_needs, sizeof (temp_isp_needs ) );
 
 
         /* next two calls allow keyboard and mouse to emulate other input
@@ -1216,22 +1219,25 @@ static void fghJoystickOpen( SFG_Joystick* joy )
           ISP_CHECK_ERR(err)
         */
 
-        err = ISpElement_NewVirtualFromNeeds ( joy->isp_num_needs, joy->isp_needs, joy->isp_elem, 0 );
-        ISP_CHECK_ERR(err)
+        err = ISpElement_NewVirtualFromNeeds( joy->isp_num_needs,
+                                              joy->isp_needs, joy->isp_elem,
+                                              0 );
+        ISP_CHECK_ERR( err )
 
-        err = ISpInit ( joy->isp_num_needs, joy->isp_needs, joy->isp_elem, 'freeglut', nil, 0, 128, 0 );
-        ISP_CHECK_ERR(err)
+        err = ISpInit( joy->isp_num_needs, joy->isp_needs, joy->isp_elem,
+                       'freeglut', nil, 0, 128, 0 );
+        ISP_CHECK_ERR( err )
 
         joy->num_buttons = joy->isp_num_needs - joy->isp_num_axis;
         joy->num_axes    = joy->isp_num_axis;
 
-        for ( i = 0; i < joy->num_axes; i++ )
+        for( i = 0; i < joy->num_axes; i++ )
         {
-          joy->dead_band [ i ] = 0;
-          joy->saturate  [ i ] = 1;
-          joy->center    [ i ] = kISpAxisMiddle;
-          joy->max       [ i ] = kISpAxisMaximum;
-          joy->min       [ i ] = kISpAxisMinimum;
+            joy->dead_band[ i ] = 0;
+            joy->saturate [ i ] = 1;
+            joy->center   [ i ] = kISpAxisMiddle;
+            joy->max      [ i ] = kISpAxisMaximum;
+            joy->min      [ i ] = kISpAxisMinimum;
         }
 
         joy->error = GL_FALSE;
@@ -1241,46 +1247,53 @@ static void fghJoystickOpen( SFG_Joystick* joy )
 #endif
 
 #if TARGET_HOST_MAC_OSX
-    if (joy->id >= numDevices) {
-        fgWarning ( "%s", "device index out of range in fgJoystickOpen()");
+    if( joy->id >= numDevices )
+    {
+        fgWarning( "%s", "device index out of range in fgJoystickOpen()" );
         return;
     }
 
     /* create device interface */
-    rv = IOCreatePlugInInterfaceForService ( ioDevices[joy->id], 
-                                             kIOHIDDeviceUserClientTypeID,
-                                             kIOCFPlugInInterfaceID,
-                                             &plugin, &score);
+    rv = IOCreatePlugInInterfaceForService( ioDevices[ joy->id ], 
+                                            kIOHIDDeviceUserClientTypeID,
+                                            kIOCFPlugInInterfaceID,
+                                            &plugin, &score );
 
-    if (rv != kIOReturnSuccess) {
-        fgWarning ( "%s", "error creating plugin for io device");
+    if( rv != kIOReturnSuccess )
+    {
+        fgWarning( "%s", "error creating plugin for io device" );
         return;
     }
 
-    pluginResult = (*plugin)->QueryInterface ( plugin, 
-                    CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), &(LPVOID) joy->hidDev );
+    pluginResult = ( *plugin )->QueryInterface(
+        plugin, 
+        CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID),
+        &( LPVOID )joy->hidDev
+    );
 
-    if ( pluginResult != S_OK )
-        fgWarning ( "%s", "QI-ing IO plugin to HID Device interface failed");
+    if( pluginResult != S_OK )
+        fgWarning ( "%s", "QI-ing IO plugin to HID Device interface failed" );
 
-    (*plugin)->Release(plugin); /* don't leak a ref */
-    if (joy->hidDev == NULL) return;
+    ( *plugin )->Release( plugin ); /* don't leak a ref */
+    if( joy->hidDev == NULL )
+        return;
 
     /* store the interface in this instance */
-    rv = (*(joy->hidDev))->open(joy->hidDev, 0);
-    if (rv != kIOReturnSuccess) {
-        fgWarning ( "%s", "error opening device interface");
+    rv = ( *( joy->hidDev ) )->open( joy->hidDev, 0 );
+    if( rv != kIOReturnSuccess )
+    {
+        fgWarning( "error opening device interface");
         return;
     }
 
-    props = getCFProperties(ioDevices[joy->id]);
+    props = getCFProperties( ioDevices[ joy->id ] );
 
     /* recursively enumerate all the bits */
     CFTypeRef topLevelElement = 
-                      CFDictionaryGetValue ( props, CFSTR ( kIOHIDElementKey ) );
-    enumerateElements ( topLevelElement );
+        CFDictionaryGetValue( props, CFSTR( kIOHIDElementKey ) );
+    enumerateElements( topLevelElement );
 
-    CFRelease ( props );
+    CFRelease( props );
 #endif
 
 #if TARGET_HOST_WIN32
@@ -1293,7 +1306,7 @@ static void fghJoystickOpen( SFG_Joystick* joy )
         ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) !=
           JOYERR_NOERROR );
 
-    if ( joy->jsCaps.wNumAxes == 0 )
+    if( joy->jsCaps.wNumAxes == 0 )
     {
         joy->num_axes = 0;
         joy->error = GL_TRUE;
@@ -1303,36 +1316,37 @@ static void fghJoystickOpen( SFG_Joystick* joy )
         /* Device name from jsCaps is often "Microsoft PC-joystick driver",
          * at least for USB.  Try to get the real name from the registry.
          */
-        if ( ! fghJoystickGetOEMProductName ( joy, joy->name, sizeof(joy->name) ) )
+        if ( ! fghJoystickGetOEMProductName( joy, joy->name,
+                                             sizeof( joy->name ) ) )
         {
-            fgWarning ( "%s", "JS: Failed to read joystick name from registry" );
-            strncpy ( joy->name, joy->jsCaps.szPname, sizeof(joy->name) );
+            fgWarning( "JS: Failed to read joystick name from registry" );
+            strncpy( joy->name, joy->jsCaps.szPname, sizeof( joy->name ) );
         }
 
         /* Windows joystick drivers may provide any combination of
          * X,Y,Z,R,U,V,POV - not necessarily the first n of these.
          */
-        if ( joy->jsCaps.wCaps & JOYCAPS_HASPOV )
+        if( joy->jsCaps.wCaps & JOYCAPS_HASPOV )
         {
             joy->num_axes = _JS_MAX_AXES;
-            joy->min [ 7 ] = -1.0; joy->max [ 7 ] = 1.0;  /* POV Y */
-            joy->min [ 6 ] = -1.0; joy->max [ 6 ] = 1.0;  /* POV X */
+            joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0;  /* POV Y */
+            joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0;  /* POV X */
         }
         else
             joy->num_axes = 6;
 
-        joy->min[ 5 ] = (float) joy->jsCaps.wVmin;
-        joy->max[ 5 ] = (float) joy->jsCaps.wVmax;
-        joy->min[ 4 ] = (float) joy->jsCaps.wUmin;
-        joy->max[ 4 ] = (float) joy->jsCaps.wUmax;
-        joy->min[ 3 ] = (float) joy->jsCaps.wRmin;
-        joy->max[ 3 ] = (float) joy->jsCaps.wRmax;
-        joy->min[ 2 ] = (float) joy->jsCaps.wZmin;
-        joy->max[ 2 ] = (float) joy->jsCaps.wZmax;
-        joy->min[ 1 ] = (float) joy->jsCaps.wYmin;
-        joy->max[ 1 ] = (float) joy->jsCaps.wYmax;
-        joy->min[ 0 ] = (float) joy->jsCaps.wXmin;
-        joy->max[ 0 ] = (float) joy->jsCaps.wXmax;
+        joy->min[ 5 ] = ( float )joy->jsCaps.wVmin;
+        joy->max[ 5 ] = ( float )joy->jsCaps.wVmax;
+        joy->min[ 4 ] = ( float )joy->jsCaps.wUmin;
+        joy->max[ 4 ] = ( float )joy->jsCaps.wUmax;
+        joy->min[ 3 ] = ( float )joy->jsCaps.wRmin;
+        joy->max[ 3 ] = ( float )joy->jsCaps.wRmax;
+        joy->min[ 2 ] = ( float )joy->jsCaps.wZmin;
+        joy->max[ 2 ] = ( float )joy->jsCaps.wZmax;
+        joy->min[ 1 ] = ( float )joy->jsCaps.wYmin;
+        joy->max[ 1 ] = ( float )joy->jsCaps.wYmax;
+        joy->min[ 0 ] = ( float )joy->jsCaps.wXmin;
+        joy->max[ 0 ] = ( float )joy->jsCaps.wXmax;
     }
 
     /*
@@ -1340,67 +1354,67 @@ static void fghJoystickOpen( SFG_Joystick* joy )
      */
     for( i = 0; i < joy->num_axes; i++ )
     {
-        joy->center   [ i ] = (joy->max[i] + joy->min[i]) * 0.5f;
+        joy->center   [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f;
         joy->dead_band[ i ] = 0.0f;
         joy->saturate [ i ] = 1.0f;
     }
 #endif
 
 #if TARGET_HOST_UNIX_X11
-#if defined(__FreeBSD__) || defined(__NetBSD__)
-    for ( i = 0; i < _JS_MAX_AXES; i++ )
-        joy->os->cache_axes [ i ] = 0.0f;
+#if defined( __FreeBSD__ ) || defined( __NetBSD__ )
+    for( i = 0; i < _JS_MAX_AXES; i++ )
+        joy->os->cache_axes[ i ] = 0.0f;
 
     joy->os->cache_buttons = 0;
 
-    joy->os->fd = open ( joy->os->fname, O_RDONLY | O_NONBLOCK);
+    joy->os->fd = open( joy->os->fname, O_RDONLY | O_NONBLOCK);
 
-    if ( joy->os->fd < 0 && errno == EACCES)
-      fgWarning ( "%s exists but is not readable by you\n", joy->os->fname );
+    if( joy->os->fd < 0 && errno == EACCES )
+        fgWarning ( "%s exists but is not readable by you\n", joy->os->fname );
 
-    joy->error = ( joy->os->fd < 0 );
+    joy->error =( joy->os->fd < 0 );
 
-    if ( joy->error )
-      return;
+    if( joy->error )
+        return;
 
     joy->num_axes = 0;
     joy->num_buttons = 0;
-    if ( joy->os->is_analog )
+    if( joy->os->is_analog )
     {
         FILE *joyfile;
-        char joyfname [ 1024 ];
+        char joyfname[ 1024 ];
         int noargs, in_no_axes;
 
-        float axes  [ _JS_MAX_AXES ];
-        int buttons [ _JS_MAX_AXES ];
+        float axes [ _JS_MAX_AXES ];
+        int buttons[ _JS_MAX_AXES ];
 
         joy->num_axes    =  2;
         joy->num_buttons = 32;
 
-        fghJoystickRawRead ( joy, buttons, axes );
-        joy->error = axes[0] < -1000000000.0f;
-        if ( joy->error )
-          return;
+        fghJoystickRawRead( joy, buttons, axes );
+        joy->error = axes[ 0 ] < -1000000000.0f;
+        if( joy->error )
+            return;
 
-        sprintf( joyfname, "%s/.joy%drc", getenv ( "HOME" ), joy->id );
+        sprintf( joyfname, "%s/.joy%drc", getenv( "HOME" ), joy->id );
 
-        joyfile = fopen ( joyfname, "r" );
-        joy->error = ( joyfile == NULL );
-        if ( joy->error )
-          return;
+        joyfile = fopen( joyfname, "r" );
+        joy->error =( joyfile == NULL );
+        if( joy->error )
+            return;
 
-        noargs = fscanf ( joyfile, "%d%f%f%f%f%f%f", &in_no_axes,
-                          &joy->min [ 0 ], &joy->center [ 0 ], &joy->max [ 0 ],
-                          &joy->min [ 1 ], &joy->center [ 1 ], &joy->max [ 1 ] );
+        noargs = fscanf( joyfile, "%d%f%f%f%f%f%f", &in_no_axes,
+                         &joy->min[ 0 ], &joy->center[ 0 ], &joy->max[ 0 ],
+                         &joy->min[ 1 ], &joy->center[ 1 ], &joy->max[ 1 ] );
         joy->error = noargs != 7 || in_no_axes != _JS_MAX_AXES;
-        fclose ( joyfile );
-        if ( joy->error )
-          return;
+        fclose( joyfile );
+        if( joy->error )
+            return;
 
-        for ( i = 0; i < _JS_MAX_AXES; i++ )
+        for( i = 0; i < _JS_MAX_AXES; i++ )
         {
-            joy->dead_band [ i ] = 0.0f;
-            joy->saturate  [ i ] = 1.0f;
+            joy->dead_band[ i ] = 0.0f;
+            joy->saturate [ i ] = 1.0f;
         }
 
         return;    /* End of analog code */
@@ -1410,46 +1424,48 @@ static void fghJoystickOpen( SFG_Joystick* joy )
     if( ! fghJoystickInitializeHID( joy->os, &joy->num_axes,
                                     &joy->num_buttons ) )
     {
-        close ( joy->os->fd );
+        close( joy->os->fd );
         joy->error = GL_TRUE;
         return;
     }
 
-    cp = strrchr(joy->os->fname, '/');
-    if ( cp ) {
-        if ( fghJoystickFindUSBdev ( &cp[1], joy->name, sizeof(joy->name) ) == 0 )
-            strcpy ( joy->name, &cp[1] );
+    cp = strrchr( joy->os->fname, '/' );
+    if( cp )
+    {
+        if( fghJoystickFindUSBdev( &cp[1], joy->name, sizeof( joy->name ) ) ==
+            0 )
+            strcpy( joy->name, &cp[1] );
     }
 
-    if ( joy->num_axes > _JS_MAX_AXES )
+    if( joy->num_axes > _JS_MAX_AXES )
         joy->num_axes = _JS_MAX_AXES;
 
-    for ( i = 0; i < _JS_MAX_AXES; i++ )
+    for( i = 0; i < _JS_MAX_AXES; i++ )
     {
         /* We really should get this from the HID, but that data seems
          * to be quite unreliable for analog-to-USB converters. Punt for
          * now.
          */
-        if ( joy->os->axes_usage [ i ] == HUG_HAT_SWITCH )
+        if( joy->os->axes_usage[ i ] == HUG_HAT_SWITCH )
         {
-            joy->max       [ i ] = 1.0f;
-            joy->center    [ i ] = 0.0f;
-            joy->min       [ i ] = -1.0f;
+            joy->max   [ i ] = 1.0f;
+            joy->center[ i ] = 0.0f;
+            joy->min   [ i ] = -1.0f;
         }
         else
         {
-            joy->max       [ i ] = 255.0f;
-            joy->center    [ i ] = 127.0f;
-            joy->min       [ i ] = 0.0f;
+            joy->max   [ i ] = 255.0f;
+            joy->center[ i ] = 127.0f;
+            joy->min   [ i ] = 0.0f;
         }
 
-        joy->dead_band [ i ] = 0.0f;
-        joy->saturate  [ i ] = 1.0f;
+        joy->dead_band[ i ] = 0.0f;
+        joy->saturate[ i ] = 1.0f;
     }
 #    endif
 #endif
 
-#if defined(__linux__)
+#if defined( __linux__ )
     /*
      * Default for older Linux systems.
      */
@@ -1465,9 +1481,9 @@ static void fghJoystickOpen( SFG_Joystick* joy )
 
     joy->fd = open( joy->fname, O_RDONLY );
 
-    joy->error = (joy->fd < 0);
+    joy->error =( joy->fd < 0 );
 
-    if ( joy->error )
+    if( joy->error )
         return;
 
     /*
@@ -1478,12 +1494,12 @@ static void fghJoystickOpen( SFG_Joystick* joy )
      *  to the upper byte of an uninitialized word doesn't work. 
      *  9 April 2003 
      */
-    ioctl ( joy->fd, JSIOCGAXES   , &u ); 
+    ioctl( joy->fd, JSIOCGAXES, &u ); 
     joy->num_axes = u;
-    ioctl ( joy->fd, JSIOCGBUTTONS, &u );
+    ioctl( joy->fd, JSIOCGBUTTONS, &u );
     joy->num_buttons = u;
-    ioctl ( joy->fd, JSIOCGNAME ( sizeof(joy->name) ), joy->name );
-    fcntl ( joy->fd, F_SETFL      , O_NONBLOCK   );
+    ioctl( joy->fd, JSIOCGNAME( sizeof( joy->name ) ), joy->name );
+    fcntl( joy->fd, F_SETFL, O_NONBLOCK );
 #    endif
 
     /*
@@ -1510,7 +1526,7 @@ static void fghJoystickOpen( SFG_Joystick* joy )
         joy->error = GL_TRUE;
 #    endif
 
-    for ( i = 0; i < _JS_MAX_AXES; i++ )
+    for( i = 0; i < _JS_MAX_AXES; i++ )
     {
 #    ifdef JS_NEW
         joy->max   [ i ] =  32767.0f;
@@ -1532,57 +1548,65 @@ static void fghJoystickOpen( SFG_Joystick* joy )
  */
 void fgJoystickInit( int ident )
 {
-    if ( ident >= MAX_NUM_JOYSTICKS )
+    if( ident >= MAX_NUM_JOYSTICKS )
       fgError( "Too large a joystick number" );
 
-    if( fgJoystick[ident] )
+    if( fgJoystick[ ident ] )
         fgError( "illegal attempt to initialize joystick device" );
 
-    fgJoystick[ident] = ( SFG_Joystick * )calloc( sizeof( SFG_Joystick ), 1 );
+    fgJoystick[ ident ] =
+        ( SFG_Joystick * )calloc( sizeof( SFG_Joystick ), 1 );
 
     /* Set defaults */
-    fgJoystick[ident]->num_axes = fgJoystick[ident]->num_buttons = 0;
-    fgJoystick[ident]->error = GL_TRUE;
+    fgJoystick[ ident ]->num_axes = fgJoystick[ ident ]->num_buttons = 0;
+    fgJoystick[ ident ]->error = GL_TRUE;
 
 #if TARGET_HOST_MACINTOSH
-    fgJoystick[ident]->id = ident;
-    sprintf ( fgJoystick[ident]->fname, "/dev/js%d", ident ); /* FIXME */
-    fgJoystick[ident]->error = GL_FALSE;
+    fgJoystick[ ident ]->id = ident;
+    sprintf( fgJoystick[ ident ]->fname, "/dev/js%d", ident ); /* FIXME */
+    fgJoystick[ ident ]->error = GL_FALSE;
 #endif
 
 #if TARGET_HOST_MAC_OSX
-    fgJoystick[ident]->id = ident;
-    fgJoystick[ident]->error = GL_FALSE;
-    fgJoystick[ident]->num_axes = 0;
-    fgJoystick[ident]->num_buttons = 0;
+    fgJoystick[ ident ]->id = ident;
+    fgJoystick[ ident ]->error = GL_FALSE;
+    fgJoystick[ ident ]->num_axes = 0;
+    fgJoystick[ ident ]->num_buttons = 0;
 
-    if (numDevices < 0) {
+    if( numDevices < 0 )
+    {
         /* do first-time init (since we can't over-ride jsInit, hmm */
         numDevices = 0;
 
         mach_port_t masterPort;
-        IOReturn rv = IOMasterPort ( bootstrap_port, &masterPort );
-        if ( rv != kIOReturnSuccess ) {
-            fgWarning ( "%s", "error getting master Mach port");
+        IOReturn rv = IOMasterPort( bootstrap_port, &masterPort );
+        if( rv != kIOReturnSuccess )
+        {
+            fgWarning( "%s", "error getting master Mach port" );
             return;
         }
-        fghJoystickFindDevices ( masterPort );
+        fghJoystickFindDevices( masterPort );
     }
 
-    if ( ident >= numDevices ) {
-        fgJoystick[ident]->error = GL_TRUE;
+    if ( ident >= numDevices )
+    {
+        fgJoystick[ ident ]->error = GL_TRUE;
         return;
     }
 
     /* get the name now too */
-    CFDictionaryRef properties = getCFProperties(ioDevices[ident]);
-    CFTypeRef ref = CFDictionaryGetValue (properties, CFSTR(kIOHIDProductKey));
+    CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] );
+    CFTypeRef ref = CFDictionaryGetValue( properties,
+                                          CFSTR( kIOHIDProductKey ) );
     if (!ref)
-      ref = CFDictionaryGetValue (properties, CFSTR("USB Product Name"));
+        ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) );
 
-    if (!ref || !CFStringGetCString ((CFStringRef) ref, name, 128, CFStringGetSystemEncoding ())) {
-      fgWarning( "%s", "error getting device name" );
-      name[0] = '\0';
+    if( !ref ||
+        !CFStringGetCString( ( CFStringRef )ref, name, 128,
+                             CFStringGetSystemEncoding( ) ) )
+    {
+        fgWarning( "%s", "error getting device name" );
+        name[ 0 ] = '\0';
     }
 #endif
 
@@ -1590,45 +1614,46 @@ void fgJoystickInit( int ident )
     switch( ident )
     {
     case 0:
-        fgJoystick[ident]->js_id = JOYSTICKID1;
-        fgJoystick[ident]->error = GL_FALSE;
+        fgJoystick[ ident ]->js_id = JOYSTICKID1;
+        fgJoystick[ ident ]->error = GL_FALSE;
         break;
     case 1:
-        fgJoystick[ident]->js_id = JOYSTICKID2;
-        fgJoystick[ident]->error = GL_FALSE;
+        fgJoystick[ ident ]->js_id = JOYSTICKID2;
+        fgJoystick[ ident ]->error = GL_FALSE;
         break;
     default:
-        fgJoystick[ident]->num_axes = 0;
-        fgJoystick[ident]->error = GL_TRUE;
+        fgJoystick[ ident ]->num_axes = 0;
+        fgJoystick[ ident ]->error = GL_TRUE;
         return;
     }
 #endif
 
 #if TARGET_HOST_UNIX_X11
-#    if defined(__FreeBSD__) || defined(__NetBSD__)
-    fgJoystick[ident]->id = ident;
-    fgJoystick[ident]->error = GL_FALSE;
-
-    fgJoystick[ident]->os = calloc (1, sizeof (struct os_specific_s));
-    memset ( fgJoystick[ident]->os, 0, sizeof(struct os_specific_s) );
-    if (ident < USB_IDENT_OFFSET)
-        fgJoystick[ident]->os->is_analog = 1;
-    if (fgJoystick[ident]->os->is_analog)
-        sprintf ( fgJoystick[ident]->os->fname, "%s%d", AJSDEV, ident );
+#    if defined( __FreeBSD__ ) || defined( __NetBSD__ )
+    fgJoystick[ ident ]->id = ident;
+    fgJoystick[ ident ]->error = GL_FALSE;
+
+    fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) );
+    memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) );
+    if( ident < USB_IDENT_OFFSET )
+        fgJoystick[ ident ]->os->is_analog = 1;
+    if( fgJoystick[ ident ]->os->is_analog )
+        sprintf( fgJoystick[ ident ]->os->fname, "%s%d", AJSDEV, ident );
     else
-        sprintf ( fgJoystick[ident]->os->fname, "%s%d", UHIDDEV, ident - USB_IDENT_OFFSET );
-#    elif defined(__linux__)
-    fgJoystick[ident]->id = ident;
-    fgJoystick[ident]->error = GL_FALSE;
+        sprintf( fgJoystick[ ident ]->os->fname, "%s%d", UHIDDEV,
+                 ident - USB_IDENT_OFFSET );
+#    elif defined( __linux__ )
+    fgJoystick[ ident ]->id = ident;
+    fgJoystick[ ident ]->error = GL_FALSE;
 
-    sprintf ( fgJoystick[ident]->fname, "/dev/input/js%d", ident );
+    sprintf( fgJoystick[ident]->fname, "/dev/input/js%d", ident );
 
-    if ( access ( fgJoystick[ident]->fname, F_OK ) != 0 )
-        sprintf ( fgJoystick[ident]->fname, "/dev/js%d", ident );
+    if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 )
+        sprintf( fgJoystick[ ident ]->fname, "/dev/js%d", ident );
 #    endif
 #endif
 
-    fghJoystickOpen ( fgJoystick[ident] );
+    fghJoystickOpen( fgJoystick[ ident  ] );
 }
 
 /*
@@ -1637,19 +1662,20 @@ void fgJoystickInit( int ident )
 void fgJoystickClose( void )
 {
     int ident ;
-    for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
+    for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
     {
-        if ( fgJoystick[ident] )
+        if( fgJoystick[ ident ] )
         {
 
 #if TARGET_HOST_MACINTOSH
-            ISpSuspend  ();
-            ISpStop     ();
-            ISpShutdown ();
+            ISpSuspend( );
+            ISpStop( );
+            ISpShutdown( );
 #endif
 
 #if TARGET_HOST_MAC_OSX
-            (*(fgJoystick[ident]->hidDev))->close(fgJoystick[ident]->hidDev);
+            ( *( fgJoystick[ ident ]->hidDev ) )->
+                close( fgJoystick[ ident ]->hidDev );
 #endif
 
 #if TARGET_HOST_WIN32
@@ -1657,27 +1683,28 @@ void fgJoystickClose( void )
 #endif
 
 #if TARGET_HOST_UNIX_X11
-#if defined(__FreeBSD__) || defined(__NetBSD__)
-            if ( fgJoystick[ident]->os )
+#if defined( __FreeBSD__ ) || defined( __NetBSD__ )
+            if( fgJoystick[ident]->os )
             {
-                if ( ! fgJoystick[ident]->error )
-                    close ( fgJoystick[ident]->os->fd );
+                if( ! fgJoystick[ ident ]->error )
+                    close( fgJoystick[ ident ]->os->fd );
 #ifdef HAVE_USB_JS
-                if ( fgJoystick[ident]->os->hids )
-                    free (fgJoystick[ident]->os->hids);
-                if ( fgJoystick[ident]->os->hid_data_buf )
-                    free (fgJoystick[ident]->os->hid_data_buf);
+                if( fgJoystick[ ident ]->os->hids )
+                    free (fgJoystick[ ident ]->os->hids);
+                if( fgJoystick[ ident ]->os->hid_data_buf )
+                    free( fgJoystick[ ident ]->os->hid_data_buf );
 #endif
-                free (fgJoystick[ident]->os);
+                free( fgJoystick[ident]->os );
             }
 #endif
 
             if( ! fgJoystick[ident]->error )
-                close( fgJoystick[ident]->fd );
+                close( fgJoystick[ ident ]->fd );
 #endif
 
-            free( fgJoystick[ident] );
-            fgJoystick[ident] = NULL;  /* show joystick has been deinitialized */
+            free( fgJoystick[ ident ] );
+            fgJoystick[ ident ] = NULL;
+            /* show joystick has been deinitialized */
         }
     }
 }
@@ -1695,19 +1722,19 @@ void fgJoystickPollWindow( SFG_Window* window )
     freeglut_return_if_fail( window );
     freeglut_return_if_fail( FETCH_WCB( *window, Joystick ) );
 
-    for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
+    for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
     {
-        if ( fgJoystick[ident] )
+        if( fgJoystick[ident] )
         {
             fghJoystickRead( fgJoystick[ident], &buttons, axes );
 
-            if ( !fgJoystick[ident]->error )
+            if( !fgJoystick[ident]->error )
                 INVOKE_WCB( *window, Joystick,
                             ( buttons,
-                              (int) (axes[ 0 ] * 1000.0f ),
-                              (int) (axes[ 1 ] * 1000.0f ),
-                              (int) (axes[ 2 ] * 1000.0f ) )
-                          );
+                              (int) ( axes[ 0 ] * 1000.0f ),
+                              (int) ( axes[ 1 ] * 1000.0f ),
+                              (int) ( axes[ 2 ] * 1000.0f ) )
+                );
         }
     }
 }
@@ -1716,33 +1743,63 @@ void fgJoystickPollWindow( SFG_Window* window )
  * PWO: These jsJoystick class methods have not been implemented.
  *      We might consider adding such functions to freeglut-2.0.
  */
-int  glutJoystickGetNumAxes ( int ident )
-    { return fgJoystick[ident]->num_axes; }
-int  glutJoystickNotWorking ( int ident )
-    { return fgJoystick[ident]->error; }
-
-float glutJoystickGetDeadBand ( int ident, int axis )
-    { return fgJoystick[ident]->dead_band [ axis ]; }
-void  glutJoystickSetDeadBand ( int ident, int axis, float db )
-    { fgJoystick[ident]->dead_band [ axis ] = db; }
-
-float glutJoystickGetSaturation ( int ident, int axis )
-    { return fgJoystick[ident]->saturate [ axis ]; }
-void  glutJoystickSetSaturation ( int ident, int axis, float st )
-    { fgJoystick[ident]->saturate [ axis ] = st; }
-
-void glutJoystickSetMinRange ( int ident, float *axes )
-    { memcpy ( fgJoystick[ident]->min   , axes, fgJoystick[ident]->num_axes * sizeof(float) ); }
-void glutJoystickSetMaxRange ( int ident, float *axes )
-    { memcpy ( fgJoystick[ident]->max   , axes, fgJoystick[ident]->num_axes * sizeof(float) ); }
-void glutJoystickSetCenter   ( int ident, float *axes )
-    { memcpy ( fgJoystick[ident]->center, axes, fgJoystick[ident]->num_axes * sizeof(float) ); }
-
-void glutJoystickGetMinRange ( int ident, float *axes )
-    { memcpy ( axes, fgJoystick[ident]->min   , fgJoystick[ident]->num_axes * sizeof(float) ); }
-void glutJoystickGetMaxRange ( int ident, float *axes )
-    { memcpy ( axes, fgJoystick[ident]->max   , fgJoystick[ident]->num_axes * sizeof(float) ); }
-void glutJoystickGetCenter   ( int ident, float *axes )
-    { memcpy ( axes, fgJoystick[ident]->center, fgJoystick[ident]->num_axes * sizeof(float) ); }
+int  glutJoystickGetNumAxes( int ident )
+{
+    return fgJoystick[ ident ]->num_axes;
+}
+int  glutJoystickNotWorking( int ident )
+{
+    return fgJoystick[ ident ]->error;
+}
+
+float glutJoystickGetDeadBand( int ident, int axis )
+{
+    return fgJoystick[ ident ]->dead_band [ axis ];
+}
+void  glutJoystickSetDeadBand( int ident, int axis, float db )
+{
+    fgJoystick[ ident ]->dead_band[ axis ] = db;
+}
+
+float glutJoystickGetSaturation( int ident, int axis )
+{
+    return fgJoystick[ ident ]->saturate[ axis ];
+}
+void  glutJoystickSetSaturation( int ident, int axis, float st )
+{
+    fgJoystick[ ident ]->saturate [ axis ] = st;
+}
+
+void glutJoystickSetMinRange( int ident, float *axes )
+{
+    memcpy( fgJoystick[ ident ]->min, axes,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+void glutJoystickSetMaxRange( int ident, float *axes )
+{
+    memcpy( fgJoystick[ ident ]->max, axes,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+void glutJoystickSetCenter( int ident, float *axes )
+{
+    memcpy( fgJoystick[ ident ]->center, axes,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+
+void glutJoystickGetMinRange( int ident, float *axes )
+{
+    memcpy( axes, fgJoystick[ ident ]->min,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+void glutJoystickGetMaxRange( int ident, float *axes )
+{
+    memcpy( axes, fgJoystick[ ident ]->max,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+void glutJoystickGetCenter( int ident, float *axes )
+{
+    memcpy( axes, fgJoystick[ ident ]->center,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
 
 /*** END OF FILE ***/