diff options
Diffstat (limited to 'src/video.cpp')
-rw-r--r-- | src/video.cpp | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/src/video.cpp b/src/video.cpp index 7ab21d12..c71a9097 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -65,7 +65,7 @@ Graphics *Video::initialize(const VideoSettings &settings) if (!initDisplayModes()) { - logger->log("Failed to initialize display modes: %s", SDL_GetError()); + Log::info("Failed to initialize display modes: %s", SDL_GetError()); } SDL_DisplayMode displayMode; @@ -81,7 +81,7 @@ Graphics *Video::initialize(const VideoSettings &settings) if (SDL_GetClosestDisplayMode(mSettings.display, &requestedMode, &displayMode) == nullptr) { - logger->log("SDL_GetClosestDisplayMode failed: %s, falling back to borderless mode", SDL_GetError()); + Log::info("SDL_GetClosestDisplayMode failed: %s, falling back to borderless mode", SDL_GetError()); mSettings.windowMode = WindowMode::WindowedFullscreen; } } @@ -92,6 +92,10 @@ Graphics *Video::initialize(const VideoSettings &settings) switch (mSettings.windowMode) { case WindowMode::Windowed: + // In windowed mode, the window is initially created hidden, we'll show + // it once we have finished setting it up and done an initial paint to + // avoid startup flicker on X11 and Windows. + windowFlags |= SDL_WINDOW_HIDDEN; break; case WindowMode::Fullscreen: windowFlags |= SDL_WINDOW_FULLSCREEN; @@ -99,6 +103,10 @@ Graphics *Video::initialize(const VideoSettings &settings) break; case WindowMode::WindowedFullscreen: windowFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP; + // On Windows, fullscreen desktop with OpenGL actually flickers worse + // when the window is initially hidden. + if (!mSettings.openGL) + windowFlags |= SDL_WINDOW_HIDDEN; videoMode = "windowed fullscreen"; break; } @@ -106,10 +114,10 @@ Graphics *Video::initialize(const VideoSettings &settings) if (mSettings.openGL) windowFlags |= SDL_WINDOW_OPENGL; - logger->log("Setting video mode %dx%d %s", - mSettings.width, - mSettings.height, - videoMode); + Log::info("Setting video mode %dx%d %s", + mSettings.width, + mSettings.height, + videoMode); mWindow = SDL_CreateWindow("Mana", SDL_WINDOWPOS_UNDEFINED, @@ -120,8 +128,7 @@ Graphics *Video::initialize(const VideoSettings &settings) if (!mWindow) { - logger->error(strprintf("Failed to create window: %s", - SDL_GetError())); + Log::critical(strprintf("Failed to create window: %s", SDL_GetError())); return nullptr; } @@ -131,7 +138,7 @@ Graphics *Video::initialize(const VideoSettings &settings) { if (SDL_SetWindowDisplayMode(mWindow, &displayMode) != 0) { - logger->log("SDL_SetWindowDisplayMode failed: %s", SDL_GetError()); + Log::info("SDL_SetWindowDisplayMode failed: %s", SDL_GetError()); } } @@ -144,7 +151,7 @@ Graphics *Video::initialize(const VideoSettings &settings) mGraphics = OpenGLGraphics::create(mWindow, mSettings); if (!mGraphics) { - logger->log("Failed to create OpenGL context, falling back to SDL renderer: %s", + Log::info("Failed to create OpenGL context, falling back to SDL renderer: %s", SDL_GetError()); mSettings.openGL = false; } @@ -170,7 +177,7 @@ bool Video::apply(const VideoSettings &settings) SDL_DisplayMode displayMode; if (SDL_GetWindowDisplayMode(mWindow, &displayMode) != 0) { - logger->error(strprintf("SDL_GetCurrentDisplayMode failed: %s", SDL_GetError())); + Log::critical(strprintf("SDL_GetCurrentDisplayMode failed: %s", SDL_GetError())); return false; } @@ -188,7 +195,7 @@ bool Video::apply(const VideoSettings &settings) if (SDL_SetWindowDisplayMode(mWindow, &displayMode) != 0) { - logger->error(strprintf("SDL_SetWindowDisplayMode failed: %s", SDL_GetError())); + Log::critical(strprintf("SDL_SetWindowDisplayMode failed: %s", SDL_GetError())); return false; } } @@ -209,7 +216,7 @@ bool Video::apply(const VideoSettings &settings) if (SDL_SetWindowFullscreen(mWindow, windowFlags) != 0) { - logger->error(strprintf("SDL_SetWindowFullscreen failed: %s", SDL_GetError())); + Log::critical(strprintf("SDL_SetWindowFullscreen failed: %s", SDL_GetError())); return false; } @@ -235,12 +242,12 @@ bool Video::apply(const VideoSettings &settings) return true; } -void Video::windowSizeChanged(int width, int height) +void Video::updateWindowSize() { - mSettings.width = width; - mSettings.height = height; - - mGraphics->updateSize(width, height, mSettings.scale()); + SDL_GetWindowSize(mWindow, &mSettings.width, &mSettings.height); + mGraphics->updateSize(mSettings.width, + mSettings.height, + mSettings.scale()); } bool Video::initDisplayModes() |