diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-05-10 16:55:16 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-05-10 20:21:54 -0400 |
commit | aee214b09d41a481cfa1e26aa777b8f5da59e183 (patch) | |
tree | e5aae21af49f125a905a07931d3fe0208fd4153e | |
parent | dc3003bc4d620ed7d8c287054dbf446a63dedd92 (diff) | |
download | gtk+-aee214b09d41a481cfa1e26aa777b8f5da59e183.tar.gz |
gsk: Fix some renderer gotchas
unrealize() needs to clean up the surface that was set
in realize(), and both need to emit property change
notification.
-rw-r--r-- | gsk/gl/gskgldriver.c | 3 | ||||
-rw-r--r-- | gsk/gskrenderer.c | 13 |
2 files changed, 15 insertions, 1 deletions
diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c index 47734b1a9a..e81502cbe7 100644 --- a/gsk/gl/gskgldriver.c +++ b/gsk/gl/gskgldriver.c @@ -264,7 +264,8 @@ gsk_gl_driver_dispose (GObject *object) g_clear_object (&self->command_queue); } - if (self->autorelease_framebuffers->len > 0) + if (self->autorelease_framebuffers != NULL && + self->autorelease_framebuffers->len > 0) { glDeleteFramebuffers (self->autorelease_framebuffers->len, (GLuint *)(gpointer)self->autorelease_framebuffers->data); diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c index 399123bc8a..3ff7c6abdd 100644 --- a/gsk/gskrenderer.c +++ b/gsk/gskrenderer.c @@ -295,6 +295,11 @@ gsk_renderer_realize (GskRenderer *renderer, } priv->is_realized = TRUE; + + g_object_notify (G_OBJECT (renderer), "realized"); + if (surface) + g_object_notify (G_OBJECT (renderer), "surface"); + return TRUE; } @@ -308,17 +313,25 @@ void gsk_renderer_unrealize (GskRenderer *renderer) { GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer); + gboolean has_surface; g_return_if_fail (GSK_IS_RENDERER (renderer)); if (!priv->is_realized) return; + has_surface = priv->surface != NULL; + GSK_RENDERER_GET_CLASS (renderer)->unrealize (renderer); + g_clear_object (&priv->surface); g_clear_pointer (&priv->prev_node, gsk_render_node_unref); priv->is_realized = FALSE; + + g_object_notify (G_OBJECT (renderer), "realized"); + if (has_surface) + g_object_notify (G_OBJECT (renderer), "surface"); } /** |