Avoid white flash when starting streaming on Windows

This commit is contained in:
Cameron Gutman 2022-10-27 18:18:47 -05:00
parent 245f242fb8
commit e45b6b9b85

View file

@ -1443,12 +1443,23 @@ void Session::execInternal()
} }
} }
// If dark mode is enabled, propagate that to our SDL window SDL_SysWMinfo info;
if (darkModeEnabled) { SDL_VERSION(&info.version);
SDL_SysWMinfo info;
SDL_VERSION(&info.version); if (SDL_GetWindowWMInfo(m_Window, &info) && info.subsystem == SDL_SYSWM_WINDOWS) {
if (SDL_GetWindowWMInfo(m_Window, &info) && info.subsystem == SDL_SYSWM_WINDOWS) { RECT clientRect;
HBRUSH blackBrush;
// Draw a black background (otherwise our window will be bright white).
//
// TODO: Remove when SDL does this itself
blackBrush = CreateSolidBrush(0);
GetClientRect(info.info.win.window, &clientRect);
FillRect(info.info.win.hdc, &clientRect, blackBrush);
DeleteObject(blackBrush);
// If dark mode is enabled, propagate that to our SDL window
if (darkModeEnabled) {
if (FAILED(DwmSetWindowAttribute(info.info.win.window, DWMWA_USE_IMMERSIVE_DARK_MODE, &darkModeEnabled, sizeof(darkModeEnabled)))) { if (FAILED(DwmSetWindowAttribute(info.info.win.window, DWMWA_USE_IMMERSIVE_DARK_MODE, &darkModeEnabled, sizeof(darkModeEnabled)))) {
DwmSetWindowAttribute(info.info.win.window, DWMWA_USE_IMMERSIVE_DARK_MODE_OLD, &darkModeEnabled, sizeof(darkModeEnabled)); DwmSetWindowAttribute(info.info.win.window, DWMWA_USE_IMMERSIVE_DARK_MODE_OLD, &darkModeEnabled, sizeof(darkModeEnabled));
} }
@ -1487,6 +1498,25 @@ void Session::execInternal()
// Enter full screen if requested // Enter full screen if requested
if (m_IsFullScreen) { if (m_IsFullScreen) {
SDL_SetWindowFullscreen(m_Window, m_FullScreenFlag); SDL_SetWindowFullscreen(m_Window, m_FullScreenFlag);
#ifdef Q_OS_WIN32
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
// Draw a black background again after entering full-screen to avoid visual artifacts
// where the old window decorations were before.
//
// TODO: Remove when SDL does this itself
if (SDL_GetWindowWMInfo(m_Window, &info) && info.subsystem == SDL_SYSWM_WINDOWS) {
RECT clientRect;
HBRUSH blackBrush;
blackBrush = CreateSolidBrush(0);
GetClientRect(info.info.win.window, &clientRect);
FillRect(info.info.win.hdc, &clientRect, blackBrush);
DeleteObject(blackBrush);
}
#endif
} }
bool needsFirstEnterCapture = false; bool needsFirstEnterCapture = false;