|
|
@@ -1091,26 +1091,41 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
|
|
|
|
|
|
if(nullptr == mainWindow)
|
|
|
{
|
|
|
+ #if defined(VCMI_ANDROID) || defined(VCMI_IOS)
|
|
|
+ auto createWindow = [displayIndex](Uint32 extraFlags) -> bool {
|
|
|
+ mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), 0, 0, SDL_WINDOW_FULLSCREEN | extraFlags);
|
|
|
+ return mainWindow != nullptr;
|
|
|
+ };
|
|
|
|
|
|
- #ifdef VCMI_ANDROID
|
|
|
- mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex),SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), 0, 0, SDL_WINDOW_FULLSCREEN);
|
|
|
+#ifdef VCMI_IOS
|
|
|
+ SDL_SetHint(SDL_HINT_IOS_HIDE_HOME_INDICATOR, "1");
|
|
|
+ SDL_SetHint(SDL_HINT_RETURN_KEY_HIDES_IME, "1");
|
|
|
|
|
|
- // SDL on Android doesn't do proper letterboxing, and will show an annoying flickering in the blank space in case you're not using the full screen estate
|
|
|
- // That's why we need to make sure our width and height we'll use below have the same aspect ratio as the screen itself to ensure we fill the full screen estate
|
|
|
+ Uint32 windowFlags = SDL_WINDOW_BORDERLESS | SDL_WINDOW_ALLOW_HIGHDPI;
|
|
|
+ if(!createWindow(windowFlags | SDL_WINDOW_METAL))
|
|
|
+ {
|
|
|
+ logGlobal->warn("Metal unavailable, using OpenGLES");
|
|
|
+ createWindow(windowFlags);
|
|
|
+ }
|
|
|
|
|
|
- SDL_Rect screenRect;
|
|
|
+ // TODO: can android use this too?
|
|
|
+ auto shouldFixAspectRatio = true;
|
|
|
+ int screenWidth, screenHeight;
|
|
|
+ SDL_GetWindowSize(mainWindow, &screenWidth, &screenHeight);
|
|
|
+#else
|
|
|
+ createWindow(0);
|
|
|
|
|
|
- if(SDL_GetDisplayBounds(0, &screenRect) == 0)
|
|
|
+ SDL_Rect screenRect;
|
|
|
+ auto shouldFixAspectRatio = SDL_GetDisplayBounds(0, &screenRect) == 0;
|
|
|
+ int screenWidth = screenRect.w, screenHeight = screenRect.h;
|
|
|
+#endif
|
|
|
+ // SDL on mobile doesn't do proper letterboxing, and will show an annoying flickering in the blank space in case you're not using the full screen estate
|
|
|
+ // That's why we need to make sure our width and height we'll use below have the same aspect ratio as the screen itself to ensure we fill the full screen estate
|
|
|
+ if(shouldFixAspectRatio)
|
|
|
{
|
|
|
- int screenWidth, screenHeight;
|
|
|
- double aspect;
|
|
|
-
|
|
|
- screenWidth = screenRect.w;
|
|
|
- screenHeight = screenRect.h;
|
|
|
-
|
|
|
- aspect = (double)screenWidth / (double)screenHeight;
|
|
|
+ auto aspect = static_cast<double>(screenWidth) / screenHeight;
|
|
|
|
|
|
- logGlobal->info("Screen size and aspect ration: %dx%d (%lf)", screenWidth, screenHeight, aspect);
|
|
|
+ logGlobal->info("Screen size and aspect ratio: %dx%d (%lf)", screenWidth, screenHeight, aspect);
|
|
|
|
|
|
if((double)w / aspect > (double)h)
|
|
|
{
|
|
|
@@ -1127,22 +1142,6 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
|
|
|
{
|
|
|
logGlobal->error("Can't fix aspect ratio for screen");
|
|
|
}
|
|
|
- #elif defined(VCMI_IOS)
|
|
|
- auto createWindow = [displayIndex](Uint32 extraFlags = 0) {
|
|
|
- mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_BORDERLESS | SDL_WINDOW_ALLOW_HIGHDPI | extraFlags);
|
|
|
- return mainWindow != nullptr;
|
|
|
- };
|
|
|
- if (!createWindow(SDL_WINDOW_METAL))
|
|
|
- {
|
|
|
- logGlobal->warn("Metal unavailable, using OpenGLES");
|
|
|
- createWindow();
|
|
|
- }
|
|
|
- SDL_SetHint(SDL_HINT_IOS_HIDE_HOME_INDICATOR, "1");
|
|
|
- SDL_SetHint(SDL_HINT_RETURN_KEY_HIDES_IME, "1");
|
|
|
-
|
|
|
- logGlobal->info("before SDL_GetWindowSize %dx%d", w, h);
|
|
|
- SDL_GetWindowSize(mainWindow, &w, &h);
|
|
|
- logGlobal->info("after SDL_GetWindowSize %dx%d", w, h);
|
|
|
#else
|
|
|
|
|
|
if(fullscreen)
|