summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-05-10 16:55:16 -0400
committerMatthias Clasen <mclasen@redhat.com>2023-05-10 20:21:54 -0400
commitaee214b09d41a481cfa1e26aa777b8f5da59e183 (patch)
treee5aae21af49f125a905a07931d3fe0208fd4153e
parentdc3003bc4d620ed7d8c287054dbf446a63dedd92 (diff)
downloadgtk+-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.c3
-rw-r--r--gsk/gskrenderer.c13
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");
}
/**