jedioutcast/code/mac/mac_input.c
2013-04-04 09:52:42 -05:00

212 lines
4.7 KiB
C

#include "../client/client.h"
#include "mac_local.h"
#include "InputSprocket.h"
qboolean inputActive;
qboolean inputSuspended;
#define MAX_DEVICES 100
ISpDeviceReference devices[MAX_DEVICES];
ISpElementListReference elementList;
#define MAX_ELEMENTS 512
#define MAX_MOUSE_DEVICES 2
UInt32 numDevices;
UInt32 numElements[MAX_MOUSE_DEVICES];
ISpElementReference elements[MAX_MOUSE_DEVICES][MAX_ELEMENTS];
cvar_t *in_nomouse;
void Input_Init(void);
void Input_GetState( void );
/*
=================
Sys_InitInput
=================
*/
void Sys_InitInput( void ) {
NumVersion ver;
ISpElementInfo info;
int i, j;
OSStatus err;
// no input with dedicated servers
if ( com_dedicated->integer ) {
return;
}
Com_Printf( "------- Input Initialization -------\n" );
in_nomouse = Cvar_Get( "in_nomouse", "0", 0 );
if ( in_nomouse->integer != 0 ) {
Com_Printf( "in_nomouse is set, skipping.\n" );
Com_Printf( "------------------------------------\n" );
return;
}
ver = ISpGetVersion();
Com_Printf( "InputSprocket version: 0x%x\n", ver );
err = ISpStartup();
if ( err ) {
Com_Printf( "ISpStartup failed: %i\n", err );
Com_Printf( "------------------------------------\n" );
return;
}
// disable everything
ISpDevices_Extract( MAX_DEVICES, &numDevices, devices );
Com_Printf("%i total devices\n", numDevices);
if (numDevices > MAX_DEVICES) {
numDevices = MAX_DEVICES;
}
err = ISpDevices_Deactivate(
numDevices,
devices);
// enable mouse
err = ISpDevices_ExtractByClass(
kISpDeviceClass_Mouse,
MAX_DEVICES,
&numDevices,
devices);
Com_Printf("%i mouse devices\n", numDevices);
if (numDevices > MAX_MOUSE_DEVICES) {
numDevices = MAX_MOUSE_DEVICES;
}
err = ISpDevices_Activate( numDevices, devices);
for ( i = 0 ; i < numDevices ; i++ ) {
ISpDevice_GetElementList( devices[i], &elementList );
// ISpGetGlobalElementList( &elementList );
// go through all the elements and asign them Quake key codes
ISpElementList_Extract( elementList, MAX_ELEMENTS, &numElements[i], elements[i] );
Com_Printf("%i elements in list\n", numElements[i] );
for ( j = 0 ; j < numElements[i] ; j++ ) {
ISpElement_GetInfo( elements[i][j], &info );
PStringToCString( (char *)info.theString );
Com_Printf( "%i : %s\n", i, info.theString );
}
}
inputActive = true;
HideCursor();
Com_Printf( "------------------------------------\n" );
}
/*
=================
Sys_ShutdownInput
=================
*/
void Sys_ShutdownInput( void ) {
if ( !inputActive ) {
return;
}
ShowCursor();
ISpShutdown();
inputActive = qfalse;
}
void Sys_SuspendInput( void ) {
if ( inputSuspended ) {
return;
}
inputSuspended = true;
ShowCursor();
ISpSuspend();
}
void Sys_ResumeInput( void ) {
if ( !inputSuspended ) {
return;
}
inputSuspended = false;
HideCursor();
ISpResume();
}
/*
=================
Sys_Input
=================
*/
void Sys_Input( void ) {
ISpElementEvent event;
Boolean wasEvent;
UInt32 state, state2;
int xmove, ymove;
int button;
static int xtotal, ytotal;
int device;
if ( !inputActive ) {
return;
}
// during debugging it is sometimes usefull to be able to kill mouse support
if ( in_nomouse->integer ) {
Com_Printf( "Shutting down input.\n");
Sys_ShutdownInput();
return;
}
// always suspend for dedicated
if ( com_dedicated->integer ) {
Sys_SuspendInput();
return;
}
// temporarily deactivate if not in the game and
if ( cls.keyCatchers || cls.state != CA_ACTIVE ) {
if ( !glConfig.isFullscreen ) {
Sys_SuspendInput();
return;
}
}
Sys_ResumeInput();
// send all button events
for ( device = 0 ; device < numDevices ; device++ ) {
// mouse buttons
for ( button = 2 ; button < numElements[device] ; button++ ) {
while ( 1 ) {
ISpElement_GetNextEvent( elements[device][button], sizeof( event ), &event, &wasEvent );
if ( !wasEvent ) {
break;
}
if ( event.data ) {
Sys_QueEvent( 0, SE_KEY, K_MOUSE1 + button - 2, 1, 0, NULL );
} else {
Sys_QueEvent( 0, SE_KEY, K_MOUSE1 + button - 2, 0, 0, NULL );
}
}
}
// mouse movement
#define MAC_MOUSE_SCALE 163 // why this constant?
// send mouse event
ISpElement_GetSimpleState( elements[device][0], &state );
xmove = (int)state / MAC_MOUSE_SCALE;
ISpElement_GetSimpleState( elements[device][1], &state2 );
ymove = (int)state2 / -MAC_MOUSE_SCALE;
if ( xmove || ymove ) {
xtotal += xmove;
ytotal += ymove;
//Com_Printf("%i %i = %i %i\n", state, state2, xtotal, ytotal );
Sys_QueEvent( 0, SE_MOUSE, xmove, ymove, 0, NULL );
}
}
}