From 3d4f386db0ffbbb48bcb6795a922a7a16ec3f209 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Mon, 2 Jun 2025 22:33:32 +0200 Subject: [PATCH] View.setFullscreen(): mock the window size while request is pending --- src/api-impl-jni/views/android_view_View.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/api-impl-jni/views/android_view_View.c b/src/api-impl-jni/views/android_view_View.c index 7117ca79..36b4e59c 100644 --- a/src/api-impl-jni/views/android_view_View.c +++ b/src/api-impl-jni/views/android_view_View.c @@ -734,10 +734,25 @@ JNIEXPORT void JNICALL Java_android_view_View_nativeSetFullscreen(JNIEnv *env, j GtkWidget *widget = GTK_WIDGET(_PTR(widget_ptr)); GtkWindow *window = GTK_WINDOW(gtk_widget_get_native(widget)); if (fullscreen) { - if (gtk_window_is_maximized(window)) + if (gtk_window_is_maximized(window)) { gtk_window_fullscreen(window); - else + // Android apps expect the fullscreen to happen immediately, so we need to mock the fullscreened window size + if (ATL_IS_ANDROID_LAYOUT(gtk_widget_get_layout_manager(widget))) { + AndroidLayout *layout = ATL_ANDROID_LAYOUT(gtk_widget_get_layout_manager(widget)); + GdkSurface *surface = gtk_native_get_surface(GTK_NATIVE(window)); + GdkDisplay *display = gdk_surface_get_display(surface); + GdkMonitor *monitor = gdk_display_get_monitor_at_surface(display, surface); + GdkRectangle geometry; + gdk_monitor_get_geometry(monitor, &geometry); + // check if fullscreen is slightly larger than the window, if so, we can safely mock the new size + if (layout->real_width <= geometry.width && layout->real_width > geometry.width - 200 && layout->real_height <= geometry.height && layout->real_height > geometry.height - 200) { + layout->real_width = geometry.width; + layout->real_height = geometry.height; + } + } + } else { printf("blocking fullscreen request, because window is not maximized\n"); + } } else { gtk_window_unfullscreen(window); }