X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=8f9c2dc83b063bd03bc9d2014581f2c32d5bd485;hb=a79d83c7ca49dd7705378d5981849fa802064d3d;hp=1e37bb374e2103fe6ca29a93ac622040995c3990;hpb=9feb49eb73a1f6db8b6f76b494802dad7845687e;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index 1e37bb37..8f9c2dc8 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 *); @@ -294,9 +305,20 @@ void VID_Finish (void) { HDC hdc; 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); + } + if (r_render.integer && !scr_skipupdate) { - qglFinish(); + if (r_speeds.integer || gl_finish.integer) + qglFinish(); hdc = GetDC(mainwindow); SwapBuffers(hdc); ReleaseDC(mainwindow, hdc); @@ -356,7 +378,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; @@ -431,14 +453,6 @@ 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, 0, false); - } - Key_ClearStates (); IN_ClearStates (); } @@ -476,7 +490,6 @@ void AppActivate(BOOL fActive, BOOL minimize) if (fActive) { - vid_allowhwgamma = true; if (vid_isfullscreen) { if (vid_wassuspended) @@ -493,7 +506,6 @@ void AppActivate(BOOL fActive, BOOL minimize) if (!fActive) { - vid_allowhwgamma = false; vid_usingmouse = false; IN_DeactivateMouse (); IN_ShowMouse (); @@ -506,6 +518,24 @@ 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)) + { + // we always update if there are any event, even if we're paused + scr_skipupdate = 0; + + 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 */ @@ -513,6 +543,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 ) @@ -533,15 +568,19 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) window_y = (int) HIWORD(lParam); VID_UpdateWindowStatus (); break; - + 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: @@ -702,7 +741,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; @@ -710,7 +749,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; @@ -754,6 +793,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) HGLRC baseRC; int CenterX, CenterY; const char *gldrivername; + int depth; if (vid_initialized) Sys_Error("VID_InitMode called when video is already initialised\n"); @@ -771,6 +811,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) } 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]; @@ -805,11 +846,18 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) { 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; } @@ -862,10 +910,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) 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 @@ -909,7 +954,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) 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; } @@ -917,7 +962,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) 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)) @@ -932,7 +977,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) if (qglGetString == NULL) { VID_Shutdown(); - Con_Printf("glGetString not found\n"); + Con_Print("glGetString not found\n"); return false; } gl_renderer = qglGetString(GL_RENDERER); @@ -942,10 +987,13 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) gl_platform = "WGL"; gl_platformextensions = ""; + gl_videosyncavailable = false; + if (qwglGetExtensionsStringARB) gl_platformextensions = qwglGetExtensionsStringARB(hdc); - gl_videosyncavailable = GL_CheckExtension("WGL_EXT_swap_control", wglswapintervalfuncs, NULL, false); +// 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 (); @@ -1144,7 +1192,7 @@ qboolean IN_InitDInput (void) if (hInstDI == NULL) { - Con_SafePrintf ("Couldn't load dinput.dll\n"); + Con_SafePrint("Couldn't load dinput.dll\n"); return false; } } @@ -1155,7 +1203,7 @@ qboolean IN_InitDInput (void) if (!pDirectInputCreate) { - Con_SafePrintf ("Couldn't get DI proc addr\n"); + Con_SafePrint("Couldn't get DI proc addr\n"); return false; } } @@ -1173,7 +1221,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't open DI mouse device\n"); + Con_SafePrint("Couldn't open DI mouse device\n"); return false; } @@ -1182,7 +1230,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't set DI mouse format\n"); + Con_SafePrint("Couldn't set DI mouse format\n"); return false; } @@ -1192,7 +1240,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't set DI coop level\n"); + Con_SafePrint("Couldn't set DI coop level\n"); return false; } @@ -1203,7 +1251,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't set DI buffersize\n"); + Con_SafePrint("Couldn't set DI buffersize\n"); return false; } @@ -1223,17 +1271,18 @@ void IN_StartupMouse (void) mouseinitialized = true; +// COMMANDLINEOPTION: Windows Input: -dinput uses DirectInput (instead of GDI) for mouse/joystick input, may be more precise or responsive, but probably not if (COM_CheckParm ("-dinput")) { dinput = IN_InitDInput (); if (dinput) { - Con_SafePrintf ("DirectInput initialized\n"); + Con_SafePrint("DirectInput initialized\n"); } else { - Con_SafePrintf ("DirectInput not initialized\n"); + Con_SafePrint("DirectInput not initialized\n"); } } @@ -1243,15 +1292,18 @@ void IN_StartupMouse (void) if (mouseparmsvalid) { +// COMMANDLINEOPTION: Windows GDI Input: -noforcemspd disables setting of mouse speed (ignored with -dinput, windows only) if ( COM_CheckParm ("-noforcemspd") ) newmouseparms[2] = originalmouseparms[2]; +// COMMANDLINEOPTION: Windows GDI Input: -noforcemaccel disables setting of mouse acceleration (ignored with -dinput, windows only) if ( COM_CheckParm ("-noforcemaccel") ) { newmouseparms[0] = originalmouseparms[0]; newmouseparms[1] = originalmouseparms[1]; } +// COMMANDLINEOPTION: Windows GDI Input: -noforcemparms disables setting of mouse parameters (ignored with -dinput, windows only) if ( COM_CheckParm ("-noforcemparms") ) { newmouseparms[0] = originalmouseparms[0]; @@ -1317,7 +1369,8 @@ void IN_MouseMove (usercmd_t *cmd) if (!mouseactive) { GetCursorPos (¤t_pos); - ui_mouseupdate(current_pos.x - window_x, current_pos.y - window_y); + //ui_mouseupdate(current_pos.x - window_x, current_pos.y - window_y); + IN_Mouse( cmd, 0, 0 ); return; } @@ -1484,13 +1537,14 @@ void IN_StartupJoystick (void) joy_avail = false; // abort startup if user requests no joystick +// COMMANDLINEOPTION: Windows Input: -nojoy disables joystick support, may be a small speed increase if (COM_CheckParm ("-nojoy") || COM_CheckParm("-safe")) return; // verify joystick driver is present if ((numdevs = joyGetNumDevs ()) == 0) { - Con_Printf ("\njoystick not found -- driver not present\n\n"); + Con_Print("\njoystick not found -- driver not present\n\n"); return; } @@ -1508,7 +1562,7 @@ void IN_StartupJoystick (void) // abort startup if we didn't find a valid joystick if (mmr != JOYERR_NOERROR) { - Con_Printf ("\njoystick not found -- no valid joysticks (%x)\n\n", mmr); + Con_Printf("\njoystick not found -- no valid joysticks (%x)\n\n", mmr); return; } @@ -1517,7 +1571,7 @@ void IN_StartupJoystick (void) memset (&jc, 0, sizeof(jc)); if ((mmr = joyGetDevCaps (joy_id, &jc, sizeof(jc))) != JOYERR_NOERROR) { - Con_Printf ("\njoystick not found -- invalid joystick capabilities (%x)\n\n", mmr); + Con_Printf("\njoystick not found -- invalid joystick capabilities (%x)\n\n", mmr); return; } @@ -1534,7 +1588,7 @@ void IN_StartupJoystick (void) joy_avail = true; joy_advancedinit = false; - Con_Printf ("\njoystick detected\n\n"); + Con_Print("\njoystick detected\n\n"); } @@ -1599,7 +1653,7 @@ void Joy_AdvancedUpdate_f (void) if (strcmp (joy_name.string, "joystick") != 0) { // notify user of advanced controller - Con_Printf ("\n%s configured\n\n", joy_name.string); + Con_Printf("\n%s configured\n\n", joy_name.string); } // advanced initialization here @@ -1635,7 +1689,6 @@ void Joy_AdvancedUpdate_f (void) } } - /* =========== IN_Commands @@ -1659,13 +1712,13 @@ void IN_Commands (void) { if ( (buttonstate & (1<