X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=8bc1d781efd5d9204aa937c8362c8859f1297fd7;hb=843fe07d335df1fbe465007d960f488671d8bfa9;hp=eb4ff7702d03076cc250018abeec4f38b69bb0c5;hpb=a308444491ff5488c82a196a9810142a10b142e3;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index eb4ff770..8bc1d781 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -40,7 +40,7 @@ BOOL (WINAPI *qwglMakeCurrent)(HDC, HGLRC); BOOL (WINAPI *qwglSwapIntervalEXT)(int interval); const char *(WINAPI *qwglGetExtensionsStringARB)(HDC hdc); -static gl_extensionfunctionlist_t wglfuncs[] = +static dllfunction_t wglfuncs[] = { {"wglChoosePixelFormat", (void **) &qwglChoosePixelFormat}, {"wglDescribePixelFormat", (void **) &qwglDescribePixelFormat}, @@ -56,16 +56,12 @@ static gl_extensionfunctionlist_t wglfuncs[] = {NULL, NULL} }; -static gl_extensionfunctionlist_t wglswapintervalfuncs[] = +static dllfunction_t wglswapintervalfuncs[] = { {"wglSwapIntervalEXT", (void **) &qwglSwapIntervalEXT}, {NULL, NULL} }; -void VID_RestoreGameGamma(void); -void VID_GetSystemGamma(void); -void VID_RestoreSystemGamma(void); - qboolean scr_skipupdate; static DEVMODE gdevmode; @@ -114,6 +110,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; @@ -321,15 +337,15 @@ void VID_Finish (void) qbyte 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 - 'q' ,'w' ,'e' ,'r' ,'t' ,'y' ,'u' ,'i' ,'o' ,'p' ,'[' ,']' ,13 ,K_CTRL ,'a' ,'s' , // 1 - 'd' ,'f' ,'g' ,'h' ,'j' ,'k' ,'l' ,';' ,'\'' ,'`' ,K_SHIFT,'\\' ,'z' ,'x' ,'c' ,'v' , // 2 - 'b' ,'n' ,'m' ,',' ,'.' ,'/' ,K_SHIFT,'*' ,K_ALT ,' ' ,0 ,K_F1 ,K_F2 ,K_F3 ,K_F4 ,K_F5 , // 3 - K_F6 ,K_F7 ,K_F8 ,K_F9 ,K_F10,K_PAUSE,0 ,K_HOME,K_UPARROW,K_PGUP,'-' ,K_LEFTARROW,'5' ,K_RIGHTARROW,'+' ,K_END , // 4 - K_DOWNARROW,K_PGDN,K_INS,K_DEL,0 ,0 ,0 ,K_F11 ,K_F12 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5 - 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6 - 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7 +// 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 + 'q' ,'w' ,'e' ,'r' ,'t' ,'y' ,'u' ,'i' ,'o' ,'p' ,'[' ,']' ,13 ,K_CTRL ,'a' ,'s' ,//1 + 'd' ,'f' ,'g' ,'h' ,'j' ,'k' ,'l' ,';' ,'\'' ,'`' ,K_SHIFT ,'\\' ,'z' ,'x' ,'c' ,'v' ,//2 + 'b' ,'n' ,'m' ,',' ,'.' ,'/' ,K_SHIFT,'*' ,K_ALT ,' ' ,0 ,K_F1 ,K_F2 ,K_F3 ,K_F4 ,K_F5 ,//3 + K_F6 ,K_F7 ,K_F8 ,K_F9 ,K_F10,K_PAUSE,0 ,K_HOME,K_UPARROW,K_PGUP,K_KP_MINUS,K_LEFTARROW,K_KP_5,K_RIGHTARROW,K_KP_PLUS ,K_END,//4 + K_DOWNARROW,K_PGDN,K_INS,K_DEL,0 ,0 ,0 ,K_F11 ,K_F12 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,//5 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,//6 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 //7 }; @@ -342,12 +358,62 @@ Map from windows to quake keynums */ int MapKey (int key, int virtualkey) { - key = (key>>16)&255; - if (key > 127) - return 0; - if (scantokey[key] == 0) - Con_DPrintf("key 0x%02x has no translation\n", key); - return scantokey[key]; + int result; + int modified = (key >> 16) & 255; + qboolean is_extended = false; + + if (modified < 128 && scantokey[modified]) + result = scantokey[modified]; + else + { + result = 0; + Con_DPrintf("key 0x%02x (0x%8x, 0x%8x) has no translation\n", modified, key, virtualkey); + } + + if (key & (1 << 24)) + is_extended = true; + + if ( !is_extended ) + { + switch ( result ) + { + case K_HOME: + return K_KP_HOME; + case K_UPARROW: + return K_KP_UPARROW; + case K_PGUP: + return K_KP_PGUP; + case K_LEFTARROW: + return K_KP_LEFTARROW; + case K_RIGHTARROW: + return K_KP_RIGHTARROW; + case K_END: + return K_KP_END; + case K_DOWNARROW: + return K_KP_DOWNARROW; + case K_PGDN: + return K_KP_PGDN; + case K_INS: + return K_KP_INS; + case K_DEL: + return K_KP_DEL; + default: + return result; + } + } + else + { + switch ( result ) + { + case 0x0D: + return K_KP_ENTER; + case 0x2F: + return K_KP_SLASH; + case 0xAF: + return K_KP_PLUS; + } + return result; + } } /* @@ -377,7 +443,6 @@ void ClearAllStates (void) IN_ClearStates (); } -void VID_RestoreGameGamma(void); extern qboolean host_loopactive; void AppActivate(BOOL fActive, BOOL minimize) @@ -411,6 +476,7 @@ void AppActivate(BOOL fActive, BOOL minimize) if (fActive) { + vid_allowhwgamma = true; if (vid_isfullscreen) { if (vid_wassuspended) @@ -423,12 +489,11 @@ 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) { + vid_allowhwgamma = false; vid_usingmouse = false; IN_DeactivateMouse (); IN_ShowMouse (); @@ -491,6 +556,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; @@ -503,6 +570,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; @@ -539,14 +626,9 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) break; - case WM_DESTROY: - { - if (mainwindow) - DestroyWindow (mainwindow); - - PostQuitMessage (0); - } - break; + //case WM_DESTROY: + // PostQuitMessage (0); + // break; case MM_MCINOTIFY: lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); @@ -562,169 +644,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) +int VID_GetGamma(unsigned short *ramps) { - HDC hdc; - hdc = GetDC (NULL); - - GetDeviceGammaRamp(hdc, &systemgammaramps[0][0]); - + HDC hdc = GetDC (NULL); + int i = GetDeviceGammaRamp(hdc, ramps); ReleaseDC (NULL, hdc); + return i; // return success or failure } -void VID_RestoreSystemGamma(void) -{ - HDC hdc; - hdc = GetDC (NULL); - - SetDeviceGammaRamp(hdc, &systemgammaramps[0][0]); - - ReleaseDC (NULL, hdc); -} - -//======================================================== -// Video menu stuff -//======================================================== - -#if 0 -extern void M_Menu_Options_f (void); -extern void M_Print (float cx, float cy, char *str); -extern void M_PrintWhite (float cx, float cy, char *str); -extern void M_DrawCharacter (float cx, float cy, int num); -extern void M_DrawPic (float cx, float cy, char *picname); - -static int vid_wmodes; - -typedef struct -{ - int modenum; - char *desc; - int iscur; -} modedesc_t; - -#define MAX_COLUMN_SIZE 9 -#define MODE_AREA_HEIGHT (MAX_COLUMN_SIZE + 2) -#define MAX_MODEDESCS (MAX_COLUMN_SIZE*3) - -static modedesc_t modedescs[MAX_MODEDESCS]; - -/* -================ -VID_MenuDraw -================ -*/ -void VID_MenuDraw (void) -{ - cachepic_t *p; - char *ptr; - int lnummodes, i, k, column, row; - vmode_t *pv; - - p = Draw_CachePic ("gfx/vidmodes.lmp"); - M_DrawPic ( (320-p->width)/2, 4, "gfx/vidmodes.lmp"); - - vid_wmodes = 0; - lnummodes = VID_NumModes (); - - for (i=1 ; (i 0) - { - M_Print (2*8, 36+0*8, "Fullscreen Modes (WIDTHxHEIGHTxBPP)"); - - column = 8; - row = 36+2*8; - - for (i=0 ; i"); - M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*4, "and -bpp "); - M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*6, "Select windowed mode with -window"); -} - - -/* -================ -VID_MenuKey -================ -*/ -void VID_MenuKey (int key) -{ - switch (key) - { - case K_ESCAPE: - S_LocalSound ("misc/menu1.wav"); - M_Menu_Options_f (); - break; - - default: - break; - } -} -#endif - 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))) { @@ -814,14 +754,21 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) HGLRC baseRC; int CenterX, CenterY; const char *gldrivername; - + if (vid_initialized) Sys_Error("VID_InitMode called when video is already initialised\n"); + // if stencil is enabled, ask for alpha too if (stencil) + { pfd.cStencilBits = 8; + pfd.cAlphaBits = 8; + } else + { pfd.cStencilBits = 0; + pfd.cAlphaBits = 0; + } gldrivername = "opengl32.dll"; i = COM_CheckParm("-gl_driver"); @@ -835,8 +782,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) { @@ -904,8 +849,8 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int stencil) mainwindow = CreateWindowEx (ExWindowStyle, "DarkPlacesWindowClass", gamename, WindowStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, global_hInstance, NULL); if (!mainwindow) { + Con_Printf("CreateWindowEx(%d, %s, %s, %d, %d, %d, %d, %d, %p, %p, %d, %p) failed\n", ExWindowStyle, "DarkPlacesWindowClass", gamename, WindowStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, global_hInstance, NULL); VID_Shutdown(); - Con_Printf("CreateWindowEx(%d, %s, %s, %d, %d, %d, %d, %d, %p, %p, %d, %p) failed\n", ExWindowStyle, gamename, gamename, WindowStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, global_hInstance, NULL); return false; } @@ -944,7 +889,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) @@ -1031,36 +976,29 @@ void VID_Shutdown (void) HGLRC hRC = 0; HDC hDC = 0; - if (vid_initialized) - { - vid_initialized = false; - IN_Shutdown(); - - if (qwglGetCurrentContext) - hRC = qwglGetCurrentContext(); - - if (qwglGetCurrentDC) - hDC = qwglGetCurrentDC(); - - if (qwglMakeCurrent) - qwglMakeCurrent(NULL, NULL); - - if (hRC && qwglDeleteContext) - qwglDeleteContext(hRC); - - // close the library before we get rid of the window - GL_CloseLibrary(); - - if (hDC && mainwindow) - ReleaseDC(mainwindow, hDC); - - if (vid_isfullscreen) - ChangeDisplaySettings (NULL, 0); - - AppActivate(false, false); - - VID_RestoreSystemGamma(); - } + 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); + // close the library before we get rid of the window + GL_CloseLibrary(); + if (hDC && mainwindow) + ReleaseDC(mainwindow, hDC); + AppActivate(false, false); + if (mainwindow) + DestroyWindow(mainwindow); + mainwindow = 0; + if (vid_isfullscreen) + ChangeDisplaySettings (NULL, 0); + vid_isfullscreen = false; } @@ -1200,7 +1138,7 @@ qboolean IN_InitDInput (void) if (!hInstDI) { hInstDI = LoadLibrary("dinput.dll"); - + if (hInstDI == NULL) { Con_SafePrintf ("Couldn't load dinput.dll\n"); @@ -1277,7 +1215,7 @@ IN_StartupMouse */ void IN_StartupMouse (void) { - if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe")) + if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe")) return; mouseinitialized = true; @@ -1302,16 +1240,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]; @@ -1320,7 +1258,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 @@ -1354,8 +1292,8 @@ void IN_MouseEvent (int mstate) { Key_Event (K_MOUSE1 + i, false); } - } - + } + mouse_oldbuttonstate = mstate; } } @@ -1527,25 +1465,25 @@ void IN_ClearStates (void) } -/* -=============== -IN_StartupJoystick +/* =============== -*/ -void IN_StartupJoystick (void) +IN_StartupJoystick +=============== +*/ +void IN_StartupJoystick (void) { int numdevs; JOYCAPS jc; MMRESULT mmr; mmr = 0; - + // assume no joystick - joy_avail = false; + joy_avail = false; // abort startup if user requests no joystick - if (COM_CheckParm ("-nojoy") || COM_CheckParm("-safe")) - return; - + if (COM_CheckParm ("-nojoy") || COM_CheckParm("-safe")) + return; + // verify joystick driver is present if ((numdevs = joyGetNumDevs ()) == 0) { @@ -1562,7 +1500,7 @@ void IN_StartupJoystick (void) if ((mmr = joyGetPosEx (joy_id, &ji)) == JOYERR_NOERROR) break; - } + } // abort startup if we didn't find a valid joystick if (mmr != JOYERR_NOERROR) @@ -1576,7 +1514,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; } @@ -1590,10 +1528,10 @@ void IN_StartupJoystick (void) // mark the joystick as available and advanced initialization not completed // this is needed as cvars are not available during initialization - joy_avail = true; + joy_avail = true; joy_advancedinit = false; - Con_Printf ("\njoystick detected\n\n"); + Con_Printf ("\njoystick detected\n\n"); } @@ -1765,11 +1703,11 @@ void IN_Commands (void) } -/* -=============== +/* +=============== IN_ReadJoystick -=============== -*/ +=============== +*/ qboolean IN_ReadJoystick (void) { @@ -1820,7 +1758,7 @@ void IN_JoyMove (usercmd_t *cmd) // verify joystick is available and that the user wants to use it if (!joy_avail || !in_joystick.integer) { - return; + return; } // collect the joystick data, if possible @@ -1860,7 +1798,7 @@ void IN_JoyMove (usercmd_t *cmd) } } - // convert range from -32768..32767 to -1..1 + // convert range from -32768..32767 to -1..1 fAxisValue /= 32768.0; switch (dwAxisMap[i]) @@ -1870,7 +1808,7 @@ void IN_JoyMove (usercmd_t *cmd) { // user wants forward control to become look control if (fabs(fAxisValue) > 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)