213 lines
4.7 KiB
C
213 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 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|