bool csGraphics2DOpenGL::RestoreDisplayMode () { if (is_open) { if (FullScreen) SwitchDisplayMode (true); return true; } return false; }
//------------------------------------------------------------------------------ //this is for system-level keys, such as help, etc. //returns 1 if screen changed int HandleSystemKey (int key) { int bScreenChanged = 0; int bStopPlayerMovement = 1; //if (gameStates.gameplay.bSpeedBoost) // return 0; if (!gameStates.app.bPlayerIsDead) switch (key) { case KEY_ESC: if (gameData.app.bGamePaused) gameData.app.bGamePaused = 0; else { gameStates.app.bGameAborted = 1; SetFunctionMode (FMODE_MENU); } break; case KEY_SHIFTED + KEY_F1: bScreenChanged = SelectNextWindowFunction (0); break; case KEY_SHIFTED + KEY_F2: bScreenChanged = SelectNextWindowFunction (1); break; case KEY_SHIFTED + KEY_F3: gameOpts->render.cockpit.nWindowSize = (gameOpts->render.cockpit.nWindowSize + 1) % 4; bScreenChanged = 1; //SelectNextWindowFunction(1); break; case KEY_CTRLED + KEY_F3: gameOpts->render.cockpit.nWindowPos = (gameOpts->render.cockpit.nWindowPos + 1) % 6; bScreenChanged = 1; //SelectNextWindowFunction(1); break; case KEY_SHIFTED + KEY_CTRLED + KEY_F3: gameOpts->render.cockpit.nWindowZoom = (gameOpts->render.cockpit.nWindowZoom + 1) % 4; bScreenChanged = 1; //SelectNextWindowFunction(1); break; } if (!gameStates.app.bPlayerIsDead || (LOCALPLAYER.lives > 1)) { switch (key) { /* case KEY_SHIFTED + KEY_ESC: console.Show (); break; */ case KEY_COMMAND + KEY_P: case KEY_CTRLED + KEY_P: case KEY_PAUSE: DoGamePause (); break; case KEY_CTRLED + KEY_ALTED + KEY_S: if (!ToggleFreeCam ()) return 0; break; case KEY_COMMAND + KEY_SHIFTED + KEY_P: case KEY_PRINT_SCREEN: gameStates.app.bSaveScreenshot = 1; SaveScreenShot (NULL, 0); break; case KEY_F1: ShowHelp (); break; case KEY_F2: //gameStates.app.bConfigMenu = 1; break; if (!IsMultiGame) { paletteManager.SaveEffect (); paletteManager.ResetEffect (); paletteManager.LoadEffect (); } ConfigMenu (); if (!IsMultiGame) paletteManager.LoadEffect (); break; case KEY_F3: if (!GuidedInMainView ()) { SetFreeCam (0); SetChaseCam (0); cockpit->Toggle (); bScreenChanged = 1; } break; case KEY_F7 + KEY_SHIFTED: paletteManager.SaveEffect (); JoyDefsCalibrate (); paletteManager.LoadEffect (); break; case KEY_SHIFTED + KEY_MINUS: case KEY_MINUS: ShrinkWindow (); bScreenChanged = 1; break; case KEY_SHIFTED + KEY_EQUALS: case KEY_EQUALS: GrowWindow (); bScreenChanged = 1; break; case KEY_CTRLED + KEY_F5: saveGameManager.Save (0, 0, 1, 0); break; case KEY_CTRLED + KEY_F9: saveGameManager.Load (0, 0, 1, 0); break; case KEY_F5: if (gameData.demo.nState == ND_STATE_RECORDING) { NDStopRecording (); } else if (gameData.demo.nState == ND_STATE_NORMAL) if (!gameData.app.bGamePaused) //can't start demo while paused NDStartRecording (); break; case KEY_ALTED + KEY_F4: gameData.multigame.bShowReticleName = (gameData.multigame.bShowReticleName + 1) % 2; case KEY_F7: gameData.multigame.kills.bShowList = (gameData.multigame.kills.bShowList + 1) % (IsTeamGame ? 4 : 3); if (IsMultiGame) MultiSortKillList (); bStopPlayerMovement = 0; break; case KEY_CTRLED + KEY_F7: if ((gameStates.render.cockpit.bShowPingStats = !gameStates.render.cockpit.bShowPingStats)) ResetPingStats (); break; case KEY_CTRLED + KEY_F8: gameData.stats.nDisplayMode = (gameData.stats.nDisplayMode + 1) % 5; gameOpts->render.cockpit.bPlayerStats = gameData.stats.nDisplayMode != 0; break; case KEY_F8: MultiSendMsgStart (-1); bStopPlayerMovement = 0; break; case KEY_F9: case KEY_F10: case KEY_F11: case KEY_F12: MultiSendMacro (key); bStopPlayerMovement = 0; break; // send taunt macros case KEY_CTRLED + KEY_F12: gameData.trackIR.x = gameData.trackIR.y = 0; break; case KEY_ALTED + KEY_F12: if (!ToggleChaseCam ()) return 0; break; case KEY_SHIFTED + KEY_F9: case KEY_SHIFTED + KEY_F10: case KEY_SHIFTED + KEY_F11: case KEY_SHIFTED + KEY_F12: MultiDefineMacro (key); bStopPlayerMovement = 0; break; // redefine taunt macros case KEY_ALTED + KEY_F2: if (!gameStates.app.bPlayerIsDead && !(IsMultiGame && !IsCoopGame)) { paletteManager.SaveEffectAndReset (); paletteManager.SetEffect (); // get only the effect color back saveGameManager.Save (0, 0, 0, NULL); paletteManager.LoadEffect (); } break; // 0 means not between levels. case KEY_ALTED + KEY_F3: if (!gameStates.app.bPlayerIsDead && (!IsMultiGame || IsCoopGame)) { paletteManager.SaveEffectAndReset (); saveGameManager.Load (1, 0, 0, NULL); if (gameData.app.bGamePaused) DoGamePause (); } break; case KEY_F4 + KEY_SHIFTED: if (!gameStates.app.bD1Mission) DoEscortMenu (); break; case KEY_F4 + KEY_SHIFTED + KEY_ALTED: if (!gameStates.app.bD1Mission) ChangeGuidebotName (); break; case KEY_MINUS + KEY_ALTED: songManager.Prev (); break; case KEY_EQUALS + KEY_ALTED: songManager.Next (); break; //added 8/23/99 by Matt Mueller for hot key res/fullscreen changing, and menu access case KEY_CTRLED + KEY_SHIFTED + KEY_PADDIVIDE: case KEY_ALTED + KEY_CTRLED + KEY_PADDIVIDE: case KEY_ALTED + KEY_SHIFTED + KEY_PADDIVIDE: RenderOptionsMenu (); break; case KEY_CTRLED + KEY_F1: SwitchDisplayMode (-1); break; case KEY_CTRLED + KEY_F2: SwitchDisplayMode (1); break; case KEY_ALTED + KEY_ENTER: case KEY_ALTED + KEY_PADENTER: GrToggleFullScreenGame (); break; default: return bScreenChanged; } //switch (key) } if (bStopPlayerMovement) { StopPlayerMovement (); gameStates.app.bEnterGame = 2; } return bScreenChanged; }
bool csGraphics2DOpenGL::Open () { if (is_open) return true; csRef<iVerbosityManager> verbosemgr ( csQueryRegistry<iVerbosityManager> (object_reg)); if (verbosemgr) detector.SetVerbose (verbosemgr->Enabled ("renderer.windows.gldriver")); // create the window. if (FullScreen) { SwitchDisplayMode (false); } int pixelFormat = -1; csGLPixelFormatPicker picker (this); /* Check if the WGL pixel format check should be used at all. It appears that some drivers take "odd" choices when using the WGL pixel format path (e.g. returning Accum-capable formats even if none was requested). */ bool doWGLcheck = false; { GLPixelFormat format; if (picker.GetNextFormat (format)) { doWGLcheck = (format[glpfvMultiSamples] != 0); picker.Reset (); } } if (doWGLcheck) pixelFormat = FindPixelFormatWGL (picker); m_bActivated = true; int wwidth = fbWidth; int wheight = fbHeight; DWORD exStyle = 0; DWORD style = WS_POPUP | WS_SYSMENU; int xpos = 0; int ypos = 0; if (FullScreen) { /*exStyle |= WS_EX_TOPMOST;*/ } else { style |= WS_CAPTION | WS_MINIMIZEBOX; if (AllowResizing) style |= WS_THICKFRAME | WS_MAXIMIZEBOX; wwidth += 2 * GetSystemMetrics (SM_CXFIXEDFRAME); wheight += 2 * GetSystemMetrics (SM_CYFIXEDFRAME) + GetSystemMetrics (SM_CYCAPTION); xpos = (GetSystemMetrics (SM_CXSCREEN) - wwidth) / 2; ypos = (GetSystemMetrics (SM_CYSCREEN) - wheight) / 2; } m_hWnd = m_piWin32Assistant->CreateCSWindow (this, exStyle, style, xpos, ypos, wwidth, wheight); if (!m_hWnd) SystemFatalError (L"Cannot create Crystal Space window", GetLastError()); SetTitle (win_title); // Subclass the window if (IsWindowUnicode (m_hWnd)) { m_OldWndProc = (WNDPROC)SetWindowLongPtrW (m_hWnd, GWLP_WNDPROC, (LONG_PTR) WindowProc); SetWindowLongPtrW (m_hWnd, GWLP_USERDATA, (LONG_PTR)this); } else { m_OldWndProc = (WNDPROC)SetWindowLongPtrA (m_hWnd, GWLP_WNDPROC, (LONG_PTR) WindowProc); SetWindowLongPtrA (m_hWnd, GWLP_USERDATA, (LONG_PTR)this); } hDC = GetDC (m_hWnd); if (pixelFormat == -1) { picker.Reset(); pixelFormat = FindPixelFormatGDI (hDC, picker); } PIXELFORMATDESCRIPTOR pfd; if (DescribePixelFormat (hDC, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd) == 0) SystemFatalError (L"DescribePixelFormat failed.", GetLastError()); if (SetPixelFormat (hDC, pixelFormat, &pfd) != TRUE) { HRESULT spfErr = (HRESULT)GetLastError(); SystemFatalError (L"SetPixelFormat failed.", spfErr); } currentFormat[glpfvColorBits] = pfd.cColorBits; currentFormat[glpfvAlphaBits] = pfd.cAlphaBits; currentFormat[glpfvDepthBits] = pfd.cDepthBits; currentFormat[glpfvStencilBits] = pfd.cStencilBits; currentFormat[glpfvAccumColorBits] = pfd.cAccumBits; currentFormat[glpfvAccumAlphaBits] = pfd.cAccumAlphaBits; Depth = pfd.cColorBits; hardwareAccelerated = !(pfd.dwFlags & PFD_GENERIC_FORMAT) || (pfd.dwFlags & PFD_GENERIC_ACCELERATED); hGLRC = wglCreateContext (hDC); wglMakeCurrent (hDC, hGLRC); UpdateWindow (m_hWnd); ShowWindow (m_hWnd, m_nCmdShow); SetForegroundWindow (m_hWnd); SetFocus (m_hWnd); /* Small hack to emit "no HW acceleration" message on both GDI Generic and * sucky Direct3D default OpenGL */ hardwareAccelerated &= (strncmp ((char*)glGetString (GL_VENDOR), "Microsoft", 9) != 0); if (!hardwareAccelerated) { Report (CS_REPORTER_SEVERITY_WARNING, "No hardware acceleration!"); } detector.DoDetection (m_hWnd, hDC); Report (CS_REPORTER_SEVERITY_NOTIFY, "GL driver: %s %s", detector.GetDriverDLL(), detector.GetDriverVersion() ? detector.GetDriverVersion() : "<version unknown>"); if (FullScreen) { /* * from the Windows Shell docs: * "It is possible to cover the taskbar by explicitly setting the size * of the window rectangle equal to the size of the screen with * SetWindowPos." */ SetWindowPos (m_hWnd, CS_WINDOW_Z_ORDER, 0, 0, fbWidth, fbHeight, 0); } if (!csGraphics2DGLCommon::Open ()) return false; ext.InitWGL_EXT_swap_control (hDC); if (ext.CS_WGL_EXT_swap_control) { ext.wglSwapIntervalEXT (vsync ? 1 : 0); vsync = (ext.wglGetSwapIntervalEXT() != 0); Report (CS_REPORTER_SEVERITY_NOTIFY, "VSync is %s.", vsync ? "enabled" : "disabled"); } return true; }