X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=1595e798afa9ec42efceb7b436cecaa3ab7142d4;hb=0ca993946636239ea409f07df745a7dcb745dde4;hp=97a889f8066e597a7dd02c535c2bd888b44061aa;hpb=f3a0ca9464dc2f1e3ee948259f723c27fbe29dc4;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index 97a889f8..1595e798 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -20,10 +20,21 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // gl_vidnt.c -- NT GL vid component #include "quakedef.h" -#include "winquake.h" +#include +#include #include "resource.h" #include +extern void S_BlockSound (void); +extern void S_UnblockSound (void); +extern HINSTANCE global_hInstance; + + +#ifndef WM_MOUSEWHEEL +#define WM_MOUSEWHEEL 0x020A +#endif + +// Tell startup code that we have a client int cl_available = true; int (WINAPI *qwglChoosePixelFormat)(HDC, CONST PIXELFORMATDESCRIPTOR *); @@ -62,20 +73,18 @@ static dllfunction_t wglswapintervalfuncs[] = {NULL, NULL} }; -void VID_RestoreGameGamma(void); -void VID_GetSystemGamma(void); -void VID_RestoreSystemGamma(void); - -qboolean scr_skipupdate; - static DEVMODE gdevmode; static qboolean vid_initialized = false; static qboolean vid_wassuspended = false; -static int vid_usingmouse; -extern qboolean mouseactive; // from in_win.c +static qboolean vid_usingmouse = false; +static qboolean vid_usingvsync = false; +static qboolean vid_usemouse = false; +static qboolean vid_usevsync = false; static HICON hIcon; HWND mainwindow; +static HDC baseDC; +static HGLRC baseRC; //HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); @@ -114,11 +123,31 @@ static qboolean dinput; 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 */ +/* These are #ifdefed out for non-Win2K in the February 2001 version of + MS's platform SDK, but we need them for compilation. . . */ +#ifndef WM_XBUTTONDOWN + #define WM_XBUTTONDOWN 0x020B + #define WM_XBUTTONUP 0x020C +#endif +#ifndef MK_XBUTTON1 + #define MK_XBUTTON1 0x0020 + #define MK_XBUTTON2 0x0040 +// LordHavoc: lets hope this allows more buttons in the future... + #define MK_XBUTTON3 0x0080 + #define MK_XBUTTON4 0x0100 + #define MK_XBUTTON5 0x0200 + #define MK_XBUTTON6 0x0400 + #define MK_XBUTTON7 0x0800 +#endif +/* :: backslash */ + // mouse variables int mouse_buttons; int mouse_oldbuttonstate; POINT current_pos; -int mouse_x, mouse_y, old_mouse_x, old_mouse_y, mx_accum, my_accum; +int mouse_x, mouse_y, old_mouse_x, old_mouse_y; static qboolean restore_spi; static int originalmouseparms[3], newmouseparms[3] = {0, 0, 1}; @@ -233,7 +262,7 @@ static DIDATAFORMAT df = { // forward-referenced functions void IN_StartupJoystick (void); void Joy_AdvancedUpdate_f (void); -void IN_JoyMove (usercmd_t *cmd); +void IN_JoyMove (void); void IN_StartupMouse (void); /* @@ -276,14 +305,11 @@ void VID_GetWindowSize (int *x, int *y, int *width, int *height) void VID_Finish (void) { - HDC hdc; - int vid_usemouse; - if (r_render.integer && !scr_skipupdate) + vid_usevsync = vid_vsync.integer && !cls.timedemo && gl_videosyncavailable; + if (vid_usingvsync != vid_usevsync && gl_videosyncavailable) { - qglFinish(); - hdc = GetDC(mainwindow); - SwapBuffers(hdc); - ReleaseDC(mainwindow, hdc); + vid_usingvsync = vid_usevsync; + qwglSwapIntervalEXT (vid_usevsync); } // handle the mouse state when windowed if that's changed @@ -312,6 +338,13 @@ void VID_Finish (void) IN_ShowMouse(); } } + + if (r_render.integer && !vid_hidden) + { + if (r_speeds.integer || gl_finish.integer) + qglFinish(); + SwapBuffers(baseDC); + } } //========================================================================== @@ -340,7 +373,7 @@ MapKey Map from windows to quake keynums ======= */ -int MapKey (int key, int virtualkey) +static int MapKey (int key, int virtualkey) { int result; int modified = (key >> 16) & 255; @@ -415,19 +448,10 @@ ClearAllStates */ void ClearAllStates (void) { - int i; - -// send an up event for each key, to make sure the server clears them all - for (i=0 ; i<256 ; i++) - { - Key_Event (i, false); - } - Key_ClearStates (); IN_ClearStates (); } -void VID_RestoreGameGamma(void); extern qboolean host_loopactive; void AppActivate(BOOL fActive, BOOL minimize) @@ -473,8 +497,6 @@ void AppActivate(BOOL fActive, BOOL minimize) // LordHavoc: from dabb, fix for alt-tab bug in NVidia drivers MoveWindow(mainwindow,0,0,gdevmode.dmPelsWidth,gdevmode.dmPelsHeight,false); } - if (host_loopactive) - VID_RestoreGameGamma(); } if (!fActive) @@ -491,6 +513,21 @@ void AppActivate(BOOL fActive, BOOL minimize) } } +//TODO: move it around in vid_wgl.c since I dont think this is the right position +void Sys_SendKeyEvents (void) +{ + MSG msg; + + while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) + { + if (!GetMessage (&msg, NULL, 0, 0)) + Sys_Quit (); + + TranslateMessage (&msg); + DispatchMessage (&msg); + } +} + LONG CDAudio_MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); /* main window procedure */ @@ -498,6 +535,11 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LONG lRet = 1; int fActive, fMinimized, temp; + char state[256]; + char asciichar[4]; + int vkey; + qboolean down = false; + extern unsigned int uiWheelMessage; if ( uMsg == uiWheelMessage ) @@ -521,12 +563,16 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_KEYDOWN: case WM_SYSKEYDOWN: - Key_Event (MapKey(lParam, wParam), true); - break; - + down = true; case WM_KEYUP: case WM_SYSKEYUP: - Key_Event (MapKey(lParam, wParam), false); + vkey = MapKey(lParam, wParam); + GetKeyboardState (state); + // alt/ctrl/shift tend to produce funky ToAscii values, + // and if it's not a single character we don't know care about it + if (vkey == K_ALT || vkey == K_CTRL || vkey == K_SHIFT || ToAscii (wParam, lParam >> 16, state, (unsigned short *)asciichar, 0) != 1) + asciichar[0] = 0; + Key_Event (vkey, asciichar[0], down); break; case WM_SYSCHAR: @@ -541,6 +587,8 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: + case WM_XBUTTONDOWN: // backslash :: imouse explorer buttons + case WM_XBUTTONUP: // backslash :: imouse explorer buttons case WM_MOUSEMOVE: temp = 0; @@ -553,6 +601,26 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (wParam & MK_MBUTTON) temp |= 4; + /* backslash :: imouse explorer buttons */ + if (wParam & MK_XBUTTON1) + temp |= 8; + + if (wParam & MK_XBUTTON2) + temp |= 16; + /* :: backslash */ + + // LordHavoc: lets hope this allows more buttons in the future... + if (wParam & MK_XBUTTON3) + temp |= 32; + if (wParam & MK_XBUTTON4) + temp |= 64; + if (wParam & MK_XBUTTON5) + temp |= 128; + if (wParam & MK_XBUTTON6) + temp |= 256; + if (wParam & MK_XBUTTON7) + temp |= 512; + IN_MouseEvent (temp); break; @@ -562,11 +630,11 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) // Event. case WM_MOUSEWHEEL: if ((short) HIWORD(wParam) > 0) { - Key_Event(K_MWHEELUP, true); - Key_Event(K_MWHEELUP, false); + Key_Event(K_MWHEELUP, 0, true); + Key_Event(K_MWHEELUP, 0, false); } else { - Key_Event(K_MWHEELDOWN, true); - Key_Event(K_MWHEELDOWN, false); + Key_Event(K_MWHEELDOWN, 0, true); + Key_Event(K_MWHEELDOWN, 0, false); } break; @@ -607,57 +675,27 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return lRet; } - -//static int grabsysgamma = true; -WORD systemgammaramps[3][256], currentgammaramps[3][256]; - -int VID_SetGamma(float prescale, float gamma, float scale, float base) +int VID_SetGamma(unsigned short *ramps) { - int i; - HDC hdc; - hdc = GetDC (NULL); - - BuildGammaTable16(prescale, gamma, scale, base, ¤tgammaramps[0][0]); - for (i = 0;i < 256;i++) - currentgammaramps[1][i] = currentgammaramps[2][i] = currentgammaramps[0][i]; - - i = SetDeviceGammaRamp(hdc, ¤tgammaramps[0][0]); - + HDC hdc = GetDC (NULL); + int i = SetDeviceGammaRamp(hdc, ramps); ReleaseDC (NULL, hdc); return i; // return success or failure } -void VID_RestoreGameGamma(void) -{ - VID_UpdateGamma(true); -} - -void VID_GetSystemGamma(void) -{ - HDC hdc; - hdc = GetDC (NULL); - - GetDeviceGammaRamp(hdc, &systemgammaramps[0][0]); - - ReleaseDC (NULL, hdc); -} - -void VID_RestoreSystemGamma(void) +int VID_GetGamma(unsigned short *ramps) { - HDC hdc; - hdc = GetDC (NULL); - - SetDeviceGammaRamp(hdc, &systemgammaramps[0][0]); - + HDC hdc = GetDC (NULL); + int i = GetDeviceGammaRamp(hdc, ramps); ReleaseDC (NULL, hdc); + return i; // return success or failure } - static HINSTANCE gldll; int GL_OpenLibrary(const char *name) { - Con_Printf("Loading GL driver %s\n", name); + Con_Printf("Loading OpenGL driver %s\n", name); GL_CloseLibrary(); if (!(gldll = LoadLibrary(name))) { @@ -695,7 +733,7 @@ void VID_Init(void) WNDCLASS wc; InitCommonControls(); - hIcon = LoadIcon (global_hInstance, MAKEINTRESOURCE (IDI_ICON2)); + hIcon = LoadIcon (global_hInstance, MAKEINTRESOURCE (IDI_ICON1)); // Register the frame class wc.style = 0; @@ -703,7 +741,7 @@ void VID_Init(void) wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = global_hInstance; - wc.hIcon = 0; + wc.hIcon = hIcon; wc.hCursor = LoadCursor (NULL,IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = 0; @@ -715,7 +753,7 @@ void VID_Init(void) IN_Init(); } -int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) +int VID_InitMode (int fullscreen, int width, int height, int bpp) { int i; HDC hdc; @@ -744,15 +782,15 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) }; int pixelformat; DWORD WindowStyle, ExWindowStyle; - HGLRC baseRC; int CenterX, CenterY; const char *gldrivername; + int depth; if (vid_initialized) Sys_Error("VID_InitMode called when video is already initialised\n"); // if stencil is enabled, ask for alpha too - if (stencil) + if (bpp >= 32) { pfd.cStencilBits = 8; pfd.cAlphaBits = 8; @@ -764,6 +802,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) } gldrivername = "opengl32.dll"; +// COMMANDLINEOPTION: Windows WGL: -gl_driver selects a GL driver library, default is opengl32.dll, useful only for 3dfxogl.dll or 3dfxvgl.dll, if you don't know what this is for, you don't need it i = COM_CheckParm("-gl_driver"); if (i && i < com_argc - 1) gldrivername = com_argv[i + 1]; @@ -775,8 +814,6 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) memset(&gdevmode, 0, sizeof(gdevmode)); - VID_GetSystemGamma(); - vid_isfullscreen = false; if (fullscreen) { @@ -794,17 +831,24 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) vid_isfullscreen = true; WindowStyle = WS_POPUP; - ExWindowStyle = 0; + ExWindowStyle = WS_EX_TOPMOST; } else { hdc = GetDC (NULL); i = GetDeviceCaps(hdc, RASTERCAPS); + depth = GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL); ReleaseDC (NULL, hdc); if (i & RC_PALETTE) { VID_Shutdown(); - Con_Printf ("Can't run in non-RGB mode\n"); + Con_Print("Can't run in non-RGB mode\n"); + return false; + } + if (bpp > depth) + { + VID_Shutdown(); + Con_Print("A higher desktop depth is required to run this video mode\n"); return false; } @@ -857,10 +901,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) ShowWindow (mainwindow, SW_SHOWDEFAULT); UpdateWindow (mainwindow); - SendMessage (mainwindow, WM_SETICON, (WPARAM)true, (LPARAM)hIcon); - SendMessage (mainwindow, WM_SETICON, (WPARAM)false, (LPARAM)hIcon); - - VID_UpdateWindowStatus (); + VID_UpdateWindowStatus (); // now we try to make sure we get the focus on the mode switch, because // sometimes in some systems we don't. We grab the foreground, then @@ -884,41 +925,41 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) // fix the leftover Alt from any Alt-Tab or the like that switched us away ClearAllStates (); - - hdc = GetDC(mainwindow); - if ((pixelformat = ChoosePixelFormat(hdc, &pfd)) == 0) + baseDC = GetDC(mainwindow); + + if ((pixelformat = ChoosePixelFormat(baseDC, &pfd)) == 0) { VID_Shutdown(); - Con_Printf("ChoosePixelFormat(%d, %p) failed\n", hdc, &pfd); + Con_Printf("ChoosePixelFormat(%d, %p) failed\n", baseDC, &pfd); return false; } - if (SetPixelFormat(hdc, pixelformat, &pfd) == false) + if (SetPixelFormat(baseDC, pixelformat, &pfd) == false) { VID_Shutdown(); - Con_Printf("SetPixelFormat(%d, %d, %p) failed\n", hdc, pixelformat, &pfd); + Con_Printf("SetPixelFormat(%d, %d, %p) failed\n", baseDC, pixelformat, &pfd); return false; } if (!GL_CheckExtension("wgl", wglfuncs, NULL, false)) { VID_Shutdown(); - Con_Printf("wgl functions not found\n"); + Con_Print("wgl functions not found\n"); return false; } - baseRC = qwglCreateContext(hdc); + baseRC = qwglCreateContext(baseDC); if (!baseRC) { VID_Shutdown(); - Con_Printf("Could not initialize GL (wglCreateContext failed).\n\nMake sure you are in 65536 color mode, and try running -window.\n"); + Con_Print("Could not initialize GL (wglCreateContext failed).\n\nMake sure you are in 65536 color mode, and try running -window.\n"); return false; } - if (!qwglMakeCurrent(hdc, baseRC)) + if (!qwglMakeCurrent(baseDC, baseRC)) { VID_Shutdown(); - Con_Printf("wglMakeCurrent(%d, %d) failed\n", hdc, baseRC); + Con_Printf("wglMakeCurrent(%d, %d) failed\n", baseDC, baseRC); return false; } @@ -927,7 +968,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) if (qglGetString == NULL) { VID_Shutdown(); - Con_Printf("glGetString not found\n"); + Con_Print("glGetString not found\n"); return false; } gl_renderer = qglGetString(GL_RENDERER); @@ -937,11 +978,14 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) gl_platform = "WGL"; gl_platformextensions = ""; + gl_videosyncavailable = false; + if (qwglGetExtensionsStringARB) - gl_platformextensions = qwglGetExtensionsStringARB(hdc); + gl_platformextensions = qwglGetExtensionsStringARB(baseDC); - gl_videosyncavailable = GL_CheckExtension("WGL_EXT_swap_control", wglswapintervalfuncs, NULL, false); - ReleaseDC(mainwindow, hdc); +// COMMANDLINEOPTION: Windows WGL: -novideosync disables WGL_EXT_swap_control + gl_videosyncavailable = GL_CheckExtension("WGL_EXT_swap_control", wglswapintervalfuncs, "-novideosync", false); + //ReleaseDC(mainwindow, hdc); GL_Init (); @@ -956,6 +1000,8 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) //vid_menudrawfn = VID_MenuDraw; //vid_menukeyfn = VID_MenuKey; + vid_usingmouse = false; + vid_usingvsync = false; vid_hidden = false; vid_initialized = true; @@ -968,31 +1014,28 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) static void IN_Shutdown(void); void VID_Shutdown (void) { - HGLRC hRC = 0; - HDC hDC = 0; + if(vid_initialized == false) + return; + + VID_RestoreSystemGamma(); vid_initialized = false; IN_Shutdown(); - if (qwglGetCurrentContext) - hRC = qwglGetCurrentContext(); - if (qwglGetCurrentDC) - hDC = qwglGetCurrentDC(); if (qwglMakeCurrent) qwglMakeCurrent(NULL, NULL); - if (hRC && qwglDeleteContext) - qwglDeleteContext(hRC); + if (baseRC && qwglDeleteContext) + qwglDeleteContext(baseRC); // close the library before we get rid of the window GL_CloseLibrary(); - if (hDC && mainwindow) - ReleaseDC(mainwindow, hDC); - if (vid_isfullscreen) - ChangeDisplaySettings (NULL, 0); - vid_isfullscreen = false; + if (baseDC && mainwindow) + ReleaseDC(mainwindow, baseDC); AppActivate(false, false); - VID_RestoreSystemGamma(); if (mainwindow) DestroyWindow(mainwindow); mainwindow = 0; + if (vid_isfullscreen) + ChangeDisplaySettings (NULL, 0); + vid_isfullscreen = false; } @@ -1132,10 +1175,10 @@ qboolean IN_InitDInput (void) if (!hInstDI) { hInstDI = LoadLibrary("dinput.dll"); - + if (hInstDI == NULL) { - Con_SafePrintf ("Couldn't load dinput.dll\n"); + Con_Print("Couldn't load dinput.dll\n"); return false; } } @@ -1146,7 +1189,7 @@ qboolean IN_InitDInput (void) if (!pDirectInputCreate) { - Con_SafePrintf ("Couldn't get DI proc addr\n"); + Con_Print("Couldn't get DI proc addr\n"); return false; } } @@ -1164,7 +1207,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't open DI mouse device\n"); + Con_Print("Couldn't open DI mouse device\n"); return false; } @@ -1173,7 +1216,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't set DI mouse format\n"); + Con_Print("Couldn't set DI mouse format\n"); return false; } @@ -1183,7 +1226,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't set DI coop level\n"); + Con_Print("Couldn't set DI coop level\n"); return false; } @@ -1194,7 +1237,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't set DI buffersize\n"); + Con_Print("Couldn't set DI buffersize\n"); return false; } @@ -1209,22 +1252,23 @@ IN_StartupMouse */ void IN_StartupMouse (void) { - if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe")) + if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe")) return; mouseinitialized = true; +// COMMANDLINEOPTION: Windows Input: -dinput enables DirectInput for mouse/joystick input if (COM_CheckParm ("-dinput")) { dinput = IN_InitDInput (); if (dinput) { - Con_SafePrintf ("DirectInput initialized\n"); + Con_Print("DirectInput initialized\n"); } else { - Con_SafePrintf ("DirectInput not initialized\n"); + Con_Print("DirectInput not initialized\n"); } } @@ -1234,16 +1278,19 @@ void IN_StartupMouse (void) if (mouseparmsvalid) { - if ( COM_CheckParm ("-noforcemspd") ) +// COMMANDLINEOPTION: Windows GDI Input: -noforcemspd disables setting of mouse speed (not used with -dinput, windows only) + if ( COM_CheckParm ("-noforcemspd") ) newmouseparms[2] = originalmouseparms[2]; - if ( COM_CheckParm ("-noforcemaccel") ) +// COMMANDLINEOPTION: Windows GDI Input: -noforcemaccel disables setting of mouse acceleration (not used with -dinput, windows only) + if ( COM_CheckParm ("-noforcemaccel") ) { newmouseparms[0] = originalmouseparms[0]; newmouseparms[1] = originalmouseparms[1]; } - if ( COM_CheckParm ("-noforcemparms") ) +// COMMANDLINEOPTION: Windows GDI Input: -noforcemparms disables setting of mouse parameters (not used with -dinput, windows only) + if ( COM_CheckParm ("-noforcemparms") ) { newmouseparms[0] = originalmouseparms[0]; newmouseparms[1] = originalmouseparms[1]; @@ -1252,7 +1299,7 @@ void IN_StartupMouse (void) } } - mouse_buttons = 3; + mouse_buttons = 10; // if a fullscreen video mode was set before the mouse was initialized, // set the mouse state appropriately @@ -1278,16 +1325,16 @@ void IN_MouseEvent (int mstate) if ( (mstate & (1< joy_pitchthreshold.value) - { + { // if mouse invert is on, invert the joystick pitch value // only absolute control support here (joy_advanced is false) if (m_pitch.value < 0.0) @@ -1830,7 +1849,7 @@ void IN_JoyMove (usercmd_t *cmd) // user wants forward control to be forward control if (fabs(fAxisValue) > joy_forwardthreshold.value) { - cmd->forwardmove += (fAxisValue * joy_forwardsensitivity.value) * speed * cl_forwardspeed.value; + cl.cmd.forwardmove += (fAxisValue * joy_forwardsensitivity.value) * speed * cl_forwardspeed.value; } } break; @@ -1838,7 +1857,7 @@ void IN_JoyMove (usercmd_t *cmd) case AxisSide: if (fabs(fAxisValue) > joy_sidethreshold.value) { - cmd->sidemove += (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; + cl.cmd.sidemove += (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; } break; @@ -1848,7 +1867,7 @@ void IN_JoyMove (usercmd_t *cmd) // user wants turn control to become side control if (fabs(fAxisValue) > joy_sidethreshold.value) { - cmd->sidemove -= (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; + cl.cmd.sidemove -= (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; } } else