*/
// 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 <dsound.h>
// Tell startup code that we have a client
int cl_available = true;
+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 qboolean vid_wassuspended = false;
static qboolean vid_usingmouse = false;
static qboolean vid_usingvsync = false;
-static qboolean vid_usemouse = false;
static qboolean vid_usevsync = false;
static HICON hIcon;
//====================================
-static int window_x, window_y, window_width, window_height;
-static int window_center_x, window_center_y;
+static int window_x, window_y;
static void IN_Activate (qboolean grab);
static void IN_JoyMove (void);
static void IN_StartupMouse (void);
-/*
-================
-VID_UpdateWindowStatus
-================
-*/
-static void VID_UpdateWindowStatus (void)
-{
- window_center_x = window_x + window_width / 2;
- window_center_y = window_y + window_height / 2;
-
- if (mouseinitialized && vid_usingmouse && !dinput_acquired)
- {
- 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);
- }
-}
-
//====================================
-/*
-=================
-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)
{
+ qboolean vid_usemouse;
+
vid_usevsync = vid_vsync.integer && !cls.timedemo && gl_videosyncavailable;
if (vid_usingvsync != vid_usevsync && gl_videosyncavailable)
{
-static 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
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;
if ( uMsg == uiWheelMessage )
case WM_MOVE:
window_x = (int) LOWORD(lParam);
window_y = (int) HIWORD(lParam);
- VID_UpdateWindowStatus ();
+ IN_Activate(false);
break;
case WM_KEYDOWN:
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;
{
// perform button actions
int i;
- for (i=0 ; i<mouse_buttons ; i++)
+ for (i=0 ; i<mouse_buttons && i < 16 ; i++)
if ((temp ^ mouse_oldbuttonstate) & (1<<i))
- Key_Event (K_MOUSE1 + i, 0, (temp & (1<<i)) != 0);
+ Key_Event (buttonremap[i], 0, (temp & (1<<i)) != 0);
mouse_oldbuttonstate = temp;
}
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);
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_Activate
-===========
-*/
static void IN_Activate (qboolean grab)
{
if (!mouseinitialized)
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;
+ 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_center_x, window_center_y);
+ SetCursorPos ((window_x + vid.width / 2), (window_y + vid.height / 2));
SetCapture (mainwindow);
ClipCursor (&window_rect);
}
}
// perform button actions
- for (i=0 ; i<mouse_buttons ; i++)
+ for (i=0 ; i<mouse_buttons && i < 16 ; i++)
if ((mstate_di ^ mouse_oldbuttonstate) & (1<<i))
- Key_Event (K_MOUSE1 + i, 0, (mstate_di & (1<<i)) != 0);
+ Key_Event (buttonremap[i], 0, (mstate_di & (1<<i)) != 0);
mouse_oldbuttonstate = mstate_di;
in_mouse_x = mx;
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_x = mx;
in_mouse_y = my;
// if the mouse has moved, force it to the center, so there's room to move
if (mx || my)
- SetCursorPos (window_center_x, window_center_y);
+ SetCursorPos ((window_x + vid.width / 2), (window_y + vid.height / 2));
}
}