gsk: Fix some renderer gotchas
authorMatthias Clasen <mclasen@redhat.com>
Wed, 10 May 2023 20:55:16 +0000 (16:55 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 11 May 2023 00:21:54 +0000 (20:21 -0400)
unrealize() needs to clean up the surface that was set
in realize(), and both need to emit property change
notification.

gsk/gl/gskgldriver.c
gsk/gskrenderer.c

index 47734b1a9adce60a8c7cca3a35b08b46bc31c968..e81502cbe75e9aecacf49eb07cec572e131e9948 100644 (file)
@@ -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);
index 399123bc8a183611229b07dcc2c1f33850781990..3ff7c6abdd75a41f2ed2a4e5e92aa4a5893dc918 100644 (file)
@@ -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");
 }
 
 /**