X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=4649e67284753fc91795866b723cb82d3cb353b1;hb=6a667cee0a53a21a1e617efb004b44a458d5b58f;hp=367871328918b44296a8510b082c1aaa31ae8792;hpb=d6fb6e3d3eb443499060b44c10bd6647c90e00d6;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index 36787132..4649e672 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,16 +73,15 @@ static dllfunction_t wglswapintervalfuncs[] = {NULL, NULL} }; -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 HICON hIcon; HWND mainwindow; +static HDC baseDC; +static HGLRC baseRC; //HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); @@ -110,11 +120,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}; @@ -272,14 +302,22 @@ 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) + 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 && !vid_hidden) { - qglFinish(); - hdc = GetDC(mainwindow); - SwapBuffers(hdc); - ReleaseDC(mainwindow, hdc); + if (r_speeds.integer || gl_finish.integer) + qglFinish(); + SwapBuffers(baseDC); } // handle the mouse state when windowed if that's changed @@ -336,7 +374,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; @@ -411,14 +449,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, false); - } - Key_ClearStates (); IN_ClearStates (); } @@ -456,7 +486,6 @@ void AppActivate(BOOL fActive, BOOL minimize) if (fActive) { - vid_allowhwgamma = true; if (vid_isfullscreen) { if (vid_wassuspended) @@ -473,7 +502,6 @@ void AppActivate(BOOL fActive, BOOL minimize) if (!fActive) { - vid_allowhwgamma = false; vid_usingmouse = false; IN_DeactivateMouse (); IN_ShowMouse (); @@ -486,6 +514,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 */ @@ -493,6 +536,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 ) @@ -513,15 +561,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: @@ -536,6 +588,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; @@ -548,6 +602,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; @@ -557,11 +631,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; @@ -622,7 +696,7 @@ 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))) { @@ -660,7 +734,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; @@ -668,7 +742,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; @@ -680,7 +754,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; @@ -709,15 +783,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; @@ -729,6 +803,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]; @@ -757,17 +832,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; } @@ -820,10 +902,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 @@ -848,40 +927,40 @@ 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); + baseDC = GetDC(mainwindow); - if ((pixelformat = ChoosePixelFormat(hdc, &pfd)) == 0) + 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; } @@ -890,7 +969,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); @@ -900,11 +979,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 (); @@ -931,32 +1013,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); if (mainwindow) DestroyWindow(mainwindow); mainwindow = 0; + if (vid_isfullscreen) + ChangeDisplaySettings (NULL, 0); + vid_isfullscreen = false; } @@ -1099,7 +1177,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; } } @@ -1110,7 +1188,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; } } @@ -1128,7 +1206,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; } @@ -1137,7 +1215,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; } @@ -1147,7 +1225,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; } @@ -1158,7 +1236,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; } @@ -1178,17 +1256,18 @@ void IN_StartupMouse (void) mouseinitialized = true; - if (COM_CheckParm ("-dinput")) +// 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")) { 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"); } } @@ -1198,15 +1277,18 @@ void IN_StartupMouse (void) if (mouseparmsvalid) { +// 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]; @@ -1216,7 +1298,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 @@ -1242,13 +1324,13 @@ void IN_MouseEvent (int mstate) if ( (mstate & (1<