Deal with fullscreen limitations under windowed Android environments (Chromebook, DeX, etc.) (Thanks Rachel!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 5c36e66..761b539 100644
--- a/src/video/SDL_video.c
+++ b/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);
}
diff --git a/src/video/android/SDL_androidwindow.c b/src/video/android/SDL_androidwindow.c
index 1ac1a2a..93d60d3 100644
--- a/src/video/android/SDL_androidwindow.c
+++ b/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