From 2f122cbad715b513fa5ed78e9d04ddc4cc5f93be Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Sun, 22 Dec 2024 10:17:36 +0100 Subject: [PATCH] SurfaceView.unlockCanvasAndPost(): create GSK renderer without surface This is needed to allow using the renderer on non UI threads. --- src/api-impl-jni/widgets/android_view_SurfaceView.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/api-impl-jni/widgets/android_view_SurfaceView.c b/src/api-impl-jni/widgets/android_view_SurfaceView.c index ce528cad..6dfcd4d3 100644 --- a/src/api-impl-jni/widgets/android_view_SurfaceView.c +++ b/src/api-impl-jni/widgets/android_view_SurfaceView.c @@ -158,7 +158,18 @@ JNIEXPORT void JNICALL Java_android_view_SurfaceView_native_1postSnapshot(JNIEnv GtkWidget *view = GTK_WIDGET(_PTR(surface_view)); SurfaceViewWidget *surface_view_widget = SURFACE_VIEW_WIDGET(gtk_widget_get_first_child(view)); GtkSnapshot *snapshot = GTK_SNAPSHOT(_PTR(snapshot_ptr)); - GskRenderer *renderer = gsk_renderer_new_for_surface(gtk_native_get_surface(GTK_NATIVE(window))); + static GType renderer_type = 0; + if (!renderer_type) { + // Use same renderer type as for onscreen rendering. + GdkSurface *surface = gdk_surface_new_toplevel(gdk_display_get_default()); + GskRenderer *renderer = gsk_renderer_new_for_surface(surface); + renderer_type = G_OBJECT_TYPE(renderer); + gsk_renderer_unrealize(renderer); + g_object_unref(renderer); + gdk_surface_destroy(surface); + } + GskRenderer *renderer = g_object_new(renderer_type, NULL); + gsk_renderer_realize(renderer, NULL, NULL); GskRenderNode *node = gtk_snapshot_free_to_node(snapshot); GdkTexture *texture = gsk_renderer_render_texture(renderer, node, NULL); gsk_render_node_unref(node);