*/
// gl_vidnt.c -- NT GL vid component
+// we don't need a very new dinput
+#define DIRECTINPUT_VERSION 0x0300
+
#include "quakedef.h"
#include <windows.h>
+#include <mmsystem.h>
#include <dsound.h>
#include "resource.h"
#include <commctrl.h>
+#include <dinput.h>
extern void S_BlockSound (void);
extern void S_UnblockSound (void);
// 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);
+qboolean vid_supportrefreshrate = true;
+
+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[] =
{
{NULL, NULL}
};
-qboolean scr_skipupdate;
-
static DEVMODE gdevmode;
static qboolean vid_initialized = false;
static qboolean vid_wassuspended = false;
-static int vid_usingmouse;
+static qboolean vid_usingmouse = false;
+static qboolean vid_usingvsync = 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;
//HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow);
-static int vid_isfullscreen;
+static qboolean vid_isfullscreen;
//void VID_MenuDraw (void);
//void VID_MenuKey (int key);
//====================================
-int window_x, window_y, window_width, window_height;
-int window_center_x, window_center_y;
+static int window_x, window_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
-#include <dinput.h>
-
#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 */
/* :: 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};
+static int originalmouseparms[3], newmouseparms[3] = {0, 0, 0};
-unsigned int uiWheelMessage;
-qboolean mouseactive;
-//qboolean mouseinitialized;
-static qboolean mouseparmsvalid, mouseactivatetoggle;
-static qboolean mouseshowtoggle = 1;
+static unsigned int uiWheelMessage;
+static qboolean mouseparmsvalid;
static qboolean dinput_acquired;
static unsigned int mstate_di;
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", "enables joysticks"};
+static cvar_t joy_name = {0, "joyname", "joystick", "name of joystick to use (informational only, used only by joyadvanced 1 mode)"};
+static cvar_t joy_advanced = {0, "joyadvanced", "0", "use more than 2 axis joysticks (configuring this is very technical)"};
+static cvar_t joy_advaxisx = {0, "joyadvaxisx", "0", "axis mapping for joyadvanced 1 mode"};
+static cvar_t joy_advaxisy = {0, "joyadvaxisy", "0", "axis mapping for joyadvanced 1 mode"};
+static cvar_t joy_advaxisz = {0, "joyadvaxisz", "0", "axis mapping for joyadvanced 1 mode"};
+static cvar_t joy_advaxisr = {0, "joyadvaxisr", "0", "axis mapping for joyadvanced 1 mode"};
+static cvar_t joy_advaxisu = {0, "joyadvaxisu", "0", "axis mapping for joyadvanced 1 mode"};
+static cvar_t joy_advaxisv = {0, "joyadvaxisv", "0", "axis mapping for joyadvanced 1 mode"};
+static cvar_t joy_forwardthreshold = {0, "joyforwardthreshold", "0.15", "minimum joystick movement necessary to move forward"};
+static cvar_t joy_sidethreshold = {0, "joysidethreshold", "0.15", "minimum joystick movement necessary to move sideways (strafing)"};
+static cvar_t joy_pitchthreshold = {0, "joypitchthreshold", "0.15", "minimum joystick movement necessary to look up/down"};
+static cvar_t joy_yawthreshold = {0, "joyyawthreshold", "0.15", "minimum joystick movement necessary to turn left/right"};
+static cvar_t joy_forwardsensitivity = {0, "joyforwardsensitivity", "-1.0", "how fast the joystick moves forward"};
+static cvar_t joy_sidesensitivity = {0, "joysidesensitivity", "-1.0", "how fast the joystick moves sideways (strafing)"};
+static cvar_t joy_pitchsensitivity = {0, "joypitchsensitivity", "1.0", "how fast the joystick looks up/down"};
+static cvar_t joy_yawsensitivity = {0, "joyyawsensitivity", "-1.0", "how fast the joystick turns left/right"};
+static cvar_t joy_wwhack1 = {0, "joywwhack1", "0.0", "special hack for wingman warrior"};
+static cvar_t joy_wwhack2 = {0, "joywwhack2", "0.0", "special hack for wingman warrior"};
+
+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;
};
// forward-referenced functions
-void IN_StartupJoystick (void);
-void Joy_AdvancedUpdate_f (void);
-void IN_JoyMove (usercmd_t *cmd);
-void IN_StartupMouse (void);
-
-/*
-================
-VID_UpdateWindowStatus
-================
-*/
-void VID_UpdateWindowStatus (void)
-{
- window_center_x = window_x + window_width / 2;
- window_center_y = window_y + window_height / 2;
-
- if (mouseinitialized && mouseactive && !dinput)
- {
- RECT window_rect;
- window_rect.left = window_x;
- window_rect.top = window_y;
- window_rect.right = window_x + window_width;
- window_rect.bottom = window_y + window_height;
- ClipCursor (&window_rect);
- }
-}
+static void IN_StartupJoystick (void);
+static void Joy_AdvancedUpdate_f (void);
+static void IN_JoyMove (void);
+static void IN_StartupMouse (void);
//====================================
-/*
-=================
-VID_GetWindowSize
-=================
-*/
-void VID_GetWindowSize (int *x, int *y, int *width, int *height)
-{
- *x = 0;
- *y = 0;
- *width = window_width;
- *height = window_height;
-}
-
-
-void VID_Finish (void)
+void VID_Finish (qboolean allowmousegrab)
{
- int vid_usemouse;
- static int old_vsync = -1;
-
- if (old_vsync != vid_vsync.integer)
- {
- old_vsync = bound(0, vid_vsync.integer, 1);
- Cvar_SetValueQuick(&vid_vsync, old_vsync);
- if (gl_videosyncavailable)
- qwglSwapIntervalEXT (old_vsync);
- }
+ qboolean vid_usemouse;
- if (r_render.integer && !scr_skipupdate)
+ vid_usevsync = vid_vsync.integer && !cls.timedemo && gl_videosyncavailable;
+ if (vid_usingvsync != vid_usevsync && gl_videosyncavailable)
{
- if (r_speeds.integer || gl_finish.integer)
- qglFinish();
- SwapBuffers(baseDC);
+ vid_usingvsync = vid_usevsync;
+ qwglSwapIntervalEXT (vid_usevsync);
}
// handle the mouse state when windowed if that's changed
vid_usemouse = false;
- if (vid_mouse.integer && !key_consoleactive)
+ if (allowmousegrab && vid_mouse.integer && !key_consoleactive && (key_dest != key_game || !cls.demoplayback))
vid_usemouse = true;
if (vid_isfullscreen)
vid_usemouse = true;
if (!vid_activewindow)
vid_usemouse = false;
- if (vid_usemouse)
- {
- if (!vid_usingmouse)
- {
- vid_usingmouse = true;
- IN_ActivateMouse ();
- IN_HideMouse();
- }
- }
- else
+ IN_Activate(vid_usemouse);
+
+ if (r_render.integer && !vid_hidden)
{
- if (vid_usingmouse)
- {
- vid_usingmouse = false;
- IN_DeactivateMouse ();
- IN_ShowMouse();
- }
+ if (r_speeds.integer || gl_finish.integer)
+ qglFinish();
+ SwapBuffers(baseDC);
}
+
+ VID_UpdateGamma(false, 256);
}
//==========================================================================
-qbyte scantokey[128] =
+static unsigned char 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
ClearAllStates
================
*/
-void ClearAllStates (void)
+static void ClearAllStates (void)
{
Key_ClearStates ();
- IN_ClearStates ();
+ if (vid_usingmouse)
+ mouse_oldbuttonstate = 0;
}
-extern qboolean host_loopactive;
-
void AppActivate(BOOL fActive, BOOL minimize)
/****************************************************************************
*
if (!fActive)
{
- vid_usingmouse = false;
- IN_DeactivateMouse ();
- IN_ShowMouse ();
+ IN_Activate (false);
if (vid_isfullscreen)
{
ChangeDisplaySettings (NULL, 0);
while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
{
- // we always update if there are any event, even if we're paused
- scr_skipupdate = 0;
-
if (!GetMessage (&msg, NULL, 0, 0))
Sys_Quit ();
LONG CDAudio_MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static keynum_t buttonremap[16] =
+{
+ K_MOUSE1,
+ K_MOUSE2,
+ K_MOUSE3,
+ K_MOUSE4,
+ K_MOUSE5,
+ K_MOUSE6,
+ K_MOUSE7,
+ K_MOUSE8,
+ K_MOUSE9,
+ K_MOUSE10,
+ K_MOUSE11,
+ K_MOUSE12,
+ K_MOUSE13,
+ K_MOUSE14,
+ K_MOUSE15,
+ K_MOUSE16,
+};
+
/* main window procedure */
LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
char state[256];
char asciichar[4];
int vkey;
+ int charlength;
qboolean down = false;
- extern unsigned int uiWheelMessage;
-
if ( uMsg == uiWheelMessage )
uMsg = WM_MOUSEWHEEL;
case WM_MOVE:
window_x = (int) LOWORD(lParam);
window_y = (int) HIWORD(lParam);
- VID_UpdateWindowStatus ();
+ IN_Activate(false);
break;
-
+
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
down = true;
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)
+ charlength = ToAscii (wParam, lParam >> 16, state, (unsigned short *)asciichar, 0);
+ if (vkey == K_ALT || vkey == K_CTRL || vkey == K_SHIFT || charlength == 0)
asciichar[0] = 0;
+ else if( charlength == 2 ) {
+ asciichar[0] = asciichar[1];
+ }
Key_Event (vkey, asciichar[0], down);
break;
if (wParam & MK_XBUTTON7)
temp |= 512;
- IN_MouseEvent (temp);
+ if (vid_usingmouse && !dinput_acquired)
+ {
+ // perform button actions
+ int i;
+ for (i=0 ; i<mouse_buttons && i < 16 ; i++)
+ if ((temp ^ mouse_oldbuttonstate) & (1<<i))
+ Key_Event (buttonremap[i], 0, (temp & (1<<i)) != 0);
+ mouse_oldbuttonstate = temp;
+ }
break;
return lRet;
}
-int VID_SetGamma(unsigned short *ramps)
+int VID_SetGamma(unsigned short *ramps, int rampsize)
{
HDC hdc = GetDC (NULL);
int i = SetDeviceGammaRamp(hdc, ramps);
return i; // return success or failure
}
-int VID_GetGamma(unsigned short *ramps)
+int VID_GetGamma(unsigned short *ramps, int rampsize)
{
HDC hdc = GetDC (NULL);
int i = GetDeviceGammaRamp(hdc, ramps);
static HINSTANCE gldll;
-int GL_OpenLibrary(const char *name)
+static void GL_CloseLibrary(void)
+{
+ FreeLibrary(gldll);
+ gldll = 0;
+ gl_driver[0] = 0;
+ qwglGetProcAddress = NULL;
+ gl_extensions = "";
+ gl_platform = "";
+ gl_platformextensions = "";
+}
+
+static int GL_OpenLibrary(const char *name)
{
Con_Printf("Loading OpenGL driver %s\n", name);
GL_CloseLibrary();
return true;
}
-void GL_CloseLibrary(void)
-{
- FreeLibrary(gldll);
- gldll = 0;
- gl_driver[0] = 0;
- qwglGetProcAddress = NULL;
- gl_extensions = "";
- gl_platform = "";
- gl_platformextensions = "";
-}
-
void *GL_GetProcAddress(const char *name)
{
void *p = NULL;
wc.lpszClassName = "DarkPlacesWindowClass";
if (!RegisterClass (&wc))
- Sys_Error("Couldn't register window class\n");
+ Con_Printf ("Couldn't register window class\n");
IN_Init();
}
-int VID_InitMode (int fullscreen, int width, int height, int bpp)
+int VID_InitMode (int fullscreen, int width, int height, int bpp, int refreshrate)
{
int i;
HDC hdc;
int depth;
if (vid_initialized)
- Sys_Error("VID_InitMode called when video is already initialised\n");
+ Sys_Error("VID_InitMode called when video is already initialised");
// if stencil is enabled, ask for alpha too
if (bpp >= 32)
vid_isfullscreen = false;
if (fullscreen)
{
- gdevmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
+ gdevmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
gdevmode.dmBitsPerPel = bpp;
gdevmode.dmPelsWidth = width;
gdevmode.dmPelsHeight = height;
+ gdevmode.dmDisplayFrequency = refreshrate;
gdevmode.dmSize = sizeof (gdevmode);
if (ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
// x and y may be changed by WM_MOVE messages
window_x = CenterX;
window_y = CenterY;
- window_width = width;
- window_height = height;
rect.left += CenterX;
rect.right += CenterX;
rect.top += CenterY;
ShowWindow (mainwindow, SW_SHOWDEFAULT);
UpdateWindow (mainwindow);
- 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
// finish setting up, pump all our messages, and sleep for a little while
return false;
}
- qglGetString = GL_GetProcAddress("glGetString");
- qwglGetExtensionsStringARB = GL_GetProcAddress("wglGetExtensionsStringARB");
- if (qglGetString == NULL)
+ if ((qglGetString = (const GLubyte* (GLAPIENTRY *)(GLenum name))GL_GetProcAddress("glGetString")) == NULL)
{
VID_Shutdown();
Con_Print("glGetString not found\n");
return false;
}
+ if ((qwglGetExtensionsStringARB = (const char *(WINAPI *)(HDC hdc))GL_GetProcAddress("wglGetExtensionsStringARB")) == NULL)
+ Con_Print("wglGetExtensionsStringARB not found\n");
gl_renderer = qglGetString(GL_RENDERER);
gl_vendor = qglGetString(GL_VENDOR);
gl_version = qglGetString(GL_VERSION);
//vid_menudrawfn = VID_MenuDraw;
//vid_menukeyfn = VID_MenuKey;
+ vid_usingmouse = false;
+ vid_usingvsync = false;
vid_hidden = false;
vid_initialized = true;
IN_StartupMouse ();
IN_StartupJoystick ();
+ if (gl_videosyncavailable)
+ {
+ vid_usevsync = vid_vsync.integer;
+ vid_usingvsync = vid_vsync.integer;
+ qwglSwapIntervalEXT (vid_usevsync);
+ }
+
return true;
}
vid_isfullscreen = false;
}
-
-/*
-===========
-IN_ShowMouse
-===========
-*/
-void IN_ShowMouse (void)
-{
- if (!mouseshowtoggle)
- {
- ShowCursor (true);
- mouseshowtoggle = 1;
- }
-}
-
-
-/*
-===========
-IN_HideMouse
-===========
-*/
-void IN_HideMouse (void)
+static void IN_Activate (qboolean grab)
{
- if (mouseshowtoggle)
- {
- ShowCursor (false);
- mouseshowtoggle = 0;
- }
-}
-
-
-/*
-===========
-IN_ActivateMouse
-===========
-*/
-void IN_ActivateMouse (void)
-{
-
- mouseactivatetoggle = true;
+ if (!mouseinitialized)
+ return;
- if (mouseinitialized)
+ if (grab)
{
- if (dinput)
+ if (!vid_usingmouse)
{
- if (g_pMouse)
+ vid_usingmouse = true;
+ cl_ignoremousemove = true;
+ if (dinput && g_pMouse)
{
- if (!dinput_acquired)
- {
- IDirectInputDevice_Acquire(g_pMouse);
- dinput_acquired = true;
- }
+ IDirectInputDevice_Acquire(g_pMouse);
+ dinput_acquired = true;
}
else
{
- return;
+ RECT window_rect;
+ window_rect.left = window_x;
+ window_rect.top = window_y;
+ window_rect.right = window_x + vid.width;
+ window_rect.bottom = window_y + vid.height;
+ if (mouseparmsvalid)
+ restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0);
+ SetCursorPos ((window_x + vid.width / 2), (window_y + vid.height / 2));
+ SetCapture (mainwindow);
+ ClipCursor (&window_rect);
}
+ ShowCursor (false);
}
- else
- {
- RECT window_rect;
- window_rect.left = window_x;
- window_rect.top = window_y;
- window_rect.right = window_x + window_width;
- window_rect.bottom = window_y + window_height;
-
- if (mouseparmsvalid)
- restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0);
-
- SetCursorPos (window_center_x, window_center_y);
- SetCapture (mainwindow);
- ClipCursor (&window_rect);
- }
-
- mouseactive = true;
}
-}
-
-
-/*
-===========
-IN_DeactivateMouse
-===========
-*/
-void IN_DeactivateMouse (void)
-{
-
- mouseactivatetoggle = false;
-
- if (mouseinitialized)
+ else
{
- if (dinput)
+ if (vid_usingmouse)
{
- if (g_pMouse)
+ vid_usingmouse = false;
+ cl_ignoremousemove = true;
+ if (dinput_acquired)
{
- if (dinput_acquired)
- {
- IDirectInputDevice_Unacquire(g_pMouse);
- dinput_acquired = false;
- }
+ IDirectInputDevice_Unacquire(g_pMouse);
+ dinput_acquired = false;
}
+ else
+ {
+ if (restore_spi)
+ SystemParametersInfo (SPI_SETMOUSE, 0, originalmouseparms, 0);
+ ClipCursor (NULL);
+ ReleaseCapture ();
+ }
+ ShowCursor (true);
}
- else
- {
- if (restore_spi)
- SystemParametersInfo (SPI_SETMOUSE, 0, originalmouseparms, 0);
-
- ClipCursor (NULL);
- ReleaseCapture ();
- }
-
- mouseactive = false;
}
}
IN_InitDInput
===========
*/
-qboolean IN_InitDInput (void)
+static qboolean IN_InitDInput (void)
{
HRESULT hr;
DIPROPDWORD dipdw = {
if (hInstDI == NULL)
{
- Con_SafePrint("Couldn't load dinput.dll\n");
+ Con_Print("Couldn't load dinput.dll\n");
return false;
}
}
if (!pDirectInputCreate)
{
- Con_SafePrint("Couldn't get DI proc addr\n");
+ Con_Print("Couldn't get DI proc addr\n");
return false;
}
}
if (FAILED(hr))
{
- Con_SafePrint("Couldn't open DI mouse device\n");
+ Con_Print("Couldn't open DI mouse device\n");
return false;
}
if (FAILED(hr))
{
- Con_SafePrint("Couldn't set DI mouse format\n");
+ Con_Print("Couldn't set DI mouse format\n");
return false;
}
if (FAILED(hr))
{
- Con_SafePrint("Couldn't set DI coop level\n");
+ Con_Print("Couldn't set DI coop level\n");
return false;
}
if (FAILED(hr))
{
- Con_SafePrint("Couldn't set DI buffersize\n");
+ Con_Print("Couldn't set DI buffersize\n");
return false;
}
IN_StartupMouse
===========
*/
-void IN_StartupMouse (void)
+static void IN_StartupMouse (void)
{
if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe"))
return;
mouseinitialized = true;
-// COMMANDLINEOPTION: Windows Input: -nodinput disables DirectInput for mouse/joystick input, gl_finish 1 mode recommended if this option is used as otherwise it tends to stutter due to input backlog.
- if (!COM_CheckParm ("-nodinput"))
- {
+// COMMANDLINEOPTION: Windows Input: -dinput enables DirectInput for mouse/joystick input
+ if (COM_CheckParm ("-dinput"))
dinput = IN_InitDInput ();
- if (dinput)
- {
- Con_SafePrint("DirectInput initialized\n");
- }
- else
- {
- Con_SafePrint("DirectInput not initialized\n");
- }
- }
+ if (dinput)
+ Con_Print("DirectInput initialized\n");
+ else
+ Con_Print("DirectInput not initialized\n");
+
+ mouseparmsvalid = SystemParametersInfo (SPI_GETMOUSE, 0, originalmouseparms, 0);
- if (!dinput)
+ if (mouseparmsvalid)
{
- mouseparmsvalid = SystemParametersInfo (SPI_GETMOUSE, 0, originalmouseparms, 0);
+// 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 (mouseparmsvalid)
+// COMMANDLINEOPTION: Windows GDI Input: -noforcemaccel disables setting of mouse acceleration (not used with -dinput, windows only)
+ if ( COM_CheckParm ("-noforcemaccel") )
{
-// COMMANDLINEOPTION: Windows GDI Input: -noforcemspd disables setting of mouse speed (-nodinput only, windows only)
- if ( COM_CheckParm ("-noforcemspd") )
- newmouseparms[2] = originalmouseparms[2];
-
-// COMMANDLINEOPTION: Windows GDI Input: -noforcemaccel disables setting of mouse acceleration (-nodinput only, windows only)
- if ( COM_CheckParm ("-noforcemaccel") )
- {
- newmouseparms[0] = originalmouseparms[0];
- newmouseparms[1] = originalmouseparms[1];
- }
-
-// COMMANDLINEOPTION: Windows GDI Input: -noforcemparms disables setting of mouse parameters (-nodinput only, windows only)
- if ( COM_CheckParm ("-noforcemparms") )
- {
- newmouseparms[0] = originalmouseparms[0];
- newmouseparms[1] = originalmouseparms[1];
- newmouseparms[2] = originalmouseparms[2];
- }
+ newmouseparms[0] = originalmouseparms[0];
+ newmouseparms[1] = originalmouseparms[1];
}
- }
-
- mouse_buttons = 10;
-
-// if a fullscreen video mode was set before the mouse was initialized,
-// set the mouse state appropriately
- if (mouseactivatetoggle)
- IN_ActivateMouse ();
-}
-
-/*
-===========
-IN_MouseEvent
-===========
-*/
-void IN_MouseEvent (int mstate)
-{
- int i;
-
- if (mouseactive && !dinput)
- {
- // perform button actions
- for (i=0 ; i<mouse_buttons ; i++)
+// COMMANDLINEOPTION: Windows GDI Input: -noforcemparms disables setting of mouse parameters (not used with -dinput, windows only)
+ if ( COM_CheckParm ("-noforcemparms") )
{
- if ( (mstate & (1<<i)) &&
- !(mouse_oldbuttonstate & (1<<i)) )
- {
- Key_Event (K_MOUSE1 + i, 0, true);
- }
-
- if ( !(mstate & (1<<i)) &&
- (mouse_oldbuttonstate & (1<<i)) )
- {
- Key_Event (K_MOUSE1 + i, 0, false);
- }
+ newmouseparms[0] = originalmouseparms[0];
+ newmouseparms[1] = originalmouseparms[1];
+ newmouseparms[2] = originalmouseparms[2];
}
-
- mouse_oldbuttonstate = mstate;
}
+
+ mouse_buttons = 10;
}
IN_MouseMove
===========
*/
-void IN_MouseMove (usercmd_t *cmd)
+static void IN_MouseMove (void)
{
- int i, mx, my;
- DIDEVICEOBJECTDATA od;
- DWORD dwElements;
- HRESULT hr;
+ int i, mx, my;
+ POINT current_pos;
- if (!mouseactive)
+ if (!vid_usingmouse)
{
- GetCursorPos (¤t_pos);
+ //GetCursorPos (¤t_pos);
//ui_mouseupdate(current_pos.x - window_x, current_pos.y - window_y);
- IN_Mouse( cmd, 0, 0 );
return;
}
- if (dinput)
+ if (dinput_acquired)
{
+ DIDEVICEOBJECTDATA od;
+ DWORD dwElements;
+ HRESULT hr;
mx = 0;
my = 0;
if ((hr == DIERR_INPUTLOST) || (hr == DIERR_NOTACQUIRED))
{
- dinput_acquired = true;
IDirectInputDevice_Acquire(g_pMouse);
break;
}
}
}
- // perform button actions
- for (i=0 ; i<mouse_buttons ; i++)
- {
- if ( (mstate_di & (1<<i)) &&
- !(mouse_oldbuttonstate & (1<<i)) )
- {
- Key_Event (K_MOUSE1 + i, 0, true);
- }
-
- if ( !(mstate_di & (1<<i)) &&
- (mouse_oldbuttonstate & (1<<i)) )
- {
- Key_Event (K_MOUSE1 + i, 0, false);
- }
- }
-
+ // perform button actions
+ for (i=0 ; i<mouse_buttons && i < 16 ; i++)
+ if ((mstate_di ^ mouse_oldbuttonstate) & (1<<i))
+ Key_Event (buttonremap[i], 0, (mstate_di & (1<<i)) != 0);
mouse_oldbuttonstate = mstate_di;
+
+ in_mouse_x = mx;
+ in_mouse_y = my;
}
else
{
GetCursorPos (¤t_pos);
- mx = current_pos.x - window_center_x;
- my = current_pos.y - window_center_y;
- }
+ mx = current_pos.x - (window_x + vid.width / 2);
+ my = current_pos.y - (window_y + vid.height / 2);
- IN_Mouse(cmd, mx, my);
+ in_mouse_x = mx;
+ in_mouse_y = my;
- // if the mouse has moved, force it to the center, so there's room to move
- if (!dinput && (mx || my))
- SetCursorPos (window_center_x, window_center_y);
+ // if the mouse has moved, force it to the center, so there's room to move
+ if (!cl.csqc_wantsmousemove)
+ if (mx || my)
+ SetCursorPos ((window_x + vid.width / 2), (window_y + vid.height / 2));
+ }
}
IN_Move
===========
*/
-void IN_Move (usercmd_t *cmd)
+void IN_Move (void)
{
if (vid_activewindow && !vid_hidden)
{
- IN_MouseMove (cmd);
- IN_JoyMove (cmd);
+ IN_MouseMove ();
+ IN_JoyMove ();
}
}
-/*
-===================
-IN_ClearStates
-===================
-*/
-void IN_ClearStates (void)
-{
- if (mouseactive)
- mouse_oldbuttonstate = 0;
-}
-
-
/*
===============
IN_StartupJoystick
===============
*/
-void IN_StartupJoystick (void)
+static void IN_StartupJoystick (void)
{
int numdevs;
JOYCAPS jc;
RawValuePointer
===========
*/
-PDWORD RawValuePointer (int axis)
+static PDWORD RawValuePointer (int axis)
{
switch (axis)
{
Joy_AdvancedUpdate_f
===========
*/
-void Joy_AdvancedUpdate_f (void)
+static void Joy_AdvancedUpdate_f (void)
{
// called once by IN_ReadJoystick and by user whenever an update is needed
}
}
-/*
-===========
-IN_Commands
-===========
-*/
-void IN_Commands (void)
-{
- int i, key_index;
- DWORD buttonstate, povstate;
-
- if (!joy_avail)
- {
- return;
- }
-
-
- // loop through the joystick buttons
- // key a joystick event or auxillary event for higher number buttons for each state change
- buttonstate = ji.dwButtons;
- for (i=0 ; i < (int) joy_numbuttons ; i++)
- {
- if ( (buttonstate & (1<<i)) && !(joy_oldbuttonstate & (1<<i)) )
- {
- key_index = (i < 16) ? K_JOY1 : K_AUX1;
- Key_Event (key_index + i, 0, true);
- }
-
- if ( !(buttonstate & (1<<i)) && (joy_oldbuttonstate & (1<<i)) )
- {
- key_index = (i < 16) ? K_JOY1 : K_AUX1;
- Key_Event (key_index + i, 0, false);
- }
- }
- joy_oldbuttonstate = buttonstate;
-
- if (joy_haspov)
- {
- // convert POV information into 4 bits of state information
- // this avoids any potential problems related to moving from one
- // direction to another without going through the center position
- povstate = 0;
- if(ji.dwPOV != JOY_POVCENTERED)
- {
- if (ji.dwPOV == JOY_POVFORWARD)
- povstate |= 0x01;
- if (ji.dwPOV == JOY_POVRIGHT)
- povstate |= 0x02;
- if (ji.dwPOV == JOY_POVBACKWARD)
- povstate |= 0x04;
- if (ji.dwPOV == JOY_POVLEFT)
- povstate |= 0x08;
- }
- // determine which bits have changed and key an auxillary event for each change
- for (i=0 ; i < 4 ; i++)
- {
- if ( (povstate & (1<<i)) && !(joy_oldpovstate & (1<<i)) )
- {
- Key_Event (K_AUX29 + i, 0, true);
- }
-
- if ( !(povstate & (1<<i)) && (joy_oldpovstate & (1<<i)) )
- {
- Key_Event (K_AUX29 + i, 0, false);
- }
- }
- joy_oldpovstate = povstate;
- }
-}
-
-
/*
===============
IN_ReadJoystick
===============
*/
-qboolean IN_ReadJoystick (void)
+static qboolean IN_ReadJoystick (void)
{
memset (&ji, 0, sizeof(ji));
IN_JoyMove
===========
*/
-void IN_JoyMove (usercmd_t *cmd)
+static void IN_JoyMove (void)
{
float speed, aspeed;
float fAxisValue, fTemp;
joy_advancedinit = true;
}
+ if (joy_avail)
+ {
+ int i, key_index;
+ DWORD buttonstate, povstate;
+
+ // loop through the joystick buttons
+ // key a joystick event or auxillary event for higher number buttons for each state change
+ buttonstate = ji.dwButtons;
+ for (i=0 ; i < (int) joy_numbuttons ; i++)
+ {
+ if ( (buttonstate & (1<<i)) && !(joy_oldbuttonstate & (1<<i)) )
+ {
+ key_index = (i < 16) ? K_JOY1 : K_AUX1;
+ Key_Event (key_index + i, 0, true);
+ }
+
+ if ( !(buttonstate & (1<<i)) && (joy_oldbuttonstate & (1<<i)) )
+ {
+ key_index = (i < 16) ? K_JOY1 : K_AUX1;
+ Key_Event (key_index + i, 0, false);
+ }
+ }
+ joy_oldbuttonstate = buttonstate;
+
+ if (joy_haspov)
+ {
+ // convert POV information into 4 bits of state information
+ // this avoids any potential problems related to moving from one
+ // direction to another without going through the center position
+ povstate = 0;
+ if(ji.dwPOV != JOY_POVCENTERED)
+ {
+ if (ji.dwPOV == JOY_POVFORWARD)
+ povstate |= 0x01;
+ if (ji.dwPOV == JOY_POVRIGHT)
+ povstate |= 0x02;
+ if (ji.dwPOV == JOY_POVBACKWARD)
+ povstate |= 0x04;
+ if (ji.dwPOV == JOY_POVLEFT)
+ povstate |= 0x08;
+ }
+ // determine which bits have changed and key an auxillary event for each change
+ for (i=0 ; i < 4 ; i++)
+ {
+ if ( (povstate & (1<<i)) && !(joy_oldpovstate & (1<<i)) )
+ {
+ Key_Event (K_AUX29 + i, 0, true);
+ }
+
+ if ( !(povstate & (1<<i)) && (joy_oldpovstate & (1<<i)) )
+ {
+ Key_Event (K_AUX29 + i, 0, false);
+ }
+ }
+ joy_oldpovstate = povstate;
+ }
+ }
+
// verify joystick is available and that the user wants to use it
if (!joy_avail || !in_joystick.integer)
{
else
speed = 1;
// LordHavoc: viewzoom affects sensitivity for sniping
- aspeed = speed * host_realframetime * cl.viewzoom;
+ aspeed = speed * cl.realframetime * cl.viewzoom;
// loop through the axes
for (i = 0; i < JOY_MAX_AXES; i++)
// 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;
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;
// 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
Cvar_RegisterVariable (&joy_yawsensitivity);
Cvar_RegisterVariable (&joy_wwhack1);
Cvar_RegisterVariable (&joy_wwhack2);
- Cmd_AddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f);
+ Cmd_AddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f, "applies current joyadv* cvar settings to the joystick driver");
}
static void IN_Shutdown(void)
{
- IN_DeactivateMouse ();
- IN_ShowMouse ();
+ IN_Activate (false);
if (g_pMouse)
IDirectInputDevice_Release(g_pMouse);