Quellcode durchsuchen

Deal with fullscreen limitations under windowed Android environments (Chromebook, DeX, etc.) (Thanks Rachel!)

Sam Lantinga vor 6 Jahren
Ursprung
Commit
4a4bac95eb
2 geänderte Dateien mit 30 neuen und 0 gelöschten Zeilen
  1. 7 0
      src/video/SDL_video.c
  2. 23 0
      src/video/android/SDL_androidwindow.c

+ 7 - 0
src/video/SDL_video.c

@@ -1289,8 +1289,15 @@ SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool fullscreen)
 
                 /* Generate a mode change event here */
                 if (resized) {
+#ifndef ANDROID
+                    // Android may not resize the window to exactly what our fullscreen mode is, especially on
+                    // windowed Android environments like the Chromebook or Samsung DeX.  Given this, we shouldn't
+                    // use fullscreen_mode.w and fullscreen_mode.h, but rather get our current native size.  As such,
+                    // Android's SetWindowFullscreen will generate the window event for us with the proper final size.
+
                     SDL_SendWindowEvent(other, SDL_WINDOWEVENT_RESIZED,
                                         fullscreen_mode.w, fullscreen_mode.h);
+#endif
                 } else {
                     SDL_OnWindowResized(other);
                 }

+ 23 - 0
src/video/android/SDL_androidwindow.c

@@ -26,6 +26,7 @@
 #include "../SDL_sysvideo.h"
 #include "../../events/SDL_keyboard_c.h"
 #include "../../events/SDL_mouse_c.h"
+#include "../../events/SDL_windowevents_c.h"
 
 #include "SDL_androidvideo.h"
 #include "SDL_androidwindow.h"
@@ -101,6 +102,28 @@ void
 Android_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen)
 {
     Android_JNI_SetWindowStyle(fullscreen);
+
+    // Ensure our size matches reality after we've executed the window style change.
+    //
+    // It is possible that we've set width and height to the full-size display, but on
+    // Samsung DeX or Chromebooks or other windowed Android environemtns, our window may 
+    // still not be the full display size.
+    //
+    SDL_WindowData * data = (SDL_WindowData *)window->driverdata;
+
+    if (!data || !data->native_window) {
+        return;
+    }
+
+    int old_w = window->w;
+    int old_h = window->h;
+
+    int new_w = ANativeWindow_getWidth(data->native_window);
+    int new_h = ANativeWindow_getHeight(data->native_window);
+
+    if (old_w != new_w || old_h != new_h) {
+        SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, new_w, new_h);
+    }
 }
 
 void