diff --git a/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs b/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs index 7f88207343..78230b6bb6 100644 --- a/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs +++ b/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs @@ -63,6 +63,11 @@ namespace OpenRA.Platforms.Default Console.WriteLine("Using resolution: {0}x{1}", WindowSize.Width, WindowSize.Height); var windowFlags = SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL | SDL.SDL_WindowFlags.SDL_WINDOW_ALLOW_HIGHDPI; + + // HiDPI doesn't work properly on OSX with (legacy) fullscreen mode + if (Platform.CurrentPlatform == PlatformType.OSX && windowMode == WindowMode.Fullscreen) + SDL.SDL_SetHint(SDL.SDL_HINT_VIDEO_HIGHDPI_DISABLED, "1"); + window = SDL.SDL_CreateWindow("OpenRA", SDL.SDL_WINDOWPOS_CENTERED, SDL.SDL_WINDOWPOS_CENTERED, WindowSize.Width, WindowSize.Height, windowFlags); @@ -107,7 +112,23 @@ namespace OpenRA.Platforms.Default ReleaseWindowMouseFocus(); if (windowMode == WindowMode.Fullscreen) + { SDL.SDL_SetWindowFullscreen(window, (uint)SDL.SDL_WindowFlags.SDL_WINDOW_FULLSCREEN); + + // Fullscreen mode on OSX will ignore the configured display resolution + // and instead always picks an arbitrary scaled resolution choice that may + // not match the window size, leading to graphical and input issues. + // We work around this by force disabling HiDPI and resetting the window and + // surface sizes to match the size that is forced by SDL. + // This is usually not what the player wants, but is the best we can consistently do. + if (Platform.CurrentPlatform == PlatformType.OSX) + { + int width, height; + SDL.SDL_GetWindowSize(window, out width, out height); + WindowSize = SurfaceSize = new Size(width, height); + WindowScale = 1; + } + } else if (windowMode == WindowMode.PseudoFullscreen) { // Work around a visual glitch in OSX: the window is offset