From: havoc Date: Mon, 9 May 2005 15:56:41 +0000 (+0000) Subject: major cleanup of input code - CL_Move replaces most of IN_Move, IN_Commands, many... X-Git-Tag: xonotic-v0.1.0preview~4923 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=df8727697622029dd7a03047999ffc19b49e44ea;p=xonotic%2Fdarkplaces.git major cleanup of input code - CL_Move replaces most of IN_Move, IN_Commands, many internal platform functions refactored to clean up platform code git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@5256 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/cl_input.c b/cl_input.c index 9f929550..6d138662 100644 --- a/cl_input.c +++ b/cl_input.c @@ -261,6 +261,11 @@ cvar_t cl_movement_accelerate = {0, "cl_movement_accelerate", "10"}; cvar_t cl_gravity = {0, "cl_gravity", "800"}; cvar_t cl_slowmo = {0, "cl_slowmo", "1"}; +cvar_t in_pitch_min = {0, "in_pitch_min", "-90"}; // quake used -70 +cvar_t in_pitch_max = {0, "in_pitch_max", "90"}; // quake used 80 + +cvar_t m_filter = {CVAR_SAVE, "m_filter","0"}; + /* ================ @@ -316,19 +321,21 @@ void CL_AdjustAngles (void) /* ================ -CL_BaseMove +CL_Move Send the intended movement message to the server ================ */ -void CL_BaseMove (void) +void CL_Move (void) { vec3_t temp; - if (cls.signon != SIGNONS) - return; + float mx, my; + static float old_mouse_x = 0, old_mouse_y = 0; + // clamp before the move to prevent starting with bad angles CL_AdjustAngles (); + // get basic movement from keyboard // PRYDON_CLIENTCURSOR needs to survive basemove resets VectorCopy (cl.cmd.cursor_screen, temp); memset (&cl.cmd, 0, sizeof(cl.cmd)); @@ -352,17 +359,72 @@ void CL_BaseMove (void) cl.cmd.forwardmove -= cl_backspeed.value * CL_KeyState (&in_back); } -// -// adjust for speed key -// + // adjust for speed key if (in_speed.state & 1) { cl.cmd.forwardmove *= cl_movespeedkey.value; cl.cmd.sidemove *= cl_movespeedkey.value; cl.cmd.upmove *= cl_movespeedkey.value; } -} + in_mouse_x = 0; + in_mouse_y = 0; + + // allow mice or other external controllers to add to the move + IN_Move (); + + // apply m_filter if it is on + mx = in_mouse_x; + my = in_mouse_y; + if (m_filter.integer) + { + in_mouse_x = (mx + old_mouse_x) * 0.5; + in_mouse_y = (my + old_mouse_y) * 0.5; + } + old_mouse_x = mx; + old_mouse_y = my; + + // if not in menu, apply mouse move to viewangles/movement + if (in_client_mouse) + { + if (cl_prydoncursor.integer) + { + // mouse interacting with the scene, mostly stationary view + V_StopPitchDrift(); + cl.cmd.cursor_screen[0] += in_mouse_x * sensitivity.value / vid.realwidth; + cl.cmd.cursor_screen[1] += in_mouse_y * sensitivity.value / vid.realheight; + } + else if (in_strafe.state & 1) + { + // strafing mode, all looking is movement + V_StopPitchDrift(); + cl.cmd.sidemove += m_side.value * in_mouse_x * sensitivity.value * cl.viewzoom; + if (noclip_anglehack) + cl.cmd.upmove -= m_forward.value * in_mouse_y * sensitivity.value * cl.viewzoom; + else + cl.cmd.forwardmove -= m_forward.value * in_mouse_y * sensitivity.value * cl.viewzoom; + } + else if ((in_mlook.state & 1) || freelook.integer) + { + // mouselook, lookstrafe causes turning to become strafing + V_StopPitchDrift(); + if (lookstrafe.integer) + cl.cmd.sidemove += m_side.value * in_mouse_x * sensitivity.value * cl.viewzoom; + else + cl.viewangles[YAW] -= m_yaw.value * in_mouse_x * sensitivity.value * cl.viewzoom; + cl.viewangles[PITCH] += m_pitch.value * in_mouse_y * sensitivity.value * cl.viewzoom; + } + else + { + // non-mouselook, yaw turning and forward/back movement + cl.viewangles[YAW] -= m_yaw.value * in_mouse_x * sensitivity.value * cl.viewzoom; + cl.cmd.forwardmove -= m_forward.value * in_mouse_y * sensitivity.value * cl.viewzoom; + } + } + + // clamp after the move to prevent rendering with bad angles + CL_AdjustAngles (); +} #include "cl_collision.h" @@ -917,5 +979,9 @@ void CL_InitInput (void) Cvar_RegisterVariable(&cl_movement_accelerate); Cvar_RegisterVariable(&cl_gravity); Cvar_RegisterVariable(&cl_slowmo); + + Cvar_RegisterVariable(&in_pitch_min); + Cvar_RegisterVariable(&in_pitch_max); + Cvar_RegisterVariable(&m_filter); } diff --git a/client.h b/client.h index a5e9f2c2..ce6a0c36 100644 --- a/client.h +++ b/client.h @@ -735,7 +735,7 @@ void CL_ExpandEntities(int num); int CL_ReadFromServer (void); void CL_WriteToServer (void); -void CL_BaseMove (void); +void CL_Move (void); float CL_KeyState (kbutton_t *key); diff --git a/host.c b/host.c index 082e343b..0300386c 100644 --- a/host.c +++ b/host.c @@ -742,11 +742,8 @@ void _Host_Frame (float time) // get new key events Sys_SendKeyEvents(); - // allow mice or other external controllers to add commands - IN_Commands(); - // Collect input into cmd - IN_ProcessMove(); + CL_Move(); // process console commands Cbuf_Execute(); diff --git a/input.h b/input.h index 8572a950..58d256f9 100644 --- a/input.h +++ b/input.h @@ -8,7 +8,7 @@ of the License, or (at your option) any later version. This program 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. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -30,22 +30,8 @@ extern float in_mouse_x, in_mouse_y; //enum {input_game,input_message,input_menu} input_dest; -void IN_Commands (void); -// oportunity for devices to stick commands on the script buffer - -// AK added to allow mouse movement for the menu -void IN_ProcessMove(void); - void IN_Move (void); // add additional movement on top of the keyboard move cmd -void IN_PreMove(void); -void IN_PostMove(void); - -void IN_Mouse(float mx, float my); - -void IN_ClearStates (void); -// restores all button and position states to defaults - #endif diff --git a/prvm_cmds.c b/prvm_cmds.c index 82006d38..a326cd46 100644 --- a/prvm_cmds.c +++ b/prvm_cmds.c @@ -2252,8 +2252,8 @@ void VM_getmousepos(void) VM_SAFEPARMCOUNT(0,VM_getmousepos); - PRVM_G_VECTOR(OFS_RETURN)[0] = in_mouse_x; - PRVM_G_VECTOR(OFS_RETURN)[1] = in_mouse_y; + PRVM_G_VECTOR(OFS_RETURN)[0] = in_mouse_x * vid.conwidth / vid.realwidth; + PRVM_G_VECTOR(OFS_RETURN)[1] = in_mouse_y * vid.conheight / vid.realheight; PRVM_G_VECTOR(OFS_RETURN)[2] = 0; } @@ -3145,8 +3145,8 @@ void VM_altstr_ins(void) in = instr = PRVM_G_STRING( OFS_PARM0 ); num = PRVM_G_FLOAT( OFS_PARM1 ); set = setstr = PRVM_G_STRING( OFS_PARM2 ); - - out = outstr = VM_GetTempString(); + + out = outstr = VM_GetTempString(); for( num = num * 2 + 2 ; *in && num > 0 ; *out++ = *in++ ) if( *in == '\\' && !*++in ) break; diff --git a/vid_glx.c b/vid_glx.c index fbbb5b08..48ab6c82 100644 --- a/vid_glx.c +++ b/vid_glx.c @@ -87,7 +87,6 @@ Atom wm_delete_window_atom; static qboolean mouse_avail = true; -static qboolean mouse_active = false; static qboolean vid_usingmouse = false; static qboolean vid_usemouse = false; static qboolean vid_usingvsync = false; @@ -248,67 +247,75 @@ static Cursor CreateNullCursor(Display *display, Window root) return cursor; } -static void install_grabs(void) +static void IN_Activate (qboolean grab) { - XWindowAttributes attribs_1; - XSetWindowAttributes attribs_2; + if (!mouse_avail || !vidx11_display || !win) + return; + + if (grab) + { + if (!vid_usingmouse) + { + XWindowAttributes attribs_1; + XSetWindowAttributes attribs_2; - XGetWindowAttributes(vidx11_display, win, &attribs_1); - attribs_2.event_mask = attribs_1.your_event_mask | KEY_MASK | MOUSE_MASK; - XChangeWindowAttributes(vidx11_display, win, CWEventMask, &attribs_2); + XGetWindowAttributes(vidx11_display, win, &attribs_1); + attribs_2.event_mask = attribs_1.your_event_mask | KEY_MASK | MOUSE_MASK; + XChangeWindowAttributes(vidx11_display, win, CWEventMask, &attribs_2); -// inviso cursor - XDefineCursor(vidx11_display, win, CreateNullCursor(vidx11_display, win)); + // inviso cursor + XDefineCursor(vidx11_display, win, CreateNullCursor(vidx11_display, win)); - XGrabPointer(vidx11_display, win, True, 0, GrabModeAsync, GrabModeAsync, win, None, CurrentTime); + XGrabPointer(vidx11_display, win, True, 0, GrabModeAsync, GrabModeAsync, win, None, CurrentTime); #ifndef __APPLE__ - if (vid_dga.integer) - { - int MajorVersion, MinorVersion; + if (vid_dga.integer) + { + int MajorVersion, MinorVersion; - if (!XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion)) - { - // unable to query, probalby not supported - Con_Print( "Failed to detect XF86DGA Mouse\n" ); - vid_dga.integer = 0; - } - else - { - vid_dga.integer = 1; - XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), XF86DGADirectMouse); - XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, 0, 0); - } - } - else + if (!XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion)) + { + // unable to query, probably not supported + Con_Print( "Failed to detect XF86DGA Mouse\n" ); + Cvar_SetValueQuick(&vid_dga, 0); + XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, scr_width / 2, scr_height / 2); + } + else + { + XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), XF86DGADirectMouse); + XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, 0, 0); + } + } + else #endif - XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, scr_width / 2, scr_height / 2); - - XGrabKeyboard(vidx11_display, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); + XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, scr_width / 2, scr_height / 2); - mouse_active = true; - mouse_x = mouse_y = 0; - ignoremousemove = true; -} - -static void uninstall_grabs(void) -{ - if (!vidx11_display || !win) - return; + XGrabKeyboard(vidx11_display, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); + mouse_x = mouse_y = 0; + ignoremousemove = true; + vid_usingmouse = true; + } + } + else + { + if (vid_usingmouse) + { #ifndef __APPLE__ - if (vid_dga.integer == 1) - XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), 0); + if (vid_dga.integer == 1) + XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), 0); #endif - XUngrabPointer(vidx11_display, CurrentTime); - XUngrabKeyboard(vidx11_display, CurrentTime); + XUngrabPointer(vidx11_display, CurrentTime); + XUngrabKeyboard(vidx11_display, CurrentTime); -// inviso cursor - XUndefineCursor(vidx11_display, win); + // inviso cursor + XUndefineCursor(vidx11_display, win); - mouse_active = false; - ignoremousemove = true; + ignoremousemove = true; + vid_usingmouse = false; + } + } } static void HandleEvents(void) @@ -527,30 +534,6 @@ static void HandleEvents(void) } } -static void IN_DeactivateMouse( void ) -{ - if (!mouse_avail || !vidx11_display || !win) - return; - - if (mouse_active) - { - uninstall_grabs(); - mouse_active = false; - } -} - -static void IN_ActivateMouse( void ) -{ - if (!mouse_avail || !vidx11_display || !win) - return; - - if (!mouse_active) - { - install_grabs(); - mouse_active = true; - } -} - static void *prjobj = NULL; static void GL_CloseLibrary(void) @@ -598,7 +581,7 @@ void VID_Shutdown(void) if (vidx11_display) { VID_RestoreSystemGamma(); - uninstall_grabs(); + IN_Activate(false); // FIXME: glXDestroyContext here? if (vid_isfullscreen) @@ -668,22 +651,7 @@ void VID_Finish (void) vid_usemouse = false; if (vid_isfullscreen) vid_usemouse = true; - if (vid_usemouse) - { - if (!vid_usingmouse) - { - vid_usingmouse = true; - IN_ActivateMouse (); - } - } - else - { - if (vid_usingmouse) - { - vid_usingmouse = false; - IN_DeactivateMouse (); - } - } + IN_Activate(vid_usemouse); if (r_render.integer) { @@ -930,19 +898,13 @@ void Sys_SendKeyEvents(void) HandleEvents(); } -/* -=========== -IN_Commands -=========== -*/ -void IN_Commands (void) -{ -} - void IN_Move (void) { if (mouse_avail) - IN_Mouse(mouse_x, mouse_y); + { + in_mouse_x = mouse_x; + in_mouse_y = mouse_y; + } mouse_x = 0; mouse_y = 0; } diff --git a/vid_null.c b/vid_null.c index 0b3f0c27..a4c2f46b 100644 --- a/vid_null.c +++ b/vid_null.c @@ -89,10 +89,6 @@ void Sys_SendKeyEvents(void) { } -void IN_Commands(void) -{ -} - void IN_Move(void) { } diff --git a/vid_sdl.c b/vid_sdl.c index 196fe4f4..1aee0c8b 100644 --- a/vid_sdl.c +++ b/vid_sdl.c @@ -202,38 +202,37 @@ static int MapKey( unsigned int sdlkey ) return tbl_sdltoquake[ sdlkey ]; } -static void IN_Activate( void ) +static void IN_Activate( qboolean grab ) { - SDL_WM_GrabInput( SDL_GRAB_ON ); - SDL_ShowCursor( SDL_DISABLE ); -} - -static void IN_Deactivate( void ) -{ - SDL_WM_GrabInput( SDL_GRAB_OFF ); - SDL_ShowCursor( SDL_ENABLE ); -} - -void IN_Commands (void) -{ -} - -static void IN_MouseMove (void) -{ - int x, y; - - if( !vid_usingmouse ) { - IN_Mouse( 0, 0 ); - return; + if (grab) + { + if (!vid_usingmouse) + { + vid_usingmouse = true; + SDL_WM_GrabInput( SDL_GRAB_ON ); + SDL_ShowCursor( SDL_DISABLE ); + } + } + else + { + if (vid_usingmouse) + { + vid_usingmouse = false; + SDL_WM_GrabInput( SDL_GRAB_OFF ); + SDL_ShowCursor( SDL_ENABLE ); + } } - - SDL_GetRelativeMouseState( &x, &y ); - IN_Mouse( x, y ); } void IN_Move( void ) { - IN_MouseMove(); + if( vid_usingmouse ) + { + int x, y; + SDL_GetRelativeMouseState( &x, &y ); + in_mouse_x = x; + in_mouse_y = y; + } } static void IN_Init( void ) @@ -507,11 +506,5 @@ void VID_Finish (void) if( !vid_activewindow ) vid_usemouse = false; - if( vid_usemouse && !vid_usingmouse ) { - vid_usingmouse = true; - IN_Activate(); - } else if( !vid_usemouse && vid_usingmouse ) { - vid_usingmouse = false; - IN_Deactivate(); - } + IN_Activate(vid_usemouse); } diff --git a/vid_shared.c b/vid_shared.c index 849313b8..64881951 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -73,11 +73,6 @@ cvar_t vid_mouse = {CVAR_SAVE, "vid_mouse", "1"}; cvar_t gl_combine = {CVAR_SAVE, "gl_combine", "1"}; cvar_t gl_finish = {0, "gl_finish", "0"}; -cvar_t in_pitch_min = {0, "in_pitch_min", "-90"}; // quake used -70 -cvar_t in_pitch_max = {0, "in_pitch_max", "90"}; // quake used 80 - -cvar_t m_filter = {CVAR_SAVE, "m_filter","0"}; - cvar_t v_gamma = {CVAR_SAVE, "v_gamma", "1"}; cvar_t v_contrast = {CVAR_SAVE, "v_contrast", "1"}; cvar_t v_brightness = {CVAR_SAVE, "v_brightness", "0"}; @@ -723,98 +718,6 @@ void Force_CenterView_f (void) cl.viewangles[PITCH] = 0; } -void IN_PreMove(void) -{ -} - -void CL_AdjustAngles(void); -void IN_PostMove(void) -{ - // clamp after the move as well to prevent messed up rendering angles - CL_AdjustAngles(); -} - -/* -=========== -IN_DoMove -=========== -*/ -void IN_ProcessMove(void) -{ - // get basic movement from keyboard - CL_BaseMove(); - - // OS independent code - IN_PreMove(); - - // allow mice or other external controllers to add to the move - IN_Move(); - - // OS independent code - IN_PostMove(); -} - - -void IN_Mouse(float mx, float my) -{ - int mouselook = (in_mlook.state & 1) || freelook.integer; - float mouse_x, mouse_y; - static float old_mouse_x = 0, old_mouse_y = 0; - - if (m_filter.integer) - { - mouse_x = (mx + old_mouse_x) * 0.5; - mouse_y = (my + old_mouse_y) * 0.5; - } - else - { - mouse_x = mx; - mouse_y = my; - } - - old_mouse_x = mx; - old_mouse_y = my; - - in_mouse_x = (float) mouse_x * vid.conwidth / vid.realwidth; - in_mouse_y = (float) mouse_y * vid.conheight / vid.realheight; - - // AK: eveything else is client stuff - // BTW, this should be seperated somewhen - if(!in_client_mouse) - return; - - if (cl_prydoncursor.integer) - { - cl.cmd.cursor_screen[0] += mouse_x * sensitivity.value / vid.realwidth; - cl.cmd.cursor_screen[1] += mouse_y * sensitivity.value / vid.realheight; - V_StopPitchDrift(); - return; - } - - // LordHavoc: viewzoom affects mouse sensitivity for sniping - mouse_x *= sensitivity.value * cl.viewzoom; - mouse_y *= sensitivity.value * cl.viewzoom; - - // Add mouse X/Y movement to cmd - if ((in_strafe.state & 1) || (lookstrafe.integer && mouselook)) - cl.cmd.sidemove += m_side.value * mouse_x; - else - cl.viewangles[YAW] -= m_yaw.value * mouse_x; - - if (mouselook) - V_StopPitchDrift(); - - if (mouselook && !(in_strafe.state & 1)) - cl.viewangles[PITCH] += m_pitch.value * mouse_y; - else - { - if ((in_strafe.state & 1) && noclip_anglehack) - cl.cmd.upmove -= m_forward.value * mouse_y; - else - cl.cmd.forwardmove -= m_forward.value * mouse_y; - } -} - static float cachegamma, cachebrightness, cachecontrast, cacheblack[3], cachegrey[3], cachewhite[3]; static int cachecolorenable, cachehwgamma; #define BOUNDCVAR(cvar, m1, m2) c = &(cvar);f = bound(m1, c->value, m2);if (c->value != f) Cvar_SetValueQuick(c, f); @@ -978,9 +881,6 @@ void VID_Shared_Init(void) Cvar_RegisterVariable(&vid_mouse); Cvar_RegisterVariable(&gl_combine); Cvar_RegisterVariable(&gl_finish); - Cvar_RegisterVariable(&in_pitch_min); - Cvar_RegisterVariable(&in_pitch_max); - Cvar_RegisterVariable(&m_filter); Cmd_AddCommand("force_centerview", Force_CenterView_f); Cmd_AddCommand("vid_restart", VID_Restart_f); if (gamemode == GAME_GOODVSBAD2) diff --git a/vid_wgl.c b/vid_wgl.c index 46589db6..7c415bba 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -37,19 +37,19 @@ extern HINSTANCE global_hInstance; // Tell startup code that we have a client int cl_available = true; -int (WINAPI *qwglChoosePixelFormat)(HDC, CONST PIXELFORMATDESCRIPTOR *); -int (WINAPI *qwglDescribePixelFormat)(HDC, int, UINT, LPPIXELFORMATDESCRIPTOR); -//int (WINAPI *qwglGetPixelFormat)(HDC); -BOOL (WINAPI *qwglSetPixelFormat)(HDC, int, CONST PIXELFORMATDESCRIPTOR *); -BOOL (WINAPI *qwglSwapBuffers)(HDC); -HGLRC (WINAPI *qwglCreateContext)(HDC); -BOOL (WINAPI *qwglDeleteContext)(HGLRC); -HGLRC (WINAPI *qwglGetCurrentContext)(VOID); -HDC (WINAPI *qwglGetCurrentDC)(VOID); -PROC (WINAPI *qwglGetProcAddress)(LPCSTR); -BOOL (WINAPI *qwglMakeCurrent)(HDC, HGLRC); -BOOL (WINAPI *qwglSwapIntervalEXT)(int interval); -const char *(WINAPI *qwglGetExtensionsStringARB)(HDC hdc); +static int (WINAPI *qwglChoosePixelFormat)(HDC, CONST PIXELFORMATDESCRIPTOR *); +static int (WINAPI *qwglDescribePixelFormat)(HDC, int, UINT, LPPIXELFORMATDESCRIPTOR); +//static int (WINAPI *qwglGetPixelFormat)(HDC); +static BOOL (WINAPI *qwglSetPixelFormat)(HDC, int, CONST PIXELFORMATDESCRIPTOR *); +static BOOL (WINAPI *qwglSwapBuffers)(HDC); +static HGLRC (WINAPI *qwglCreateContext)(HDC); +static BOOL (WINAPI *qwglDeleteContext)(HGLRC); +static HGLRC (WINAPI *qwglGetCurrentContext)(VOID); +static HDC (WINAPI *qwglGetCurrentDC)(VOID); +static PROC (WINAPI *qwglGetProcAddress)(LPCSTR); +static BOOL (WINAPI *qwglMakeCurrent)(HDC, HGLRC); +static BOOL (WINAPI *qwglSwapIntervalEXT)(int interval); +static const char *(WINAPI *qwglGetExtensionsStringARB)(HDC hdc); static dllfunction_t wglfuncs[] = { @@ -82,7 +82,9 @@ static qboolean vid_usemouse = false; static qboolean vid_usevsync = false; static HICON hIcon; +// used by cd_win.c and snd_win.c HWND mainwindow; + static HDC baseDC; static HGLRC baseRC; @@ -100,17 +102,12 @@ static qboolean vid_isfullscreen; //==================================== -int window_x, window_y, window_width, window_height; -int window_center_x, window_center_y; +static int window_x, window_y, window_width, window_height; +static int window_center_x, window_center_y; -void IN_ShowMouse (void); -void IN_DeactivateMouse (void); -void IN_HideMouse (void); -void IN_ActivateMouse (void); -void IN_MouseEvent (int mstate); -void IN_UpdateClipCursor (void); +static void IN_Activate (qboolean grab); -qboolean mouseinitialized; +static qboolean mouseinitialized; static qboolean dinput; // input code @@ -120,8 +117,7 @@ static qboolean dinput; #define DINPUT_BUFFERSIZE 16 #define iDirectInputCreate(a,b,c,d) pDirectInputCreate(a,b,c,d) -HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, - LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter); +static HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter); // LordHavoc: thanks to backslash for this support for mouse buttons 4 and 5 /* backslash :: imouse explorer buttons */ @@ -144,19 +140,14 @@ HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, /* :: backslash */ // mouse variables -int mouse_buttons; -int mouse_oldbuttonstate; -POINT current_pos; -int mouse_x, mouse_y, old_mouse_x, old_mouse_y; +static int mouse_buttons; +static int mouse_oldbuttonstate; static qboolean restore_spi; static int originalmouseparms[3], newmouseparms[3] = {0, 0, 1}; -unsigned int uiWheelMessage; -qboolean mouseactive; -//qboolean mouseinitialized; +static unsigned int uiWheelMessage; static qboolean mouseparmsvalid, mouseactivatetoggle; -static qboolean mouseshowtoggle = 1; static qboolean dinput_acquired; static unsigned int mstate_di; @@ -178,46 +169,46 @@ enum _ControlList AxisNada = 0, AxisForward, AxisLook, AxisSide, AxisTurn }; -DWORD dwAxisFlags[JOY_MAX_AXES] = +static DWORD dwAxisFlags[JOY_MAX_AXES] = { JOY_RETURNX, JOY_RETURNY, JOY_RETURNZ, JOY_RETURNR, JOY_RETURNU, JOY_RETURNV }; -DWORD dwAxisMap[JOY_MAX_AXES]; -DWORD dwControlMap[JOY_MAX_AXES]; -PDWORD pdwRawValue[JOY_MAX_AXES]; +static DWORD dwAxisMap[JOY_MAX_AXES]; +static DWORD dwControlMap[JOY_MAX_AXES]; +static PDWORD pdwRawValue[JOY_MAX_AXES]; // none of these cvars are saved over a session // this means that advanced controller configuration needs to be executed // each time. this avoids any problems with getting back to a default usage // or when changing from one controller to another. this way at least something // works. -cvar_t in_joystick = {CVAR_SAVE, "joystick","0"}; -cvar_t joy_name = {0, "joyname", "joystick"}; -cvar_t joy_advanced = {0, "joyadvanced", "0"}; -cvar_t joy_advaxisx = {0, "joyadvaxisx", "0"}; -cvar_t joy_advaxisy = {0, "joyadvaxisy", "0"}; -cvar_t joy_advaxisz = {0, "joyadvaxisz", "0"}; -cvar_t joy_advaxisr = {0, "joyadvaxisr", "0"}; -cvar_t joy_advaxisu = {0, "joyadvaxisu", "0"}; -cvar_t joy_advaxisv = {0, "joyadvaxisv", "0"}; -cvar_t joy_forwardthreshold = {0, "joyforwardthreshold", "0.15"}; -cvar_t joy_sidethreshold = {0, "joysidethreshold", "0.15"}; -cvar_t joy_pitchthreshold = {0, "joypitchthreshold", "0.15"}; -cvar_t joy_yawthreshold = {0, "joyyawthreshold", "0.15"}; -cvar_t joy_forwardsensitivity = {0, "joyforwardsensitivity", "-1.0"}; -cvar_t joy_sidesensitivity = {0, "joysidesensitivity", "-1.0"}; -cvar_t joy_pitchsensitivity = {0, "joypitchsensitivity", "1.0"}; -cvar_t joy_yawsensitivity = {0, "joyyawsensitivity", "-1.0"}; -cvar_t joy_wwhack1 = {0, "joywwhack1", "0.0"}; -cvar_t joy_wwhack2 = {0, "joywwhack2", "0.0"}; - -qboolean joy_avail, joy_advancedinit, joy_haspov; -DWORD joy_oldbuttonstate, joy_oldpovstate; - -int joy_id; -DWORD joy_flags; -DWORD joy_numbuttons; +static cvar_t in_joystick = {CVAR_SAVE, "joystick","0"}; +static cvar_t joy_name = {0, "joyname", "joystick"}; +static cvar_t joy_advanced = {0, "joyadvanced", "0"}; +static cvar_t joy_advaxisx = {0, "joyadvaxisx", "0"}; +static cvar_t joy_advaxisy = {0, "joyadvaxisy", "0"}; +static cvar_t joy_advaxisz = {0, "joyadvaxisz", "0"}; +static cvar_t joy_advaxisr = {0, "joyadvaxisr", "0"}; +static cvar_t joy_advaxisu = {0, "joyadvaxisu", "0"}; +static cvar_t joy_advaxisv = {0, "joyadvaxisv", "0"}; +static cvar_t joy_forwardthreshold = {0, "joyforwardthreshold", "0.15"}; +static cvar_t joy_sidethreshold = {0, "joysidethreshold", "0.15"}; +static cvar_t joy_pitchthreshold = {0, "joypitchthreshold", "0.15"}; +static cvar_t joy_yawthreshold = {0, "joyyawthreshold", "0.15"}; +static cvar_t joy_forwardsensitivity = {0, "joyforwardsensitivity", "-1.0"}; +static cvar_t joy_sidesensitivity = {0, "joysidesensitivity", "-1.0"}; +static cvar_t joy_pitchsensitivity = {0, "joypitchsensitivity", "1.0"}; +static cvar_t joy_yawsensitivity = {0, "joyyawsensitivity", "-1.0"}; +static cvar_t joy_wwhack1 = {0, "joywwhack1", "0.0"}; +static cvar_t joy_wwhack2 = {0, "joywwhack2", "0.0"}; + +static qboolean joy_avail, joy_advancedinit, joy_haspov; +static DWORD joy_oldbuttonstate, joy_oldpovstate; + +static int joy_id; +static DWORD joy_flags; +static DWORD joy_numbuttons; static LPDIRECTINPUT g_pdi; static LPDIRECTINPUTDEVICE g_pMouse; @@ -260,22 +251,22 @@ static DIDATAFORMAT df = { }; // forward-referenced functions -void IN_StartupJoystick (void); -void Joy_AdvancedUpdate_f (void); -void IN_JoyMove (void); -void IN_StartupMouse (void); +static void IN_StartupJoystick (void); +static void Joy_AdvancedUpdate_f (void); +static void IN_JoyMove (void); +static void IN_StartupMouse (void); /* ================ VID_UpdateWindowStatus ================ */ -void VID_UpdateWindowStatus (void) +static void VID_UpdateWindowStatus (void) { window_center_x = window_x + window_width / 2; window_center_y = window_y + window_height / 2; - if (mouseinitialized && mouseactive && !dinput) + if (mouseinitialized && vid_usingmouse && !dinput_acquired) { RECT window_rect; window_rect.left = window_x; @@ -325,8 +316,7 @@ void VID_Finish (void) if (!vid_usingmouse) { vid_usingmouse = true; - IN_ActivateMouse (); - IN_HideMouse(); + IN_Activate (true); } } else @@ -334,8 +324,7 @@ void VID_Finish (void) if (vid_usingmouse) { vid_usingmouse = false; - IN_DeactivateMouse (); - IN_ShowMouse(); + IN_Activate (false); } } @@ -352,7 +341,7 @@ void VID_Finish (void) -qbyte scantokey[128] = +static qbyte scantokey[128] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 ,27 ,'1' ,'2' ,'3' ,'4' ,'5' ,'6' ,'7' ,'8' ,'9' ,'0' ,'-' ,'=' ,K_BACKSPACE,9 ,//0 @@ -446,10 +435,11 @@ MAIN WINDOW ClearAllStates ================ */ -void ClearAllStates (void) +static void ClearAllStates (void) { Key_ClearStates (); - IN_ClearStates (); + if (vid_usingmouse) + mouse_oldbuttonstate = 0; } void AppActivate(BOOL fActive, BOOL minimize) @@ -500,8 +490,7 @@ void AppActivate(BOOL fActive, BOOL minimize) if (!fActive) { vid_usingmouse = false; - IN_DeactivateMouse (); - IN_ShowMouse (); + IN_Activate (false); if (vid_isfullscreen) { ChangeDisplaySettings (NULL, 0); @@ -538,8 +527,6 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) int vkey; qboolean down = false; - extern unsigned int uiWheelMessage; - if ( uMsg == uiWheelMessage ) uMsg = WM_MOUSEWHEEL; @@ -619,7 +606,15 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (wParam & MK_XBUTTON7) temp |= 512; - IN_MouseEvent (temp); + if (vid_usingmouse && !dinput_acquired) + { + // perform button actions + int i; + for (i=0 ; i