bool CWinSystemWin32DX::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) { // When going DX fullscreen -> windowed, we must switch DXGI device to windowed mode first to // get it out of fullscreen mode because it restores a former resolution. // We then change to the mode we want. // In other cases, set the window/mode then swith DXGI mode. bool FS2Windowed = !m_useWindowedDX && UseWindowedDX(fullScreen); const MONITOR_DETAILS* monitor = GetMonitor(res.iScreen); if (!monitor) return false; SetMonitor(monitor->hMonitor); CRenderSystemDX::m_interlaced = ((res.dwFlags & D3DPRESENTFLAG_INTERLACED) != 0); CRenderSystemDX::m_useWindowedDX = UseWindowedDX(fullScreen); // this needed to prevent resize/move events from DXGI during changing mode CWinSystemWin32::m_IsAlteringWindow = true; if (FS2Windowed) CRenderSystemDX::SetFullScreenInternal(); if (!m_useWindowedDX) { // if the window isn't focused, bring it to front or SetFullScreen will fail BYTE keyState[256] = { 0 }; // to unlock SetForegroundWindow we need to imitate Alt pressing if (GetKeyboardState((LPBYTE)&keyState) && !(keyState[VK_MENU] & 0x80)) keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); BringWindowToTop(m_hWnd); if (GetKeyboardState((LPBYTE)&keyState) && !(keyState[VK_MENU] & 0x80)) keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } // to disable stereo mode in windowed mode we must recreate swapchain and then change display mode // so this flags delays call SetFullScreen _after_ resetting render system bool delaySetFS = CRenderSystemDX::m_bHWStereoEnabled && UseWindowedDX(fullScreen); if (!delaySetFS) CWinSystemWin32::SetFullScreen(fullScreen, res, blankOtherDisplays); // this needed to prevent resize/move events from DXGI during changing mode CWinSystemWin32::m_IsAlteringWindow = true; CRenderSystemDX::ResetRenderSystem(res.iWidth, res.iHeight, fullScreen, res.fRefreshRate); CWinSystemWin32::m_IsAlteringWindow = false; if (delaySetFS) // now resize window and force changing resolution if stereo mode disabled CWinSystemWin32::SetFullScreenEx(fullScreen, res, blankOtherDisplays, !CRenderSystemDX::m_bHWStereoEnabled); return true; }
bool CWinSystemWin32DX::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) { // When going DX fullscreen -> windowed, we must switch DXGI device to windowed mode first to // get it out of fullscreen mode because it restores a former resolution. // We then change to the mode we want. // In other cases, set the window/mode then swith DXGI mode. bool FS2Windowed = !m_useWindowedDX && UseWindowedDX(fullScreen); const MONITOR_DETAILS* monitor = GetMonitor(res.iScreen); if (!monitor) return false; SetMonitor(monitor->hMonitor); CRenderSystemDX::m_interlaced = ((res.dwFlags & D3DPRESENTFLAG_INTERLACED) != 0); CRenderSystemDX::m_useWindowedDX = UseWindowedDX(fullScreen); // this needed to prevent resize/move events from DXGI during changing mode CWinSystemWin32::m_IsAlteringWindow = true; if (FS2Windowed) CRenderSystemDX::SetFullScreenInternal(); if (!m_useWindowedDX) SetForegroundWindowInternal(m_hWnd); // most 3D content has 23.976fps, so switch for this mode if (g_graphicsContext.GetStereoMode() == RENDER_STEREO_MODE_HARDWAREBASED) res = CDisplaySettings::GetInstance().GetResolutionInfo(CResolutionUtils::ChooseBestResolution(24.f / 1.001f, res.iWidth, true)); // so this flags delays call SetFullScreen _after_ resetting render system bool delaySetFS = CRenderSystemDX::m_bHWStereoEnabled; if (!delaySetFS) CWinSystemWin32::SetFullScreen(fullScreen, res, blankOtherDisplays); // this needed to prevent resize/move events from DXGI during changing mode CWinSystemWin32::m_IsAlteringWindow = true; CRenderSystemDX::ResetRenderSystem(res.iWidth, res.iHeight, fullScreen, res.fRefreshRate); if (delaySetFS) { // now resize window and force changing resolution if stereo mode disabled if (UseWindowedDX(fullScreen)) CWinSystemWin32::SetFullScreenEx(fullScreen, res, blankOtherDisplays, !CRenderSystemDX::m_bHWStereoEnabled); else { CRenderSystemDX::SetFullScreenInternal(); CRenderSystemDX::CreateWindowSizeDependentResources(); } } CWinSystemWin32::m_IsAlteringWindow = false; return true; }
bool CWinSystemWin32DX::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) { // When going DX fullscreen -> windowed, we must reset the D3D device first to // get it out of fullscreen mode because it restores a former resolution. // We then change to the mode we want. // In other cases, set the window/mode then reset the D3D device. bool FS2Windowed = !m_useWindowedDX && UseWindowedDX(fullScreen); SetMonitor(GetMonitor(res.iScreen).hMonitor); CRenderSystemDX::m_interlaced = ((res.dwFlags & D3DPRESENTFLAG_INTERLACED) != 0); CRenderSystemDX::m_useWindowedDX = UseWindowedDX(fullScreen); if (FS2Windowed) CRenderSystemDX::ResetRenderSystem(res.iWidth, res.iHeight, fullScreen, res.fRefreshRate); CWinSystemWin32::SetFullScreen(fullScreen, res, blankOtherDisplays); CRenderSystemDX::ResetRenderSystem(res.iWidth, res.iHeight, fullScreen, res.fRefreshRate); return true; }
bool CWinSystemWin32DX::CreateNewWindow(std::string name, bool fullScreen, RESOLUTION_INFO& res, PHANDLE_EVENT_FUNC userFunction) { if(!CWinSystemWin32::CreateNewWindow(name, fullScreen, res, userFunction)) return false; SetFocusWnd(m_hWnd); SetDeviceWnd(m_hWnd); CRenderSystemDX::m_interlaced = ((res.dwFlags & D3DPRESENTFLAG_INTERLACED) != 0); CRenderSystemDX::m_useWindowedDX = UseWindowedDX(fullScreen); SetRenderParams(m_nWidth, m_nHeight, fullScreen, res.fRefreshRate); SetMonitor(GetMonitor(res.iScreen).hMonitor); return true; }
void CWinSystemWin32DX::NotifyAppFocusChange(bool bGaining) { CWinSystemWin32::NotifyAppFocusChange(bGaining); // if true fullscreen we need switch render system to/from ff manually like dx9 does if (!UseWindowedDX(m_bFullScreen) && CRenderSystemDX::m_bRenderCreated) { CRenderSystemDX::m_useWindowedDX = !bGaining; CRenderSystemDX::SetFullScreenInternal(); CRenderSystemDX::CreateWindowSizeDependentResources(); // minimize window on lost focus if (!bGaining) ShowWindow(m_hWnd, SW_SHOWMINIMIZED); } }