aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoricculus <icculus@edf5b092-35ff-0310-97b2-ce42778d08ea>2005-08-31 21:13:02 +0000
committericculus <icculus@edf5b092-35ff-0310-97b2-ce42778d08ea>2005-08-31 21:13:02 +0000
commit1c5502a5f7e7437ce02f3d3bd5bab4e543e576f3 (patch)
tree5a44f73a67ad5688be52ff3592bec9a61018e7b6
parentab037dd84d703703ab78a60b39027689ec40f2b6 (diff)
downloadioquake3-aero-1c5502a5f7e7437ce02f3d3bd5bab4e543e576f3.tar.gz
ioquake3-aero-1c5502a5f7e7437ce02f3d3bd5bab4e543e576f3.zip
Added SDL joystick support.
git-svn-id: svn://svn.icculus.org/quake3/trunk@53 edf5b092-35ff-0310-97b2-ce42778d08ea
-rw-r--r--code/unix/linux_glimp_sdl.c158
1 files changed, 86 insertions, 72 deletions
diff --git a/code/unix/linux_glimp_sdl.c b/code/unix/linux_glimp_sdl.c
index a85153e..4026e0b 100644
--- a/code/unix/linux_glimp_sdl.c
+++ b/code/unix/linux_glimp_sdl.c
@@ -109,14 +109,6 @@ cvar_t *joy_threshold = NULL;
cvar_t *r_allowSoftwareGL; // don't abort out if the pixelformat claims software
cvar_t *r_previousglDriver;
-static int win_x, win_y;
-
-static int num_vidmodes;
-
-static int mouse_accel_numerator;
-static int mouse_accel_denominator;
-static int mouse_threshold;
-
/*
* Find the first occurrence of find in s.
*/
@@ -1280,6 +1272,13 @@ extern cvar_t * in_joystick;
extern cvar_t * in_joystickDebug;
extern cvar_t * joy_threshold;
+#define ARRAYLEN(x) (sizeof (x) / sizeof (x[0]))
+struct
+{
+ qboolean buttons[16]; // !!! FIXME: these might be too many.
+ unsigned int oldaxes;
+} stick_state;
+
/**********************************************/
/* Joystick routines. */
@@ -1294,6 +1293,7 @@ void IN_StartupJoystick( void )
SDL_JoystickClose(stick);
stick = NULL;
+ memset(&stick_state, '\0', sizeof (stick_state));
if( !in_joystick->integer ) {
Com_Printf( "Joystick is not active.\n" );
@@ -1325,6 +1325,7 @@ void IN_StartupJoystick( void )
Com_Printf( "Joystick %d opened\n", i );
Com_Printf( "Name: %s\n", SDL_JoystickName(i) );
Com_Printf( "Axes: %d\n", SDL_JoystickNumAxes(stick) );
+ Com_Printf( "Hats: %d\n", SDL_JoystickNumHats(stick) );
Com_Printf( "Buttons: %d\n", SDL_JoystickNumButtons(stick) );
Com_Printf( "Balls: %d\n", SDL_JoystickNumBalls(stick) );
@@ -1343,83 +1344,96 @@ void IN_StartupJoystick( void )
void IN_JoyMove( void )
{
- if (!stick)
- return;
-
- SDL_JoystickUpdate();
-
-#if 0 // !!! FIXME: convert this from the Linux codebase.
- /* Store instantaneous joystick state. Hack to get around
- * event model used in Linux joystick driver.
- */
- static int axes_state[16];
- /* Old bits for Quake-style input compares. */
- static unsigned int old_axes = 0;
- /* Our current goodies. */
- unsigned int axes = 0;
- int i = 0;
-
- if( joy_fd == -1 ) {
- return;
- }
-
- /* Empty the queue, dispatching button presses immediately
- * and updating the instantaneous state for the axes.
- */
- do {
- int n = -1;
- struct js_event event;
+ qboolean joy_pressed[ARRAYLEN(joy_keys)];
+ unsigned int axes = 0;
+ int total = 0;
+ int i = 0;
- n = read( joy_fd, &event, sizeof( event ) );
+ if (!stick)
+ return;
- if( n == -1 ) {
- /* No error, we're non-blocking. */
- break;
- }
+ SDL_JoystickUpdate();
- if( event.type & JS_EVENT_BUTTON ) {
- Sys_QueEvent( 0, SE_KEY, K_JOY1 + event.number, event.value, 0, NULL );
- } else if( event.type & JS_EVENT_AXIS ) {
+ memset(joy_pressed, '\0', sizeof (joy_pressed));
- if( event.number >= 16 ) {
- continue;
- }
-
- axes_state[event.number] = event.value;
- } else {
- Com_Printf( "Unknown joystick event type\n" );
+ // update the ball state.
+ total = SDL_JoystickNumBalls(stick);
+ if (total > 0)
+ {
+ int balldx = 0;
+ int balldy = 0;
+ for (i = 0; i < total; i++)
+ {
+ int dx = 0;
+ int dy = 0;
+ SDL_JoystickGetBall(stick, i, &dx, &dy);
+ balldx += dx;
+ balldy += dy;
+ }
+ if (balldx || balldy)
+ {
+ // !!! FIXME: is this good for stick balls, or just mice?
+ // Scale like the mouse input...
+ if (abs(balldx) > 1)
+ balldx *= 2;
+ if (abs(balldy) > 1)
+ balldy *= 2;
+ Sys_QueEvent( 0, SE_MOUSE, balldx, balldy, 0, NULL );
+ }
}
- } while( 1 );
-
-
- /* Translate our instantaneous state to bits. */
- for( i = 0; i < 16; i++ ) {
- float f = ( (float) axes_state[i] ) / 32767.0f;
-
- if( f < -joy_threshold->value ) {
- axes |= ( 1 << ( i * 2 ) );
- } else if( f > joy_threshold->value ) {
- axes |= ( 1 << ( ( i * 2 ) + 1 ) );
+ // now query the stick buttons...
+ total = SDL_JoystickNumButtons(stick);
+ if (total > 0)
+ {
+ if (total > ARRAYLEN(stick_state.buttons))
+ total = ARRAYLEN(stick_state.buttons);
+ for (i = 0; i < total; i++)
+ {
+ qboolean pressed = (SDL_JoystickGetButton(stick, i) != 0);
+ if (pressed != stick_state.buttons[i])
+ {
+ Sys_QueEvent( 0, SE_KEY, K_JOY1 + i, pressed, 0, NULL );
+ stick_state.buttons[i] = pressed;
+ }
+ }
}
- }
-
- /* Time to update axes state based on old vs. new. */
- for( i = 0; i < 16; i++ ) {
+ // !!! FIXME: look at the hats...
- if( ( axes & ( 1 << i ) ) && !( old_axes & ( 1 << i ) ) ) {
- Sys_QueEvent( 0, SE_KEY, joy_keys[i], qtrue, 0, NULL );
+ // finally, look at the axes...
+ total = SDL_JoystickNumAxes(stick);
+ if (total > 0)
+ {
+ if (total > 16) total = 16;
+ for (i = 0; i < total; i++)
+ {
+ Sint16 axis = SDL_JoystickGetAxis(stick, i);
+ float f = ( (float) axis ) / 32767.0f;
+ if( f < -joy_threshold->value ) {
+ axes |= ( 1 << ( i * 2 ) );
+ } else if( f > joy_threshold->value ) {
+ axes |= ( 1 << ( ( i * 2 ) + 1 ) );
+ }
+ }
}
- if( !( axes & ( 1 << i ) ) && ( old_axes & ( 1 << i ) ) ) {
- Sys_QueEvent( 0, SE_KEY, joy_keys[i], qfalse, 0, NULL );
+ /* Time to update axes state based on old vs. new. */
+ if (axes != stick_state.oldaxes)
+ {
+ for( i = 0; i < 16; i++ ) {
+ if( ( axes & ( 1 << i ) ) && !( stick_state.oldaxes & ( 1 << i ) ) ) {
+ Sys_QueEvent( 0, SE_KEY, joy_keys[i], qtrue, 0, NULL );
+ }
+
+ if( !( axes & ( 1 << i ) ) && ( stick_state.oldaxes & ( 1 << i ) ) ) {
+ Sys_QueEvent( 0, SE_KEY, joy_keys[i], qfalse, 0, NULL );
+ }
+ }
}
- }
- /* Save for future generations. */
- old_axes = axes;
-#endif
+ /* Save for future generations. */
+ stick_state.oldaxes = axes;
}
#endif // USE_SDL