You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
native_window: fix using the embedded Wayland server when the system is X11
This commit is contained in:
@@ -123,13 +123,11 @@ void ANativeWindow_release(struct ANativeWindow *native_window)
|
|||||||
{
|
{
|
||||||
native_window->refcount--;
|
native_window->refcount--;
|
||||||
if(native_window->refcount == 0) {
|
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);
|
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_egl_window_destroy((struct wl_egl_window *)native_window->egl_window);
|
||||||
wl_surface_destroy(native_window->wayland_surface);
|
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);
|
XDestroyWindow(native_window->x11_display, native_window->egl_window);
|
||||||
}
|
}
|
||||||
free(native_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);
|
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 (native_window->wayland_display) {
|
||||||
if (GDK_IS_WAYLAND_DISPLAY (display)) {
|
wl_egl_window_resize((struct wl_egl_window *)native_window->egl_window, width, height, 0, 0);
|
||||||
wl_egl_window_resize((struct wl_egl_window *)egl_window, width, height, 0, 0);
|
} else if (native_window->x11_display) {
|
||||||
} else if (GDK_IS_X11_DISPLAY(display)) {
|
XResizeWindow(native_window->x11_display, (Window)native_window->egl_window, width, height);
|
||||||
Display *x11_display = gdk_x11_display_get_xdisplay(display);
|
|
||||||
XResizeWindow(x11_display, (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->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;
|
return native_window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <EGL/eglext.h>
|
#include <EGL/eglext.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <gdk/wayland/gdkwayland.h>
|
#include <gdk/wayland/gdkwayland.h>
|
||||||
|
#include <gdk/x11/gdkx.h>
|
||||||
|
|
||||||
#include "../api-impl-jni/defines.h"
|
#include "../api-impl-jni/defines.h"
|
||||||
#include "../api-impl-jni/widgets/android_view_SurfaceView.h"
|
#include "../api-impl-jni/widgets/android_view_SurfaceView.h"
|
||||||
@@ -263,8 +264,13 @@ extern GtkWindow *window;
|
|||||||
struct wl_display *wayland_server_start()
|
struct wl_display *wayland_server_start()
|
||||||
{
|
{
|
||||||
GdkDisplay *gdk_display = gtk_root_get_display(GTK_ROOT(window));
|
GdkDisplay *gdk_display = gtk_root_get_display(GTK_ROOT(window));
|
||||||
struct wl_display *wl_display_gtk = gdk_wayland_display_get_wl_display(gdk_display);
|
if (GDK_IS_WAYLAND_DISPLAY(gdk_display)) {
|
||||||
egl_display_gtk = eglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_KHR, wl_display_gtk, NULL);
|
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);
|
gl_context_gtk = gdk_surface_create_gl_context(gtk_native_get_surface(GTK_NATIVE(window)), NULL);
|
||||||
|
|
||||||
wl_display_server = wl_display_create();
|
wl_display_server = wl_display_create();
|
||||||
|
|||||||
Reference in New Issue
Block a user