2008-07-06 22:00:00 +02:00
|
|
|
|
//=======================================================================
|
|
|
|
|
// Copyright XashXT Group 2007 <20>
|
|
|
|
|
// input.c - win32 input devices
|
|
|
|
|
//=======================================================================
|
|
|
|
|
|
|
|
|
|
#include "common.h"
|
2008-08-04 22:00:00 +02:00
|
|
|
|
#include "input.h"
|
2008-07-06 22:00:00 +02:00
|
|
|
|
#include "client.h"
|
2010-01-01 22:00:00 +01:00
|
|
|
|
|
2010-01-02 22:00:00 +01:00
|
|
|
|
#define WM_MOUSEWHEEL ( WM_MOUSELAST + 1 ) // message that will be supported by the OS
|
2010-09-16 22:00:00 +02:00
|
|
|
|
#define MK_XBUTTON1 0x0020
|
|
|
|
|
#define MK_XBUTTON2 0x0040
|
|
|
|
|
#define MK_XBUTTON3 0x0080
|
|
|
|
|
#define MK_XBUTTON4 0x0100
|
|
|
|
|
#define MK_XBUTTON5 0x0200
|
|
|
|
|
#define WM_XBUTTONUP 0x020C
|
|
|
|
|
#define WM_XBUTTONDOWN 0x020B
|
|
|
|
|
|
2010-01-02 22:00:00 +01:00
|
|
|
|
#define WND_HEADSIZE wnd_caption // some offset
|
|
|
|
|
#define WND_BORDER 3 // sentinel border in pixels
|
2010-01-01 22:00:00 +01:00
|
|
|
|
|
2010-10-26 22:00:00 +02:00
|
|
|
|
qboolean in_mouseactive; // false when not focus app
|
|
|
|
|
qboolean in_restore_spi;
|
|
|
|
|
qboolean in_mouseinitialized;
|
2010-01-01 22:00:00 +01:00
|
|
|
|
int in_originalmouseparms[3];
|
2010-06-17 22:00:00 +02:00
|
|
|
|
int in_mouse_oldbuttonstate;
|
2010-01-01 22:00:00 +01:00
|
|
|
|
int in_newmouseparms[3] = { 0, 0, 1 };
|
2010-10-26 22:00:00 +02:00
|
|
|
|
qboolean in_mouse_suspended;
|
|
|
|
|
qboolean in_mouseparmsvalid;
|
2010-01-01 22:00:00 +01:00
|
|
|
|
int in_mouse_buttons;
|
2010-01-02 22:00:00 +01:00
|
|
|
|
RECT window_rect, real_rect;
|
2010-01-01 22:00:00 +01:00
|
|
|
|
uint in_mouse_wheel;
|
2010-01-02 22:00:00 +01:00
|
|
|
|
int wnd_caption;
|
2008-07-06 22:00:00 +02:00
|
|
|
|
|
2008-08-04 22:00:00 +02:00
|
|
|
|
static byte scan_to_key[128] =
|
|
|
|
|
{
|
|
|
|
|
0,27,'1','2','3','4','5','6','7','8','9','0','-','=',K_BACKSPACE,9,
|
|
|
|
|
'q','w','e','r','t','y','u','i','o','p','[',']', 13 , K_CTRL,
|
|
|
|
|
'a','s','d','f','g','h','j','k','l',';','\'','`',
|
|
|
|
|
K_SHIFT,'\\','z','x','c','v','b','n','m',',','.','/',K_SHIFT,
|
|
|
|
|
'*',K_ALT,' ',K_CAPSLOCK,
|
|
|
|
|
K_F1,K_F2,K_F3,K_F4,K_F5,K_F6,K_F7,K_F8,K_F9,K_F10,
|
|
|
|
|
K_PAUSE,0,K_HOME,K_UPARROW,K_PGUP,K_KP_MINUS,K_LEFTARROW,K_KP_5,
|
|
|
|
|
K_RIGHTARROW,K_KP_PLUS,K_END,K_DOWNARROW,K_PGDN,K_INS,K_DEL,
|
|
|
|
|
0,0,0,K_F11,K_F12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
|
|
|
};
|
|
|
|
|
|
2010-09-16 22:00:00 +02:00
|
|
|
|
// extra mouse buttons
|
|
|
|
|
static int mouse_buttons[] =
|
|
|
|
|
{
|
|
|
|
|
MK_LBUTTON,
|
|
|
|
|
MK_RBUTTON,
|
|
|
|
|
MK_MBUTTON,
|
|
|
|
|
MK_XBUTTON1,
|
|
|
|
|
MK_XBUTTON2,
|
|
|
|
|
MK_XBUTTON3,
|
|
|
|
|
MK_XBUTTON4,
|
|
|
|
|
MK_XBUTTON5
|
|
|
|
|
};
|
|
|
|
|
|
2008-08-04 22:00:00 +02:00
|
|
|
|
/*
|
|
|
|
|
=======
|
|
|
|
|
Host_MapKey
|
|
|
|
|
|
|
|
|
|
Map from windows to engine keynums
|
|
|
|
|
=======
|
|
|
|
|
*/
|
|
|
|
|
static int Host_MapKey( int key )
|
|
|
|
|
{
|
|
|
|
|
int result, modified;
|
2010-10-26 22:00:00 +02:00
|
|
|
|
qboolean is_extended = false;
|
2008-08-04 22:00:00 +02:00
|
|
|
|
|
|
|
|
|
modified = ( key >> 16 ) & 255;
|
|
|
|
|
if( modified > 127 ) return 0;
|
|
|
|
|
|
2010-02-18 22:00:00 +01:00
|
|
|
|
if( key & ( 1 << 24 ))
|
2008-08-04 22:00:00 +02:00
|
|
|
|
is_extended = true;
|
|
|
|
|
|
|
|
|
|
result = scan_to_key[modified];
|
|
|
|
|
|
|
|
|
|
if( !is_extended )
|
|
|
|
|
{
|
2010-06-17 22:00:00 +02:00
|
|
|
|
switch( result )
|
2008-08-04 22:00:00 +02:00
|
|
|
|
{
|
|
|
|
|
case K_HOME: return K_KP_HOME;
|
|
|
|
|
case K_UPARROW: return K_KP_UPARROW;
|
|
|
|
|
case K_PGUP: return K_KP_PGUP;
|
|
|
|
|
case K_LEFTARROW: return K_KP_LEFTARROW;
|
|
|
|
|
case K_RIGHTARROW: return K_KP_RIGHTARROW;
|
|
|
|
|
case K_END: return K_KP_END;
|
|
|
|
|
case K_DOWNARROW: return K_KP_DOWNARROW;
|
|
|
|
|
case K_PGDN: return K_KP_PGDN;
|
|
|
|
|
case K_INS: return K_KP_INS;
|
|
|
|
|
case K_DEL: return K_KP_DEL;
|
|
|
|
|
default: return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2010-06-17 22:00:00 +02:00
|
|
|
|
switch( result )
|
2008-08-04 22:00:00 +02:00
|
|
|
|
{
|
|
|
|
|
case K_PAUSE: return K_KP_NUMLOCK;
|
|
|
|
|
case 0x0D: return K_KP_ENTER;
|
|
|
|
|
case 0x2F: return K_KP_SLASH;
|
|
|
|
|
case 0xAF: return K_KP_PLUS;
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-07-06 22:00:00 +02:00
|
|
|
|
/*
|
|
|
|
|
===========
|
|
|
|
|
IN_StartupMouse
|
|
|
|
|
===========
|
|
|
|
|
*/
|
|
|
|
|
void IN_StartupMouse( void )
|
|
|
|
|
{
|
2010-05-22 22:00:00 +02:00
|
|
|
|
if( host.type == HOST_DEDICATED ) return;
|
2010-07-29 22:00:00 +02:00
|
|
|
|
if( FS_CheckParm( "-nomouse" )) return;
|
2008-07-06 22:00:00 +02:00
|
|
|
|
|
2010-09-16 22:00:00 +02:00
|
|
|
|
in_mouse_buttons = 8;
|
2008-07-06 22:00:00 +02:00
|
|
|
|
in_mouseparmsvalid = SystemParametersInfo( SPI_GETMOUSE, 0, in_originalmouseparms, 0 );
|
|
|
|
|
in_mouseinitialized = true;
|
2009-02-02 22:00:00 +01:00
|
|
|
|
in_mouse_wheel = RegisterWindowMessage( "MSWHEEL_ROLLMSG" );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
2010-10-26 22:00:00 +02:00
|
|
|
|
static qboolean IN_CursorInRect( void )
|
2010-01-01 22:00:00 +01:00
|
|
|
|
{
|
|
|
|
|
POINT curpos;
|
|
|
|
|
|
|
|
|
|
if( !in_mouseinitialized || !in_mouseactive )
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// find mouse movement
|
|
|
|
|
GetCursorPos( &curpos );
|
|
|
|
|
|
2010-01-02 22:00:00 +01:00
|
|
|
|
if( curpos.x < real_rect.left + WND_BORDER )
|
2010-01-01 22:00:00 +01:00
|
|
|
|
return false;
|
2010-01-02 22:00:00 +01:00
|
|
|
|
if( curpos.x > real_rect.right - WND_BORDER * 3 )
|
2010-01-01 22:00:00 +01:00
|
|
|
|
return false;
|
2010-01-02 22:00:00 +01:00
|
|
|
|
if( curpos.y < real_rect.top + WND_HEADSIZE + WND_BORDER )
|
2010-01-01 22:00:00 +01:00
|
|
|
|
return false;
|
2010-01-02 22:00:00 +01:00
|
|
|
|
if( curpos.y > real_rect.bottom - WND_BORDER * 3 )
|
2010-01-01 22:00:00 +01:00
|
|
|
|
return false;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2010-11-15 22:00:00 +01:00
|
|
|
|
/*
|
|
|
|
|
===========
|
|
|
|
|
IN_ToggleClientMouse
|
|
|
|
|
|
|
|
|
|
Called when key_dest is changed
|
|
|
|
|
===========
|
|
|
|
|
*/
|
|
|
|
|
void IN_ToggleClientMouse( int newstate, int oldstate )
|
|
|
|
|
{
|
|
|
|
|
if( newstate == oldstate ) return;
|
|
|
|
|
|
|
|
|
|
if( oldstate == key_game )
|
|
|
|
|
{
|
|
|
|
|
clgame.dllFuncs.IN_DeactivateMouse();
|
|
|
|
|
}
|
|
|
|
|
else if( newstate == key_game )
|
|
|
|
|
{
|
|
|
|
|
clgame.dllFuncs.IN_ActivateMouse();
|
|
|
|
|
}
|
|
|
|
|
}
|
2010-01-01 22:00:00 +01:00
|
|
|
|
|
2008-07-06 22:00:00 +02:00
|
|
|
|
/*
|
|
|
|
|
===========
|
|
|
|
|
IN_ActivateMouse
|
|
|
|
|
|
|
|
|
|
Called when the window gains focus or changes in some way
|
|
|
|
|
===========
|
|
|
|
|
*/
|
|
|
|
|
void IN_ActivateMouse( void )
|
|
|
|
|
{
|
2010-01-01 22:00:00 +01:00
|
|
|
|
int width, height;
|
|
|
|
|
static int oldstate;
|
2010-01-02 22:00:00 +01:00
|
|
|
|
POINT global_pos;
|
|
|
|
|
int x, y;
|
|
|
|
|
|
2008-07-06 22:00:00 +02:00
|
|
|
|
if( !in_mouseinitialized )
|
|
|
|
|
return;
|
|
|
|
|
|
2010-12-27 22:00:00 +01:00
|
|
|
|
if( cls.key_dest == key_menu && !Cvar_VariableInteger( "fullscreen" ))
|
2010-01-01 22:00:00 +01:00
|
|
|
|
{
|
|
|
|
|
// check for mouse leave-entering
|
2010-06-17 22:00:00 +02:00
|
|
|
|
if( !in_mouse_suspended && !UI_MouseInRect( ))
|
2010-01-01 22:00:00 +01:00
|
|
|
|
in_mouse_suspended = true;
|
|
|
|
|
|
|
|
|
|
if( oldstate != in_mouse_suspended )
|
|
|
|
|
{
|
|
|
|
|
if( in_mouse_suspended )
|
|
|
|
|
{
|
2010-07-18 22:00:00 +02:00
|
|
|
|
UI_GetCursorPos( &global_pos.x, &global_pos.y );
|
2010-01-02 22:00:00 +01:00
|
|
|
|
|
2010-01-01 22:00:00 +01:00
|
|
|
|
ClipCursor( NULL );
|
|
|
|
|
ReleaseCapture();
|
|
|
|
|
while( ShowCursor( true ) < 0 );
|
2010-01-02 22:00:00 +01:00
|
|
|
|
UI_ShowCursor( false );
|
2010-01-01 22:00:00 +01:00
|
|
|
|
|
2010-01-02 22:00:00 +01:00
|
|
|
|
x = real_rect.left + global_pos.x;
|
|
|
|
|
y = real_rect.top + global_pos.y + WND_HEADSIZE;
|
2010-01-01 22:00:00 +01:00
|
|
|
|
|
|
|
|
|
// set system cursor position
|
|
|
|
|
SetCursorPos( x, y );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
oldstate = in_mouse_suspended;
|
|
|
|
|
|
2010-06-17 22:00:00 +02:00
|
|
|
|
if( in_mouse_suspended && IN_CursorInRect( ))
|
2010-01-01 22:00:00 +01:00
|
|
|
|
{
|
|
|
|
|
GetCursorPos( &global_pos );
|
|
|
|
|
in_mouse_suspended = false;
|
|
|
|
|
in_mouseactive = false; // re-initialize mouse
|
|
|
|
|
|
2010-01-02 22:00:00 +01:00
|
|
|
|
x = global_pos.x - real_rect.left;
|
|
|
|
|
y = global_pos.y - real_rect.top - WND_HEADSIZE;
|
2010-01-01 22:00:00 +01:00
|
|
|
|
|
|
|
|
|
// set menu cursor position
|
2010-01-02 22:00:00 +01:00
|
|
|
|
UI_SetCursorPos( x, y );
|
|
|
|
|
UI_ShowCursor( true );
|
2010-01-01 22:00:00 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-07-06 22:00:00 +02:00
|
|
|
|
if( in_mouseactive ) return;
|
|
|
|
|
in_mouseactive = true;
|
|
|
|
|
|
2011-02-15 22:00:00 +01:00
|
|
|
|
if( cls.key_dest == key_game )
|
2010-11-15 22:00:00 +01:00
|
|
|
|
{
|
|
|
|
|
clgame.dllFuncs.IN_ActivateMouse();
|
|
|
|
|
}
|
|
|
|
|
else if( in_mouseparmsvalid )
|
2008-07-06 22:00:00 +02:00
|
|
|
|
in_restore_spi = SystemParametersInfo( SPI_SETMOUSE, 0, in_newmouseparms, 0 );
|
|
|
|
|
|
2010-01-01 22:00:00 +01:00
|
|
|
|
width = GetSystemMetrics( SM_CXSCREEN );
|
|
|
|
|
height = GetSystemMetrics( SM_CYSCREEN );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
|
2009-10-02 22:00:00 +02:00
|
|
|
|
GetWindowRect( host.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;
|
|
|
|
|
|
2010-08-20 22:00:00 +02:00
|
|
|
|
host.window_center_x = (window_rect.right + window_rect.left) / 2;
|
|
|
|
|
host.window_center_y = (window_rect.top + window_rect.bottom) / 2;
|
|
|
|
|
SetCursorPos( host.window_center_x, host.window_center_y );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
|
|
|
|
|
SetCapture( host.hWnd );
|
2009-10-02 22:00:00 +02:00
|
|
|
|
ClipCursor( &window_rect );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
while( ShowCursor(false) >= 0 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
===========
|
|
|
|
|
IN_DeactivateMouse
|
|
|
|
|
|
|
|
|
|
Called when the window loses focus
|
|
|
|
|
===========
|
|
|
|
|
*/
|
|
|
|
|
void IN_DeactivateMouse( void )
|
|
|
|
|
{
|
|
|
|
|
if( !in_mouseinitialized || !in_mouseactive )
|
|
|
|
|
return;
|
|
|
|
|
|
2011-02-15 22:00:00 +01:00
|
|
|
|
if( cls.key_dest == key_game )
|
2010-11-15 22:00:00 +01:00
|
|
|
|
{
|
|
|
|
|
clgame.dllFuncs.IN_DeactivateMouse();
|
|
|
|
|
}
|
|
|
|
|
else if( in_restore_spi )
|
2008-07-06 22:00:00 +02:00
|
|
|
|
SystemParametersInfo( SPI_SETMOUSE, 0, in_originalmouseparms, 0 );
|
|
|
|
|
|
|
|
|
|
in_mouseactive = false;
|
|
|
|
|
ClipCursor( NULL );
|
|
|
|
|
ReleaseCapture();
|
2010-06-17 22:00:00 +02:00
|
|
|
|
while( ShowCursor( true ) < 0 );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
================
|
|
|
|
|
IN_Mouse
|
|
|
|
|
================
|
|
|
|
|
*/
|
|
|
|
|
void IN_MouseMove( void )
|
|
|
|
|
{
|
|
|
|
|
POINT current_pos;
|
|
|
|
|
int mx, my;
|
|
|
|
|
|
2011-02-15 22:00:00 +01:00
|
|
|
|
if( !in_mouseinitialized || !in_mouseactive || in_mouse_suspended || cls.key_dest == key_game )
|
2008-07-06 22:00:00 +02:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// find mouse movement
|
|
|
|
|
GetCursorPos( ¤t_pos );
|
|
|
|
|
|
|
|
|
|
// force the mouse to the center, so there's room to move
|
2010-08-20 22:00:00 +02:00
|
|
|
|
SetCursorPos( host.window_center_x, host.window_center_y );
|
|
|
|
|
mx = current_pos.x - host.window_center_x;
|
|
|
|
|
my = current_pos.y - host.window_center_y;
|
2008-07-06 22:00:00 +02:00
|
|
|
|
|
|
|
|
|
if( !mx && !my ) return;
|
2010-10-09 22:00:00 +02:00
|
|
|
|
Sys_QueEvent( SE_MOUSE, mx, my, 0, NULL );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
===========
|
|
|
|
|
IN_MouseEvent
|
|
|
|
|
===========
|
|
|
|
|
*/
|
|
|
|
|
void IN_MouseEvent( int mstate )
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
2008-08-10 22:00:00 +02:00
|
|
|
|
if( !in_mouseinitialized || !in_mouseactive )
|
2008-07-06 22:00:00 +02:00
|
|
|
|
return;
|
|
|
|
|
|
2011-02-15 22:00:00 +01:00
|
|
|
|
if( cls.key_dest == key_game )
|
2010-11-15 22:00:00 +01:00
|
|
|
|
{
|
|
|
|
|
clgame.dllFuncs.IN_MouseEvent( mstate );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2008-07-06 22:00:00 +02:00
|
|
|
|
// perform button actions
|
|
|
|
|
for( i = 0; i < in_mouse_buttons; i++ )
|
|
|
|
|
{
|
2010-10-09 22:00:00 +02:00
|
|
|
|
if(( mstate & ( 1<<i )) && !( in_mouse_oldbuttonstate & ( 1<<i )))
|
2008-07-06 22:00:00 +02:00
|
|
|
|
{
|
2010-10-09 22:00:00 +02:00
|
|
|
|
Sys_QueEvent( SE_KEY, K_MOUSE1 + i, true, 0, NULL );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
}
|
2010-10-09 22:00:00 +02:00
|
|
|
|
if(!( mstate & ( 1<<i )) && ( in_mouse_oldbuttonstate & ( 1<<i )))
|
2008-07-06 22:00:00 +02:00
|
|
|
|
{
|
2010-10-09 22:00:00 +02:00
|
|
|
|
Sys_QueEvent( SE_KEY, K_MOUSE1 + i, false, 0, NULL );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2010-10-09 22:00:00 +02:00
|
|
|
|
|
2008-07-06 22:00:00 +02:00
|
|
|
|
in_mouse_oldbuttonstate = mstate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
===========
|
|
|
|
|
IN_Shutdown
|
|
|
|
|
===========
|
|
|
|
|
*/
|
|
|
|
|
void IN_Shutdown( void )
|
|
|
|
|
{
|
2010-06-17 22:00:00 +02:00
|
|
|
|
IN_DeactivateMouse( );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
===========
|
|
|
|
|
IN_Init
|
|
|
|
|
===========
|
|
|
|
|
*/
|
|
|
|
|
void IN_Init( void )
|
|
|
|
|
{
|
2010-06-17 22:00:00 +02:00
|
|
|
|
IN_StartupMouse( );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
==================
|
2010-10-09 22:00:00 +02:00
|
|
|
|
Host_InputFrame
|
2008-07-06 22:00:00 +02:00
|
|
|
|
|
|
|
|
|
Called every frame, even if not generating commands
|
|
|
|
|
==================
|
|
|
|
|
*/
|
2010-10-09 22:00:00 +02:00
|
|
|
|
void Host_InputFrame( void )
|
2008-07-06 22:00:00 +02:00
|
|
|
|
{
|
2010-10-26 22:00:00 +02:00
|
|
|
|
qboolean shutdownMouse = false;
|
2009-09-11 22:00:00 +02:00
|
|
|
|
|
2010-10-09 22:00:00 +02:00
|
|
|
|
rand (); // keep the random time dependent
|
|
|
|
|
|
2010-04-20 22:00:00 +02:00
|
|
|
|
if( host.state == HOST_RESTART )
|
|
|
|
|
host.state = HOST_FRAME; // restart is finished
|
|
|
|
|
|
2010-02-07 22:00:00 +01:00
|
|
|
|
if( host.type == HOST_DEDICATED )
|
|
|
|
|
{
|
|
|
|
|
// let the dedicated server some sleep
|
|
|
|
|
Sys_Sleep( 5 );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if( host.state == HOST_NOFOCUS )
|
|
|
|
|
{
|
2010-03-25 22:00:00 +01:00
|
|
|
|
if( Host_ServerState() && CL_IsInGame( ))
|
2010-02-07 22:00:00 +01:00
|
|
|
|
Sys_Sleep( 5 ); // listenserver
|
|
|
|
|
else Sys_Sleep( 20 ); // sleep 20 ms otherwise
|
|
|
|
|
}
|
|
|
|
|
else if( host.state == HOST_SLEEP )
|
|
|
|
|
{
|
|
|
|
|
// completely sleep in minimized state
|
|
|
|
|
Sys_Sleep( 20 );
|
|
|
|
|
}
|
|
|
|
|
}
|
2008-07-16 22:00:00 +02:00
|
|
|
|
|
2008-07-06 22:00:00 +02:00
|
|
|
|
if( !in_mouseinitialized )
|
|
|
|
|
return;
|
2010-10-09 22:00:00 +02:00
|
|
|
|
|
2008-07-06 22:00:00 +02:00
|
|
|
|
if( host.state != HOST_FRAME )
|
|
|
|
|
{
|
|
|
|
|
IN_DeactivateMouse();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-28 22:00:00 +02:00
|
|
|
|
if( cl.refdef.paused && cls.key_dest == key_game )
|
|
|
|
|
shutdownMouse = true; // release mouse during pause
|
2009-09-11 22:00:00 +02:00
|
|
|
|
|
|
|
|
|
if( shutdownMouse && !Cvar_VariableInteger( "fullscreen" ))
|
2008-07-06 22:00:00 +02:00
|
|
|
|
{
|
2009-09-11 22:00:00 +02:00
|
|
|
|
IN_DeactivateMouse();
|
|
|
|
|
return;
|
2008-07-06 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IN_ActivateMouse();
|
|
|
|
|
IN_MouseMove();
|
2008-08-04 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
====================
|
|
|
|
|
IN_WndProc
|
|
|
|
|
|
|
|
|
|
main window procedure
|
|
|
|
|
====================
|
|
|
|
|
*/
|
|
|
|
|
long IN_WndProc( void *hWnd, uint uMsg, uint wParam, long lParam )
|
|
|
|
|
{
|
2010-09-16 22:00:00 +02:00
|
|
|
|
int i, temp = 0;
|
2010-12-21 22:00:00 +01:00
|
|
|
|
qboolean fActivate;
|
2008-08-04 22:00:00 +02:00
|
|
|
|
|
2009-02-02 22:00:00 +01:00
|
|
|
|
if( uMsg == in_mouse_wheel )
|
|
|
|
|
uMsg = WM_MOUSEWHEEL;
|
|
|
|
|
|
2008-08-04 22:00:00 +02:00
|
|
|
|
switch( uMsg )
|
|
|
|
|
{
|
2009-02-02 22:00:00 +01:00
|
|
|
|
case WM_KILLFOCUS:
|
2010-12-27 22:00:00 +01:00
|
|
|
|
if( Cvar_VariableInteger( "fullscreen" ))
|
2009-02-02 22:00:00 +01:00
|
|
|
|
ShowWindow( host.hWnd, SW_SHOWMINNOACTIVE );
|
|
|
|
|
break;
|
2008-08-04 22:00:00 +02:00
|
|
|
|
case WM_MOUSEWHEEL:
|
2010-09-12 22:00:00 +02:00
|
|
|
|
if( !in_mouseactive ) break;
|
2010-06-17 22:00:00 +02:00
|
|
|
|
if(( short )HIWORD( wParam ) > 0 )
|
2008-08-04 22:00:00 +02:00
|
|
|
|
{
|
2010-10-09 22:00:00 +02:00
|
|
|
|
Sys_QueEvent( SE_KEY, K_MWHEELUP, true, 0, NULL );
|
|
|
|
|
Sys_QueEvent( SE_KEY, K_MWHEELUP, false, 0, NULL );
|
2008-08-04 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2010-10-09 22:00:00 +02:00
|
|
|
|
Sys_QueEvent( SE_KEY, K_MWHEELDOWN, true, 0, NULL );
|
|
|
|
|
Sys_QueEvent( SE_KEY, K_MWHEELDOWN, false, 0, NULL );
|
2008-08-04 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case WM_CREATE:
|
|
|
|
|
host.hWnd = hWnd;
|
2010-01-02 22:00:00 +01:00
|
|
|
|
GetWindowRect( host.hWnd, &real_rect );
|
2008-08-04 22:00:00 +02:00
|
|
|
|
break;
|
|
|
|
|
case WM_CLOSE:
|
|
|
|
|
Cbuf_ExecuteText( EXEC_APPEND, "quit" );
|
|
|
|
|
break;
|
|
|
|
|
case WM_ACTIVATE:
|
2010-12-21 22:00:00 +01:00
|
|
|
|
if( host.state != HOST_RESTART )
|
|
|
|
|
{
|
|
|
|
|
if( HIWORD( wParam ))
|
|
|
|
|
host.state = HOST_SLEEP;
|
|
|
|
|
else if( LOWORD( wParam ) == WA_INACTIVE )
|
|
|
|
|
host.state = HOST_NOFOCUS;
|
|
|
|
|
else host.state = HOST_FRAME;
|
|
|
|
|
fActivate = (host.state == HOST_FRAME) ? true : false;
|
|
|
|
|
}
|
|
|
|
|
else fActivate = true; // video sucessfully restarted
|
2008-08-04 22:00:00 +02:00
|
|
|
|
|
2010-10-06 22:00:00 +02:00
|
|
|
|
wnd_caption = GetSystemMetrics( SM_CYCAPTION ) + WND_BORDER;
|
2010-12-21 22:00:00 +01:00
|
|
|
|
S_Activate( fActivate, host.hWnd );
|
2008-08-04 22:00:00 +02:00
|
|
|
|
Key_ClearStates(); // FIXME!!!
|
|
|
|
|
|
2011-01-31 22:00:00 +01:00
|
|
|
|
VGui_SetBounds();
|
|
|
|
|
|
2008-08-04 22:00:00 +02:00
|
|
|
|
if( host.state == HOST_FRAME )
|
|
|
|
|
{
|
|
|
|
|
SetForegroundWindow( hWnd );
|
|
|
|
|
ShowWindow( hWnd, SW_RESTORE );
|
|
|
|
|
}
|
2010-12-27 22:00:00 +01:00
|
|
|
|
else if( Cvar_VariableInteger( "fullscreen" ) && host.state != HOST_RESTART )
|
2008-08-04 22:00:00 +02:00
|
|
|
|
{
|
|
|
|
|
ShowWindow( hWnd, SW_MINIMIZE );
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case WM_MOVE:
|
2010-12-27 22:00:00 +01:00
|
|
|
|
if( !Cvar_VariableInteger( "fullscreen" ))
|
2008-08-04 22:00:00 +02:00
|
|
|
|
{
|
2010-06-17 22:00:00 +02:00
|
|
|
|
RECT rect;
|
|
|
|
|
int xPos, yPos, style;
|
2008-08-04 22:00:00 +02:00
|
|
|
|
|
2009-10-02 22:00:00 +02:00
|
|
|
|
xPos = (short)LOWORD( lParam ); // horizontal position
|
|
|
|
|
yPos = (short)HIWORD( lParam ); // vertical position
|
2008-08-04 22:00:00 +02:00
|
|
|
|
|
2010-06-17 22:00:00 +02:00
|
|
|
|
rect.left = rect.top = 0;
|
|
|
|
|
rect.right = rect.bottom = 1;
|
2008-08-04 22:00:00 +02:00
|
|
|
|
style = GetWindowLong( hWnd, GWL_STYLE );
|
2010-06-17 22:00:00 +02:00
|
|
|
|
AdjustWindowRect( &rect, style, FALSE );
|
2008-08-04 22:00:00 +02:00
|
|
|
|
|
2010-10-31 22:00:00 +01:00
|
|
|
|
Cvar_SetFloat( "r_xpos", xPos + rect.left );
|
|
|
|
|
Cvar_SetFloat( "r_ypos", yPos + rect.top );
|
2010-01-02 22:00:00 +01:00
|
|
|
|
GetWindowRect( host.hWnd, &real_rect );
|
2011-01-31 22:00:00 +01:00
|
|
|
|
VGui_SetBounds();
|
2008-08-04 22:00:00 +02:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case WM_LBUTTONDOWN:
|
|
|
|
|
case WM_LBUTTONUP:
|
|
|
|
|
case WM_RBUTTONDOWN:
|
|
|
|
|
case WM_RBUTTONUP:
|
|
|
|
|
case WM_MBUTTONDOWN:
|
|
|
|
|
case WM_MBUTTONUP:
|
2010-09-16 22:00:00 +02:00
|
|
|
|
case WM_XBUTTONDOWN:
|
|
|
|
|
case WM_XBUTTONUP:
|
2008-08-04 22:00:00 +02:00
|
|
|
|
case WM_MOUSEMOVE:
|
2010-09-16 22:00:00 +02:00
|
|
|
|
for( i = 0; i < in_mouse_buttons; i++ )
|
|
|
|
|
{
|
|
|
|
|
if( wParam & mouse_buttons[i] )
|
|
|
|
|
temp |= (1<<i);
|
|
|
|
|
}
|
2008-08-04 22:00:00 +02:00
|
|
|
|
IN_MouseEvent( temp );
|
|
|
|
|
break;
|
|
|
|
|
case WM_SYSCOMMAND:
|
2010-06-17 22:00:00 +02:00
|
|
|
|
// never turn screensaver while Xash is active
|
2010-02-18 22:00:00 +01:00
|
|
|
|
if( wParam == SC_SCREENSAVE && host.state != HOST_SLEEP )
|
|
|
|
|
return 0;
|
2008-08-04 22:00:00 +02:00
|
|
|
|
break;
|
|
|
|
|
case WM_SYSKEYDOWN:
|
|
|
|
|
if( wParam == VK_RETURN )
|
|
|
|
|
{
|
|
|
|
|
// alt+enter fullscreen switch
|
2010-10-31 22:00:00 +01:00
|
|
|
|
Cvar_SetFloat( "fullscreen", !Cvar_VariableValue( "fullscreen" ));
|
2008-08-04 22:00:00 +02:00
|
|
|
|
Cbuf_AddText( "vid_restart\n" );
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
// intentional fallthrough
|
|
|
|
|
case WM_KEYDOWN:
|
2010-10-09 22:00:00 +02:00
|
|
|
|
Sys_QueEvent( SE_KEY, Host_MapKey( lParam ), true, 0, NULL );
|
2008-08-04 22:00:00 +02:00
|
|
|
|
break;
|
|
|
|
|
case WM_SYSKEYUP:
|
|
|
|
|
case WM_KEYUP:
|
2010-10-09 22:00:00 +02:00
|
|
|
|
Sys_QueEvent( SE_KEY, Host_MapKey( lParam ), false, 0, NULL );
|
2008-08-04 22:00:00 +02:00
|
|
|
|
break;
|
|
|
|
|
case WM_CHAR:
|
2010-10-09 22:00:00 +02:00
|
|
|
|
Sys_QueEvent( SE_CHAR, wParam, false, 0, NULL );
|
2008-08-04 22:00:00 +02:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return DefWindowProc( hWnd, uMsg, wParam, lParam );
|
2008-07-06 22:00:00 +02:00
|
|
|
|
}
|