From 87b254156d7786b5ef3cc78c3aec98c49ca77a42 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Mon, 10 Feb 2025 18:11:21 +0100 Subject: [PATCH] Drawable: queue up invalidate() calls, because GTK can't invalidate from inside draw() This is analogous to wrapper_widget_queue_draw(). --- .../graphics/android_graphics_drawable_Drawable.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/api-impl-jni/graphics/android_graphics_drawable_Drawable.c b/src/api-impl-jni/graphics/android_graphics_drawable_Drawable.c index 2ff434b6..11cc3a75 100644 --- a/src/api-impl-jni/graphics/android_graphics_drawable_Drawable.c +++ b/src/api-impl-jni/graphics/android_graphics_drawable_Drawable.c @@ -88,8 +88,15 @@ JNIEXPORT jlong JNICALL Java_android_graphics_drawable_Drawable_native_1construc return _INTPTR(paintable); } +static guint queue_invalidate_contents(GdkPaintable *paintable) +{ + gdk_paintable_invalidate_contents(paintable); + return G_SOURCE_REMOVE; +} + JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1invalidate(JNIEnv *env, jobject this, jlong paintable_ptr) { - gdk_paintable_invalidate_contents(GDK_PAINTABLE(_PTR(paintable_ptr))); + // GTK doesn't allow invalidating a paintable while it's being drawn, so we need to queue it up + g_idle_add_full(G_PRIORITY_HIGH_IDLE + 20, G_SOURCE_FUNC(queue_invalidate_contents), GDK_PAINTABLE(_PTR(paintable_ptr)), NULL); } JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1draw(JNIEnv *env, jobject this, jlong paintable_ptr, jlong snapshot_ptr, jint width, jint height) {