Quake-III-Arena-VS/source/engine/platform/win_input.c
Artem Kharytoniuk ce760440ae Removed DirectInput mouse support. Microsoft does not recommend to use DI for mouse handling anymore.
Removed midi controller/joystick support in platform code.
2016-07-14 22:33:22 +03:00

353 lines
6.3 KiB
C

/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.
This file is part of Quake III Arena source code.
Quake III Arena 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 2 of the License,
or (at your option) any later version.
Quake III Arena 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 Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// win_input.c -- win32 mouse and joystick code
// 02/21/97 JCB Added extended DirectInput code to support external controllers.
#include "../client/client.h"
#include "win_local.h"
typedef struct {
int oldButtonState;
qboolean mouseActive;
qboolean mouseInitialized;
} WinMouseVars_t;
static WinMouseVars_t s_wmv;
static int window_center_x, window_center_y;
cvar_t *in_mouse;
cvar_t *in_logitechbug;
qboolean in_appactive;
/*
============================================================
WIN32 MOUSE CONTROL
============================================================
*/
/*
================
IN_InitWin32Mouse
================
*/
void IN_InitWin32Mouse( void )
{
}
/*
================
IN_ShutdownWin32Mouse
================
*/
void IN_ShutdownWin32Mouse( void ) {
}
/*
================
IN_ActivateWin32Mouse
================
*/
void IN_ActivateWin32Mouse( void ) {
int width, height;
RECT window_rect;
width = GetSystemMetrics (SM_CXSCREEN);
height = GetSystemMetrics (SM_CYSCREEN);
GetWindowRect ( g_wv.hWnd, &window_rect);
if (window_rect.left < 0)
window_rect.left = 0;
if (window_rect.top < 0)
window_rect.top = 0;
if (window_rect.right >= width)
window_rect.right = width-1;
if (window_rect.bottom >= height-1)
window_rect.bottom = height-1;
window_center_x = (window_rect.right + window_rect.left)/2;
window_center_y = (window_rect.top + window_rect.bottom)/2;
SetCursorPos (window_center_x, window_center_y);
SetCapture ( g_wv.hWnd );
ClipCursor (&window_rect);
while (ShowCursor (FALSE) >= 0)
;
}
/*
================
IN_DeactivateWin32Mouse
================
*/
void IN_DeactivateWin32Mouse( void )
{
ClipCursor (NULL);
ReleaseCapture ();
while (ShowCursor (TRUE) < 0)
;
}
/*
================
IN_Win32Mouse
================
*/
void IN_Win32Mouse( int *mx, int *my ) {
POINT current_pos;
// find mouse movement
GetCursorPos (&current_pos);
// force the mouse to the center, so there's room to move
SetCursorPos (window_center_x, window_center_y);
*mx = current_pos.x - window_center_x;
*my = current_pos.y - window_center_y;
}
/*
============================================================
MOUSE CONTROL
============================================================
*/
/*
===========
IN_ActivateMouse
Called when the window gains focus or changes in some way
===========
*/
void IN_ActivateMouse( void )
{
if (!s_wmv.mouseInitialized ) {
return;
}
if ( !in_mouse->integer )
{
s_wmv.mouseActive = qfalse;
return;
}
if ( s_wmv.mouseActive )
{
return;
}
s_wmv.mouseActive = qtrue;
IN_ActivateWin32Mouse();
}
/*
===========
IN_DeactivateMouse
Called when the window loses focus
===========
*/
void IN_DeactivateMouse( void ) {
if (!s_wmv.mouseInitialized ) {
return;
}
if (!s_wmv.mouseActive ) {
return;
}
s_wmv.mouseActive = qfalse;
IN_DeactivateWin32Mouse();
}
/*
===========
IN_StartupMouse
===========
*/
void IN_StartupMouse( void )
{
s_wmv.mouseInitialized = qfalse;
if ( in_mouse->integer == 0 ) {
Com_Printf ("Mouse control not active.\n");
return;
}
s_wmv.mouseInitialized = qtrue;
IN_InitWin32Mouse();
Com_Printf ("Win32 mouse input initialized.\n");
}
/*
===========
IN_MouseEvent
===========
*/
void IN_MouseEvent (int mstate)
{
int i;
if ( !s_wmv.mouseInitialized )
return;
// perform button actions
for (i = 0 ; i < 3 ; i++ )
{
if ( (mstate & (1<<i)) &&
!(s_wmv.oldButtonState & (1<<i)) )
{
Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MOUSE1 + i, qtrue, 0, NULL );
}
if ( !(mstate & (1<<i)) &&
(s_wmv.oldButtonState & (1<<i)) )
{
Sys_QueEvent( g_wv.sysMsgTime, SE_KEY, K_MOUSE1 + i, qfalse, 0, NULL );
}
}
s_wmv.oldButtonState = mstate;
}
/*
===========
IN_MouseMove
===========
*/
void IN_MouseMove ( void ) {
int mx, my;
IN_Win32Mouse( &mx, &my );
if ( !mx && !my ) {
return;
}
Sys_QueEvent( 0, SE_MOUSE, mx, my, 0, NULL );
}
/*
=========================================================================
=========================================================================
*/
/*
===========
IN_Startup
===========
*/
void IN_Startup( void ) {
Com_Printf ("\n------- Input Initialization -------\n");
IN_StartupMouse ();
Com_Printf ("------------------------------------\n");
in_mouse->modified = qfalse;
}
/*
===========
IN_Shutdown
===========
*/
void IN_Shutdown( void ) {
IN_DeactivateMouse();
}
/*
===========
IN_Init
===========
*/
void IN_Init( void ) {
in_mouse = Cvar_Get ("in_mouse", "1", CVAR_ARCHIVE|CVAR_LATCH);
in_logitechbug = Cvar_Get ("in_logitechbug", "0", CVAR_ARCHIVE);
IN_Startup();
}
/*
===========
IN_Activate
Called when the main window gains or loses focus.
The window may have been destroyed and recreated
between a deactivate and an activate.
===========
*/
void IN_Activate (qboolean active) {
in_appactive = active;
if ( !active )
{
IN_DeactivateMouse();
}
}
/*
==================
IN_Frame
Called every frame, even if not generating commands
==================
*/
void IN_Frame (void) {
if ( !s_wmv.mouseInitialized ) {
return;
}
if ( cls.keyCatchers & KEYCATCH_CONSOLE ) {
// temporarily deactivate if not in the game and
// running on the desktop
// voodoo always counts as full screen
if (Cvar_VariableValue ("r_fullscreen") == 0 ) {
IN_DeactivateMouse ();
return;
}
}
if ( !in_appactive ) {
IN_DeactivateMouse ();
return;
}
IN_ActivateMouse();
// post events to the system que
IN_MouseMove();
}