* Many thanks for Steve Baker for permission to pull from that library.
*/
-#if defined( __FreeBSD__ ) || defined( __NetBSD__ )
-# include <sys/param.h>
-#endif
-
#include <GL/freeglut.h>
#include "freeglut_internal.h"
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
/*
* Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c"
* interspersed
*/
-#define _JS_MAX_BUTTONS 32
+/* XXX It might be better to poll the operating system for the numbers of buttons and
+ * XXX axes and then dynamically allocate the arrays.
+ */
+#define _JS_MAX_BUTTONS 32
#if TARGET_HOST_MACINTOSH
# define _JS_MAX_AXES 9
# define _JS_MAX_AXES 8
# include <windows.h>
# include <mmsystem.h>
-# include <string.h>
# include <regstr.h>
#endif
#if TARGET_HOST_UNIX_X11
# define _JS_MAX_AXES 16
+# if HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+# endif
+# if HAVE_FCNTL_H
+# include <fcntl.h>
+# endif
+# include <errno.h>
# if defined(__FreeBSD__) || defined(__NetBSD__)
/* XXX The below hack is done until freeglut's autoconf is updated. */
# define HAVE_USB_JS 1
-# include <sys/ioctl.h>
-# if defined(__FreeBSD__) && __FreeBSD_version >= 500000
+# if defined(__FreeBSD__)
# include <sys/joystick.h>
# else
/*
# define JS_RETURN (sizeof(struct JS_DATA_TYPE))
# endif
-# include <fcntl.h>
-# include <errno.h>
-
# if defined(__linux__)
-# include <sys/ioctl.h>
# include <linux/joystick.h>
/* check the joystick driver version */
static void fghJoystickEnumerateElements ( SFG_Joystick* joy, CFTypeRef element );
/* callback for CFArrayApply */
static void fghJoystickElementEnumerator ( SFG_Joystick* joy, void *element, void* vjs );
-static void fghJoystickParseElement ( SFG_Joystick* joy, CFDictionaryRef element );
static void fghJoystickAddAxisElement ( SFG_Joystick* joy, CFDictionaryRef axis );
static void fghJoystickAddButtonElement ( SFG_Joystick* joy, CFDictionaryRef button );
if (usage > 0 && usage < _JS_MAX_BUTTONS + 1)
{
if (d)
- joy->os->cache_buttons |= (1 << usage - 1);
+ joy->os->cache_buttons |= (1 << ( usage - 1 ));
else
- joy->os->cache_buttons &= ~(1 << usage - 1);
+ joy->os->cache_buttons &= ~(1 << ( usage - 1 ));
}
}
}
&fghJoystickElementEnumerator, joy );
}
-static void fghJoystickParseElement ( SFG_Joystick *joy, CFDictionaryRef element )
-{
- CFTypeRef refPage = CFDictionaryGetValue ((CFDictionaryRef) element, CFSTR(kIOHIDElementUsagePageKey));
- CFTypeRef refUsage = CFDictionaryGetValue ((CFDictionaryRef) element, CFSTR(kIOHIDElementUsageKey));
-
- long type, page, usage;
-
- CFNumberGetValue((CFNumberRef)
- CFDictionaryGetValue ((CFDictionaryRef) element, CFSTR(kIOHIDElementTypeKey)),
- kCFNumberLongType, &type);
-
- switch ( type ) {
- case kIOHIDElementTypeInput_Misc:
- case kIOHIDElementTypeInput_Axis:
- case kIOHIDElementTypeInput_Button:
- printf("got input element...");
- CFNumberGetValue( (CFNumberRef) refUsage, kCFNumberLongType, &usage );
- CFNumberGetValue( (CFNumberRef) refPage, kCFNumberLongType, &page );
-
- if (page == kHIDPage_GenericDesktop) {
- switch ( usage ) /* look at usage to determine function */
- {
- case kHIDUsage_GD_X:
- case kHIDUsage_GD_Y:
- case kHIDUsage_GD_Z:
- case kHIDUsage_GD_Rx:
- case kHIDUsage_GD_Ry:
- case kHIDUsage_GD_Rz:
- case kHIDUsage_GD_Slider: /* for throttle / trim controls */
- printf(" axis\n");
- fghJoystickAddAxisElement((CFDictionaryRef) element);
- break;
-
- case kHIDUsage_GD_Hatswitch:
- printf(" hat\n");
- fghJoystickAddHatElement((CFDictionaryRef) element);
- break;
-
- default:
- fgWarning ( "input type element has weird usage (%x)", usage);
- break;
- }
- } else if (page == kHIDPage_Button) {
- printf(" button\n");
- fghJoystickAddButtonElement((CFDictionaryRef) element);
- } else
- fgWarning ( "input type element has weird page (%x)", page);
- break;
-
- case kIOHIDElementTypeCollection:
- fghJoystickEnumerateElements (
- CFDictionaryGetValue ( element, CFSTR(kIOHIDElementKey) )
- );
- break;
-
- default:
- break;
- }
-}
-
static void fghJoystickAddAxisElement ( SFG_Joystick *joy, CFDictionaryRef axis )
{
long cookie, lmin, lmax;
# ifdef JS_NEW
unsigned char u;
# else
- int counter;
+# if defined( __linux__ )
+ int counter;
+# endif
# endif
#endif
+ /* Silence gcc, the correct #ifdefs would be too fragile... */
+ (void)i;
+
/*
* Default values (for no joystick -- each conditional will reset the
* error flag)
*/
void fgInitialiseJoysticks ( void )
{
- /* Initialization courtesy of OpenGLUT -- do we want it? */
- if( !fgState.JoysticksInitialised )
- {
- int ident ;
- for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
- fghJoystickInit( ident );
+ if( !fgState.JoysticksInitialised )
+ {
+ int ident ;
+ for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
+ fghJoystickInit( ident );
- fgState.JoysticksInitialised = GL_TRUE;
- }
+ fgState.JoysticksInitialised = GL_TRUE;
+ }
}
/*
*/
int fgJoystickDetect( void )
{
- int ident;
+ int ident;
- fgInitialiseJoysticks ();
+ fgInitialiseJoysticks ();
- if ( !fgJoystick )
- return 0;
+ if ( !fgJoystick )
+ return 0;
- if ( !fgState.JoysticksInitialised )
- return 0;
+ if ( !fgState.JoysticksInitialised )
+ return 0;
- for( ident=0; ident<MAX_NUM_JOYSTICKS; ident++ )
- if( fgJoystick[ident] && !fgJoystick[ident]->error )
- return 1;
+ for( ident=0; ident<MAX_NUM_JOYSTICKS; ident++ )
+ if( fgJoystick[ident] && !fgJoystick[ident]->error )
+ return 1;
- return 0;
+ return 0;
}
/*