diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-05-10 07:34:23 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-05-10 20:21:12 -0400 |
commit | 1a93efecf317dcded9c21d8570555914ca70f2dd (patch) | |
tree | 2398309e2e7548b7990ce1214f2ba7ff9361e7a4 | |
parent | 440d56a44fb52a751569d1e76ec8c91cdc58f79a (diff) | |
download | gtk+-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.c | 24 |
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); |