// depending on bFullscreen and the console variable r.FullScreenMode EWindowMode::Type GetWindowModeType(bool bFullscreen) { int32 FullScreenMode = GetBoundFullScreenModeCVar(); if (FPlatformProperties::SupportsWindowedMode()) { if(!bFullscreen) { return EWindowMode::Windowed; } if (GEngine && GEngine->HMDDevice.IsValid() ) { return EWindowMode::Fullscreen; } if(FullScreenMode == 1 || FullScreenMode == 2) { return EWindowMode::WindowedFullscreen; } } return EWindowMode::Fullscreen; }
void FSceneViewport::ResizeFrame(uint32 NewSizeX, uint32 NewSizeY, EWindowMode::Type NewWindowMode, int32 InPosX, int32 InPosY) { // Resizing the window directly is only supported in the game if( FApp::IsGame() && NewSizeX > 0 && NewSizeY > 0 ) { FWidgetPath WidgetPath; TSharedPtr<SWindow> WindowToResize = FSlateApplication::Get().FindWidgetWindow( ViewportWidget.Pin().ToSharedRef(), WidgetPath ); if( WindowToResize.IsValid() ) { int32 CVarValue = GetBoundFullScreenModeCVar(); EWindowMode::Type DesiredWindowMode = GetWindowModeType(NewWindowMode); // Avoid resizing if nothing changes. bool bNeedsResize = SizeX != NewSizeX || SizeY != NewSizeY || NewWindowMode != DesiredWindowMode || DesiredWindowMode != WindowToResize->GetWindowMode(); if (bNeedsResize) { if (GEngine->HMDDevice.IsValid() && GEngine->HMDDevice->IsHMDEnabled()) { // Resize & move only if moving to a fullscreen mode if (NewWindowMode != EWindowMode::Windowed) { FSlateRect PreFullScreenRect = WindowToResize->GetRectInScreen(); IHeadMountedDisplay::MonitorInfo MonitorInfo; if (GEngine->HMDDevice->GetHMDMonitorInfo(MonitorInfo)) { NewSizeX = MonitorInfo.ResolutionX; NewSizeY = MonitorInfo.ResolutionY; if (GEngine->HMDDevice->IsFullScreenAllowed()) { WindowToResize->ReshapeWindow(FVector2D(MonitorInfo.DesktopX, MonitorInfo.DesktopY), FVector2D(MonitorInfo.ResolutionX, MonitorInfo.ResolutionY)); } else { WindowToResize->Resize(FVector2D(MonitorInfo.ResolutionX, MonitorInfo.ResolutionY)); DesiredWindowMode = EWindowMode::WindowedMirror; } } GEngine->HMDDevice->PushPreFullScreenRect(PreFullScreenRect); } } // Toggle fullscreen and resize WindowToResize->SetWindowMode(DesiredWindowMode); if (GEngine->HMDDevice.IsValid() && GEngine->HMDDevice->IsHMDEnabled()) { if (NewWindowMode == EWindowMode::Windowed) { FSlateRect PreFullScreenRect; GEngine->HMDDevice->PopPreFullScreenRect(PreFullScreenRect); if (PreFullScreenRect.GetSize().X > 0 && PreFullScreenRect.GetSize().Y > 0 && GEngine->HMDDevice->IsFullScreenAllowed()) { NewSizeX = PreFullScreenRect.GetSize().X; NewSizeY = PreFullScreenRect.GetSize().Y; WindowToResize->MoveWindowTo (FVector2D(PreFullScreenRect.Left, PreFullScreenRect.Top)); } } if (NewWindowMode != WindowMode) { // Only notify the HMD if we've actually changed modes GEngine->HMDDevice->OnScreenModeChange(NewWindowMode); } } LockMouseToViewport(!CurrentReplyState.ShouldReleaseMouseLock()); int32 NewWindowSizeX = NewSizeX; int32 NewWindowSizeY = NewSizeY; WindowToResize->Resize( FVector2D(NewWindowSizeX, NewWindowSizeY) ); ResizeViewport(NewWindowSizeX, NewWindowSizeY, NewWindowMode, InPosX, InPosY); } UCanvas::UpdateAllCanvasSafeZoneData(); } } }