Splitting out the platform-specific code from "fghJoystickInit"

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1020 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
fayjf 2012-01-29 04:01:24 +00:00
parent 3f41b865c4
commit 266e1b8bb9
2 changed files with 103 additions and 91 deletions

View File

@ -388,6 +388,7 @@ static void fghJoystickAddHatElement ( SFG_Joystick* joy, CFDictionaryRef hat );
/* External function declarations (mostly platform-specific) */
extern void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident );
extern void fgPlatformJoystickClose ( int ident );
/*
@ -401,6 +402,14 @@ static SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ];
*/
#if TARGET_HOST_MACINTOSH
void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )
{
fgJoystick[ ident ]->id = ident;
snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */
fgJoystick[ ident ]->error = GL_FALSE;
}
void fgPlatformJoystickClose ( int ident )
{
ISpSuspend( );
@ -410,6 +419,51 @@ void fgPlatformJoystickClose ( int ident )
#endif
#if TARGET_HOST_MAC_OSX
void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )
{
fgJoystick[ ident ]->id = ident;
fgJoystick[ ident ]->error = GL_FALSE;
fgJoystick[ ident ]->num_axes = 0;
fgJoystick[ ident ]->num_buttons = 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( "error getting master Mach port" );
return;
}
fghJoystickFindDevices( masterPort );
}
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 ) );
if (!ref)
ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) );
if( !ref ||
!CFStringGetCString( ( CFStringRef )ref, name, 128,
CFStringGetSystemEncoding( ) ) )
{
fgWarning( "error getting device name" );
name[ 0 ] = '\0';
}
}
void fgPlatformJoystickClose ( int ident )
{
( *( fgJoystick[ ident ]->hidDev ) )->
@ -418,6 +472,33 @@ void fgPlatformJoystickClose ( int ident )
#endif
#if TARGET_HOST_POSIX_X11
void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )
{
#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || 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 )
snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident );
else
snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", UHIDDEV,
ident - USB_IDENT_OFFSET );
#elif defined( __linux__ )
fgJoystick[ ident ]->id = ident;
fgJoystick[ ident ]->error = GL_FALSE;
snprintf( fgJoystick[ident]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident );
if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 )
snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident );
#endif
}
void fgPlatformJoystickClose ( int ident )
{
#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
@ -1486,97 +1567,7 @@ static void fghJoystickInit( int ident )
fgJoystick[ ident ]->num_axes = fgJoystick[ ident ]->num_buttons = 0;
fgJoystick[ ident ]->error = GL_TRUE;
#if TARGET_HOST_MACINTOSH
fgJoystick[ ident ]->id = ident;
snprintf( fgJoystick[ ident ]->fname, sizeof(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;
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( "error getting master Mach port" );
return;
}
fghJoystickFindDevices( masterPort );
}
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 ) );
if (!ref)
ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) );
if( !ref ||
!CFStringGetCString( ( CFStringRef )ref, name, 128,
CFStringGetSystemEncoding( ) ) )
{
fgWarning( "error getting device name" );
name[ 0 ] = '\0';
}
#endif
#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
switch( ident )
{
case 0:
fgJoystick[ ident ]->js_id = JOYSTICKID1;
fgJoystick[ ident ]->error = GL_FALSE;
break;
case 1:
fgJoystick[ ident ]->js_id = JOYSTICKID2;
fgJoystick[ ident ]->error = GL_FALSE;
break;
default:
fgJoystick[ ident ]->num_axes = 0;
fgJoystick[ ident ]->error = GL_TRUE;
return;
}
#endif
#if TARGET_HOST_POSIX_X11
# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || 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 )
snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident );
else
snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", UHIDDEV,
ident - USB_IDENT_OFFSET );
# elif defined( __linux__ )
fgJoystick[ ident ]->id = ident;
fgJoystick[ ident ]->error = GL_FALSE;
snprintf( fgJoystick[ident]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident );
if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 )
snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident );
# endif
#endif
fgPlatformJoystickInit( fgJoystick, ident );
fghJoystickOpen( fgJoystick[ ident ] );
}

View File

@ -30,6 +30,27 @@
#if !defined(_WIN32_WCE)
void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )
{
switch( ident )
{
case 0:
fgJoystick[ ident ]->js_id = JOYSTICKID1;
fgJoystick[ ident ]->error = GL_FALSE;
break;
case 1:
fgJoystick[ ident ]->js_id = JOYSTICKID2;
fgJoystick[ ident ]->error = GL_FALSE;
break;
default:
fgJoystick[ ident ]->num_axes = 0;
fgJoystick[ ident ]->error = GL_TRUE;
return;
}
}
void fgPlatformJoystickClose ( int ident )
{
/* Do nothing special */