X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=1595e798afa9ec42efceb7b436cecaa3ab7142d4;hb=0ca993946636239ea409f07df745a7dcb745dde4;hp=30a08e84e0d4dda965490b3ec2af1e0aed558f73;hpb=a041029464f1668402a7c9339e100089457f98e3;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index 30a08e84..1595e798 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -73,16 +73,18 @@ 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 qboolean vid_usingmouse = false; +static qboolean vid_usingvsync = false; +static qboolean vid_usemouse = false; +static qboolean vid_usevsync = false; static HICON hIcon; HWND mainwindow; +static HDC baseDC; +static HGLRC baseRC; //HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); @@ -145,7 +147,7 @@ HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, 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}; @@ -260,7 +262,7 @@ static DIDATAFORMAT df = { // forward-referenced functions void IN_StartupJoystick (void); void Joy_AdvancedUpdate_f (void); -void IN_JoyMove (usercmd_t *cmd); +void IN_JoyMove (void); void IN_StartupMouse (void); /* @@ -303,14 +305,11 @@ 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) + vid_usevsync = vid_vsync.integer && !cls.timedemo && gl_videosyncavailable; + if (vid_usingvsync != vid_usevsync && gl_videosyncavailable) { - qglFinish(); - hdc = GetDC(mainwindow); - SwapBuffers(hdc); - ReleaseDC(mainwindow, hdc); + vid_usingvsync = vid_usevsync; + qwglSwapIntervalEXT (vid_usevsync); } // handle the mouse state when windowed if that's changed @@ -339,6 +338,13 @@ void VID_Finish (void) IN_ShowMouse(); } } + + if (r_render.integer && !vid_hidden) + { + if (r_speeds.integer || gl_finish.integer) + qglFinish(); + SwapBuffers(baseDC); + } } //========================================================================== @@ -367,7 +373,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; @@ -507,6 +513,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 */ @@ -539,7 +560,7 @@ 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: down = true; @@ -761,7 +782,6 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) }; int pixelformat; DWORD WindowStyle, ExWindowStyle; - HGLRC baseRC; int CenterX, CenterY; const char *gldrivername; int depth; @@ -782,6 +802,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]; @@ -821,13 +842,13 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) 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_Printf ("A higher desktop depth is required to run this video mode\n"); + Con_Print("A higher desktop depth is required to run this video mode\n"); return false; } @@ -905,40 +926,40 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) // 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; } @@ -947,7 +968,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); @@ -957,11 +978,14 @@ 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_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 (); @@ -976,6 +1000,8 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) //vid_menudrawfn = VID_MenuDraw; //vid_menukeyfn = VID_MenuKey; + vid_usingmouse = false; + vid_usingvsync = false; vid_hidden = false; vid_initialized = true; @@ -988,9 +1014,6 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp) static void IN_Shutdown(void); void VID_Shutdown (void) { - HGLRC hRC = 0; - HDC hDC = 0; - if(vid_initialized == false) return; @@ -998,18 +1021,14 @@ void VID_Shutdown (void) 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 (baseDC && mainwindow) + ReleaseDC(mainwindow, baseDC); AppActivate(false, false); if (mainwindow) DestroyWindow(mainwindow); @@ -1159,7 +1178,7 @@ qboolean IN_InitDInput (void) if (hInstDI == NULL) { - Con_SafePrintf ("Couldn't load dinput.dll\n"); + Con_Print("Couldn't load dinput.dll\n"); return false; } } @@ -1170,7 +1189,7 @@ qboolean IN_InitDInput (void) if (!pDirectInputCreate) { - Con_SafePrintf ("Couldn't get DI proc addr\n"); + Con_Print("Couldn't get DI proc addr\n"); return false; } } @@ -1188,7 +1207,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't open DI mouse device\n"); + Con_Print("Couldn't open DI mouse device\n"); return false; } @@ -1197,7 +1216,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't set DI mouse format\n"); + Con_Print("Couldn't set DI mouse format\n"); return false; } @@ -1207,7 +1226,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't set DI coop level\n"); + Con_Print("Couldn't set DI coop level\n"); return false; } @@ -1218,7 +1237,7 @@ qboolean IN_InitDInput (void) if (FAILED(hr)) { - Con_SafePrintf ("Couldn't set DI buffersize\n"); + Con_Print("Couldn't set DI buffersize\n"); return false; } @@ -1238,17 +1257,18 @@ void IN_StartupMouse (void) mouseinitialized = true; +// COMMANDLINEOPTION: Windows Input: -dinput enables DirectInput for mouse/joystick input if (COM_CheckParm ("-dinput")) { dinput = IN_InitDInput (); if (dinput) { - Con_SafePrintf ("DirectInput initialized\n"); + Con_Print("DirectInput initialized\n"); } else { - Con_SafePrintf ("DirectInput not initialized\n"); + Con_Print("DirectInput not initialized\n"); } } @@ -1258,15 +1278,18 @@ void IN_StartupMouse (void) if (mouseparmsvalid) { +// COMMANDLINEOPTION: Windows GDI Input: -noforcemspd disables setting of mouse speed (not used with -dinput, windows only) if ( COM_CheckParm ("-noforcemspd") ) newmouseparms[2] = originalmouseparms[2]; +// COMMANDLINEOPTION: Windows GDI Input: -noforcemaccel disables setting of mouse acceleration (not used 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 (not used with -dinput, windows only) if ( COM_CheckParm ("-noforcemparms") ) { newmouseparms[0] = originalmouseparms[0]; @@ -1322,7 +1345,7 @@ void IN_MouseEvent (int mstate) IN_MouseMove =========== */ -void IN_MouseMove (usercmd_t *cmd) +void IN_MouseMove (void) { int i, mx, my; DIDEVICEOBJECTDATA od; @@ -1333,7 +1356,7 @@ void IN_MouseMove (usercmd_t *cmd) { GetCursorPos (¤t_pos); //ui_mouseupdate(current_pos.x - window_x, current_pos.y - window_y); - in_mouse_x = in_mouse_y = 0; + IN_Mouse( 0, 0 ); return; } @@ -1416,13 +1439,11 @@ void IN_MouseMove (usercmd_t *cmd) else { GetCursorPos (¤t_pos); - mx = current_pos.x - window_center_x + mx_accum; - my = current_pos.y - window_center_y + my_accum; - mx_accum = 0; - my_accum = 0; + mx = current_pos.x - window_center_x; + my = current_pos.y - window_center_y; } - IN_Mouse(cmd, mx, my); + IN_Mouse(mx, my); // if the mouse has moved, force it to the center, so there's room to move if (!dinput && (mx || my)) @@ -1435,35 +1456,12 @@ void IN_MouseMove (usercmd_t *cmd) IN_Move =========== */ -void IN_Move (usercmd_t *cmd) +void IN_Move (void) { if (vid_activewindow && !vid_hidden) { - IN_MouseMove (cmd); - IN_JoyMove (cmd); - } -} - - -/* -=========== -IN_Accumulate -=========== -*/ -void IN_Accumulate (void) -{ - if (mouseactive) - { - if (!dinput) - { - GetCursorPos (¤t_pos); - - mx_accum += current_pos.x - window_center_x; - my_accum += current_pos.y - window_center_y; - - // force the mouse to the center, so there's room to move - SetCursorPos (window_center_x, window_center_y); - } + IN_MouseMove (); + IN_JoyMove (); } } @@ -1476,11 +1474,7 @@ IN_ClearStates void IN_ClearStates (void) { if (mouseactive) - { - mx_accum = 0; - my_accum = 0; mouse_oldbuttonstate = 0; - } } @@ -1500,13 +1494,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; } @@ -1524,7 +1519,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; } @@ -1533,7 +1528,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; } @@ -1550,7 +1545,7 @@ void IN_StartupJoystick (void) joy_avail = true; joy_advancedinit = false; - Con_Printf ("\njoystick detected\n\n"); + Con_Print("\njoystick detected\n\n"); } @@ -1615,7 +1610,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 @@ -1674,13 +1669,13 @@ void IN_Commands (void) { if ( (buttonstate & (1< joy_forwardthreshold.value) { - cmd->forwardmove += (fAxisValue * joy_forwardsensitivity.value) * speed * cl_forwardspeed.value; + cl.cmd.forwardmove += (fAxisValue * joy_forwardsensitivity.value) * speed * cl_forwardspeed.value; } } break; @@ -1862,7 +1857,7 @@ void IN_JoyMove (usercmd_t *cmd) case AxisSide: if (fabs(fAxisValue) > joy_sidethreshold.value) { - cmd->sidemove += (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; + cl.cmd.sidemove += (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; } break; @@ -1872,7 +1867,7 @@ void IN_JoyMove (usercmd_t *cmd) // user wants turn control to become side control if (fabs(fAxisValue) > joy_sidethreshold.value) { - cmd->sidemove -= (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; + cl.cmd.sidemove -= (fAxisValue * joy_sidesensitivity.value) * speed * cl_sidespeed.value; } } else