From 09176cade8a14872b53a3ade70755419f03ee9a0 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Thu, 21 Nov 2024 18:09:20 +0100 Subject: [PATCH] native_window: fix using the embedded Wayland server when the system is X11 --- src/libandroid/native_window.c | 20 ++++++++------------ src/libandroid/wayland_server.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/libandroid/native_window.c b/src/libandroid/native_window.c index c71f6bf1..ebf7fbc3 100644 --- a/src/libandroid/native_window.c +++ b/src/libandroid/native_window.c @@ -123,13 +123,11 @@ void ANativeWindow_release(struct ANativeWindow *native_window) { native_window->refcount--; if(native_window->refcount == 0) { - GdkDisplay *display = gtk_widget_get_display(native_window->surface_view_widget); - g_clear_signal_handler(&native_window->resize_handler, native_window->surface_view_widget); - if (GDK_IS_WAYLAND_DISPLAY (display)) { + if (native_window->wayland_display) { wl_egl_window_destroy((struct wl_egl_window *)native_window->egl_window); wl_surface_destroy(native_window->wayland_surface); - } else if (GDK_IS_X11_DISPLAY (display)) { + } else if (native_window->x11_display) { XDestroyWindow(native_window->x11_display, native_window->egl_window); } free(native_window); @@ -247,14 +245,12 @@ void wl_registry_global_remove_handler(void *data, struct wl_registry *registry, printf("removed: %u\n", name); } -static void on_resize(GtkWidget* self, gint width, gint height, EGLNativeWindowType *egl_window) +static void on_resize(GtkWidget* self, gint width, gint height, ANativeWindow *native_window) { - GdkDisplay *display = gtk_widget_get_display(self); - if (GDK_IS_WAYLAND_DISPLAY (display)) { - wl_egl_window_resize((struct wl_egl_window *)egl_window, width, height, 0, 0); - } else if (GDK_IS_X11_DISPLAY(display)) { - Display *x11_display = gdk_x11_display_get_xdisplay(display); - XResizeWindow(x11_display, (Window)egl_window, width, height); + if (native_window->wayland_display) { + wl_egl_window_resize((struct wl_egl_window *)native_window->egl_window, width, height, 0, 0); + } else if (native_window->x11_display) { + XResizeWindow(native_window->x11_display, (Window)native_window->egl_window, width, height); } } @@ -406,7 +402,7 @@ ANativeWindow * ANativeWindow_fromSurface(JNIEnv* env, jobject surface) native_window->egl_window = (EGLNativeWindowType)x11_window; } - native_window->resize_handler = g_signal_connect(surface_view_widget, "resize", G_CALLBACK(on_resize), (void *)native_window->egl_window); + native_window->resize_handler = g_signal_connect(surface_view_widget, "resize", G_CALLBACK(on_resize), native_window); return native_window; } diff --git a/src/libandroid/wayland_server.c b/src/libandroid/wayland_server.c index 305df03e..6ed4d8f0 100644 --- a/src/libandroid/wayland_server.c +++ b/src/libandroid/wayland_server.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "../api-impl-jni/defines.h" #include "../api-impl-jni/widgets/android_view_SurfaceView.h" @@ -263,8 +264,13 @@ extern GtkWindow *window; struct wl_display *wayland_server_start() { GdkDisplay *gdk_display = gtk_root_get_display(GTK_ROOT(window)); - struct wl_display *wl_display_gtk = gdk_wayland_display_get_wl_display(gdk_display); - egl_display_gtk = eglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_KHR, wl_display_gtk, NULL); + if (GDK_IS_WAYLAND_DISPLAY(gdk_display)) { + struct wl_display *wl_display = gdk_wayland_display_get_wl_display(gdk_display); + egl_display_gtk = eglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_KHR, wl_display, NULL); + } else if (GDK_IS_X11_DISPLAY(gdk_display)) { + Display *x11_display = gdk_x11_display_get_xdisplay(gdk_display); + egl_display_gtk = eglGetPlatformDisplay(EGL_PLATFORM_X11_KHR, x11_display, NULL); + } gl_context_gtk = gdk_surface_create_gl_context(gtk_native_get_surface(GTK_NATIVE(window)), NULL); wl_display_server = wl_display_create();