X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=vid_wgl.c;h=30a08e84e0d4dda965490b3ec2af1e0aed558f73;hb=65dd735da686284b222120237628795a86e3e6b2;hp=97a889f8066e597a7dd02c535c2bd888b44061aa;hpb=f3a0ca9464dc2f1e3ee948259f723c27fbe29dc4;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index 97a889f8..30a08e84 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,10 +73,6 @@ static dllfunction_t wglswapintervalfuncs[] = {NULL, NULL} }; -void VID_RestoreGameGamma(void); -void VID_GetSystemGamma(void); -void VID_RestoreSystemGamma(void); - qboolean scr_skipupdate; static DEVMODE gdevmode; @@ -114,6 +121,26 @@ 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; @@ -415,19 +442,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 +491,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) @@ -498,6 +514,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 ) @@ -518,15 +539,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: @@ -541,6 +566,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 +580,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 +609,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 +654,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 +712,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 +720,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 +732,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; @@ -747,12 +764,13 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) 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; @@ -775,8 +793,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,12 +810,13 @@ 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) { @@ -807,6 +824,12 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) Con_Printf ("Can't run in non-RGB mode\n"); return false; } + if (bpp > depth) + { + VID_Shutdown(); + Con_Printf ("A higher desktop depth is required to run this video mode\n"); + return false; + } WindowStyle = WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; ExWindowStyle = 0; @@ -857,10 +880,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,7 +904,7 @@ 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) @@ -971,6 +991,11 @@ void VID_Shutdown (void) HGLRC hRC = 0; HDC hDC = 0; + if(vid_initialized == false) + return; + + VID_RestoreSystemGamma(); + vid_initialized = false; IN_Shutdown(); if (qwglGetCurrentContext) @@ -985,14 +1010,13 @@ void VID_Shutdown (void) GL_CloseLibrary(); if (hDC && mainwindow) ReleaseDC(mainwindow, hDC); - if (vid_isfullscreen) - ChangeDisplaySettings (NULL, 0); - vid_isfullscreen = false; AppActivate(false, false); - VID_RestoreSystemGamma(); if (mainwindow) DestroyWindow(mainwindow); mainwindow = 0; + if (vid_isfullscreen) + ChangeDisplaySettings (NULL, 0); + vid_isfullscreen = false; } @@ -1132,7 +1156,7 @@ qboolean IN_InitDInput (void) if (!hInstDI) { hInstDI = LoadLibrary("dinput.dll"); - + if (hInstDI == NULL) { Con_SafePrintf ("Couldn't load dinput.dll\n"); @@ -1209,7 +1233,7 @@ IN_StartupMouse */ void IN_StartupMouse (void) { - if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe")) + if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe")) return; mouseinitialized = true; @@ -1234,16 +1258,16 @@ void IN_StartupMouse (void) if (mouseparmsvalid) { - if ( COM_CheckParm ("-noforcemspd") ) + if ( COM_CheckParm ("-noforcemspd") ) newmouseparms[2] = originalmouseparms[2]; - if ( COM_CheckParm ("-noforcemaccel") ) + if ( COM_CheckParm ("-noforcemaccel") ) { newmouseparms[0] = originalmouseparms[0]; newmouseparms[1] = originalmouseparms[1]; } - if ( COM_CheckParm ("-noforcemparms") ) + if ( COM_CheckParm ("-noforcemparms") ) { newmouseparms[0] = originalmouseparms[0]; newmouseparms[1] = originalmouseparms[1]; @@ -1252,7 +1276,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 +1302,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)