summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-05-10 07:34:23 -0400
committerMatthias Clasen <mclasen@redhat.com>2023-05-10 20:21:12 -0400
commit1a93efecf317dcded9c21d8570555914ca70f2dd (patch)
tree2398309e2e7548b7990ce1214f2ba7ff9361e7a4
parent440d56a44fb52a751569d1e76ec8c91cdc58f79a (diff)
downloadgtk+-1a93efecf317dcded9c21d8570555914ca70f2dd.tar.gz
gsk: Dispose the driver when the display is closed
This was the intention, but the object data by itself does not achieve that: We do run dispose on the display when it is closed, but object data is only cleared in finalize. So listen to the ::closed signal and remove the driver ourselves. Fix up the drivers dispose implementation enough for that to actually work.
-rw-r--r--gsk/gl/gskgldriver.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c
index 1530056fcf..47734b1a9a 100644
--- a/gsk/gl/gskgldriver.c
+++ b/gsk/gl/gskgldriver.c
@@ -271,16 +271,12 @@ gsk_gl_driver_dispose (GObject *object)
self->autorelease_framebuffers->len = 0;
}
- g_clear_pointer (&self->texture_pool, g_array_unref);
-
- g_assert (!self->textures || g_hash_table_size (self->textures) == 0);
- g_assert (!self->texture_id_to_key || g_hash_table_size (self->texture_id_to_key) == 0);
- g_assert (!self->key_to_texture_id|| g_hash_table_size (self->key_to_texture_id) == 0);
-
g_clear_object (&self->glyphs_library);
g_clear_object (&self->icons_library);
g_clear_object (&self->shadows_library);
+ g_clear_pointer (&self->texture_pool, g_array_unref);
+
g_clear_pointer (&self->autorelease_framebuffers, g_array_unref);
g_clear_pointer (&self->key_to_texture_id, g_hash_table_unref);
g_clear_pointer (&self->textures, g_hash_table_unref);
@@ -474,6 +470,19 @@ gsk_gl_driver_new (GskGLCommandQueue *command_queue,
return g_steal_pointer (&self);
}
+static void
+free_driver (GskGLDriver *driver)
+{
+ g_object_run_dispose (G_OBJECT (driver));
+ g_object_unref (driver);
+}
+
+static void
+display_closed (GdkDisplay *display)
+{
+ g_object_set_data (G_OBJECT (display), "GSK_GL_DRIVER", NULL);
+}
+
/**
* gsk_gl_driver_for_display:
* @display: A #GdkDisplay that is known to support GL
@@ -519,7 +528,8 @@ gsk_gl_driver_for_display (GdkDisplay *display,
g_object_set_data_full (G_OBJECT (display),
"GSK_GL_DRIVER",
g_object_ref (driver),
- g_object_unref);
+ (GDestroyNotify) free_driver);
+ g_signal_connect (display, "closed", G_CALLBACK (display_closed), NULL);
failure:
g_clear_object (&command_queue);