/* =========================================================================== Wolfenstein: Enemy Territory GPL Source Code Copyright (C) 1999-2010 id Software LLC, a ZeniMax Media company. This file is part of the Wolfenstein: Enemy Territory GPL Source Code (“Wolf ET Source Code”). Wolf ET Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Wolf ET Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Wolf ET Source Code. If not, see . In addition, the Wolf: ET Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Wolf ET Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #include Q3DEF_BEGIN #include "../client/client.h" #include "mac_local.h" Q3DEF_END #include "MacPrefs.h" #include "CarbonMouse.h" //#include "HID Manager/HID_Utilities_CFM.h" extern "C" FILE * FSp_fopen( const FSSpec *spec, const char *open_mode ); Boolean inputActive = false; Boolean inputSuspended = true; Boolean inputCarbon = false; Boolean inputHID = false; Boolean inputMouseInWindow = true; //HIDEntry HIDAnalog[kQ3_AnalogAxes]; //HIDEntry HIDDigital[kQ3_DigitalDirections]; //HIDEntry HIDButtons[kQ3_DigitalButtons]; #define MAX_DEVICES 16 #if MAC_Q3_OLDSTUFF #define MAX_MOUSE_BUTTONS 17 #else #define MAX_MOUSE_BUTTONS 24 #endif #define MAX_ELEMENTS 32 #define MAX_DELTAS 5 UInt32 numDevices; UInt32 numElements[MAX_DEVICES]; //HIDEntry hidElements[MAX_DEVICES][MAX_ELEMENTS]; int prevMove[MAX_DEVICES][MAX_ELEMENTS]; float mouseFactor; cvar_t *in_mouse; cvar_t *in_joystick; cvar_t *in_macMouseDivider; cvar_t *in_joyThreshold; cvar_t *joy_xbutton; cvar_t *joy_ybutton; #if MAC_Q3_OLDSTUFF #define A_MWHEELDOWN K_MWHEELDOWN #define A_MWHEELUP K_MWHEELUP #define A_CURSOR_UP K_UPARROW #define A_CURSOR_DOWN K_DOWNARROW #define A_CURSOR_LEFT K_LEFTARROW #define A_CURSOR_RIGHT K_RIGHTARROW #define A_MOUSE1 K_MOUSE1 #define A_MOUSE2 K_MOUSE2 #define A_MOUSE3 K_MOUSE3 #define A_MOUSE4 K_MOUSE4 #define A_MOUSE5 K_MOUSE5 #define A_AUX1 K_AUX1 #define A_AUX2 K_AUX2 #define A_AUX3 K_AUX3 #define A_AUX4 K_AUX4 #define A_AUX5 K_AUX5 #define A_AUX6 K_AUX6 #define A_AUX7 K_AUX7 #define A_AUX8 K_AUX8 #define A_AUX9 K_AUX9 #define A_AUX10 K_AUX10 #define A_AUX11 K_AUX11 #define A_AUX12 K_AUX12 #define A_AUX13 K_AUX13 #define A_AUX14 K_AUX14 #define A_AUX15 K_AUX15 #define A_AUX16 K_AUX16 #define A_JOY0 K_JOY1 #define A_JOY1 K_JOY2 #endif static Boolean sLastButton[MAX_MOUSE_BUTTONS]; extern short IsPressed( unsigned short k ); void Input_Init( void ); void Input_GetState( void ); /* ================= Sys_InitInput ================= */ void Sys_InitInput( void ) { NumVersion ver; int i, j; OSStatus err; UInt32 temp; inputCarbon = false; inputHID = false; inputActive = false; #if MAC_Q3_MP // no input with dedicated servers if ( com_dedicated->integer ) { return; } #endif Com_Printf( "------- Input Initialization -------\n" ); in_mouse = Cvar_Get( "in_mouse", "1", CVAR_ARCHIVE ); in_joystick = Cvar_Get( "in_joystick", "0", CVAR_ARCHIVE ); in_macMouseDivider = Cvar_Get( "in_macMouseDivider", "163", CVAR_ARCHIVE ); // FIXME: why this constant in_joyThreshold = Cvar_Get( "joy_threshold", "0.15", CVAR_ARCHIVE ); joy_xbutton = Cvar_Get( "joy_xbutton", "1", CVAR_ARCHIVE ); joy_ybutton = Cvar_Get( "joy_ybutton", "1", CVAR_ARCHIVE ); mouseFactor = 1.0 / in_macMouseDivider->value; { inputHID = true; if ( Carbon_InitMouse() ) { inputCarbon = true; if ( in_mouse->integer ) { inputActive = true; } Com_Printf( "------------------------------------\n" ); return; } else { inputActive = false; return; } } } /* ================= Sys_ShutdownInput ================= */ void Sys_ShutdownInput( void ) { if ( inputHID ) { inputHID = false; } if ( inputCarbon ) { Carbon_EnableMouse( false ); } if ( !inputActive ) { return; } CGDirectDisplayID displayID; displayID = (CGDirectDisplayID)macPrefs.displayID; if ( displayID == 0 ) { displayID = kCGDirectMainDisplay; } CGDisplayShowCursor( displayID ); inputActive = qfalse; inputSuspended = true; } void Sys_SuspendInput( void ) { if ( inputSuspended ) { return; } inputSuspended = true; if ( inputCarbon ) { Carbon_EnableMouse( false ); } InitCursor(); } void Sys_ResumeInput( void ) { if ( !inputSuspended ) { return; } inputSuspended = false; CGDirectDisplayID displayID; displayID = (CGDirectDisplayID)macPrefs.displayID; if ( displayID == 0 ) { displayID = kCGDirectMainDisplay; } CGDisplayHideCursor( displayID ); memset( prevMove, 0, sizeof( prevMove ) ); if ( inputCarbon ) { int i; // Reset our button tracking states for ( i = 0; i < MAX_MOUSE_BUTTONS; i++ ) sLastButton[i] = 0; Carbon_EnableMouse( true ); } } // Note that A_MOUSE1 through A_MOUSE5 are not consecutive constants // in the Q3 core, thus the lookup table static int sMouseButtonLookup[MAX_MOUSE_BUTTONS] = { A_MOUSE1, A_MOUSE2, A_MOUSE3, A_MOUSE4, A_MOUSE5, A_AUX5, A_AUX6, A_AUX7, A_AUX8, A_AUX9, A_AUX10, A_AUX11, A_AUX12, A_AUX13, A_AUX14, A_AUX15, A_AUX16 #if !MAC_Q3_OLDSTUFF ,A_AUX17, A_AUX18, A_AUX19, A_AUX20, A_AUX21, A_AUX22, A_AUX23 #endif }; void Sys_Input_Carbon( void ) { SInt32 move[MAX_DELTAS]; int i; if ( in_mouse->integer != 0 ) { // Read the mouse deltas Carbon_ReadMouseDeltas( &move[0], &move[1] ); if ( move[0] || move[1] ) { Sys_QueEvent( 0, SE_MOUSE, move[0], move[1], 0, NULL ); } // Read the button states for ( i = 0; i < MAX_MOUSE_BUTTONS; i++ ) { Boolean isPressed; isPressed = Carbon_ReadMouseButton( i ); // If the button state differs from what we last saw, generate an event if ( isPressed != sLastButton[i] ) { int q3_button; q3_button = sMouseButtonLookup[i]; // 1.04.1 patch if ( ( q3_button == A_MOUSE1 ) && ( macPrefs.button2fake ) && IsPressed( kControlKey ) ) { q3_button = A_MOUSE2; } Sys_QueEvent( 0, SE_KEY, q3_button, isPressed, 0, NULL ); sLastButton[i] = isPressed; } } // Read the mouse wheel delta Carbon_ReadMouseWheelDelta( &move[2] ); if ( move[2] < 0 ) { Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, 1, 0, NULL ); } else if ( move[2] > 0 ) { Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, 1, 0, NULL ); } } } // LBO - note that changes are needed to cl_input.cpp in the routine // CL_JoystickMove(). It's surprisingly broken - I guess no one tries to // play Quake3 games with analog sticks. :-) #define kJoystickAnalogLimit 512 int joyDirection[4] = { A_CURSOR_UP, A_CURSOR_DOWN, A_CURSOR_LEFT, A_CURSOR_RIGHT }; /* ================= Sys_Input ================= */ void Sys_Input( void ) { if ( !inputActive ) { return; } #if MAC_Q3_MP // always suspend for dedicated if ( com_dedicated->integer ) { Sys_SuspendInput(); return; } #endif if ( ( !glConfig.isFullscreen ) && ( !inputMouseInWindow ) ) { Sys_SuspendInput(); return; } #if !MAC_MOHAA && !MAC_ALICE if ( cls.keyCatchers & KEYCATCH_CONSOLE ) { // temporarily deactivate if not in the game and // running on the desktop if ( Cvar_VariableValue( "r_fullscreen" ) == 0 ) { Sys_SuspendInput(); return; } } #endif Sys_ResumeInput(); // If we're using OSX, send mouse events via CarbonEvents if ( inputCarbon ) { Sys_Input_Carbon(); } } extern "C" void IN_StartupJoystick( void ) { } extern "C" void IN_MouseCancel( void ) { }