[gtk/fix-scale-critical] scale: Fix sporadic criticals




commit eaabc3722eb65b726da3ff1184061b7a66499740
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Apr 10 10:07:55 2021 -0400

    scale: Fix sporadic criticals
    
    gtk_css_node_update_layout_attributes can cause us to
    free priv->layout, and then bad things happen. Therefore,
    we must call that function on a new layout *before* setting
    priv->layout.

 gtk/gtkscale.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkscale.c b/gtk/gtkscale.c
index ea30a8c081..529fb3df9d 100644
--- a/gtk/gtkscale.c
+++ b/gtk/gtkscale.c
@@ -2020,23 +2020,26 @@ gtk_scale_get_layout (GtkScale *scale)
 
   if (!priv->layout && priv->draw_value)
     {
+      PangoLayout *layout;
       int min_layout_width;
 
-      priv->layout = gtk_widget_create_pango_layout (GTK_WIDGET (scale), NULL);
-      gtk_css_node_update_layout_attributes (gtk_css_gadget_get_node (priv->value_gadget), priv->layout);
-
+      layout = gtk_widget_create_pango_layout (GTK_WIDGET (scale), NULL);
+      gtk_css_node_update_layout_attributes (gtk_css_gadget_get_node (priv->value_gadget), layout);
       gtk_css_gadget_get_preferred_size (priv->value_gadget,
                                          GTK_ORIENTATION_HORIZONTAL, -1,
                                          &min_layout_width, NULL,
                                          NULL, NULL);
-      pango_layout_set_width (priv->layout, min_layout_width * PANGO_SCALE);
+
+      pango_layout_set_width (layout, min_layout_width * PANGO_SCALE);
 
       if (priv->value_pos == GTK_POS_LEFT)
-        pango_layout_set_alignment (priv->layout, PANGO_ALIGN_RIGHT);
+        pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT);
       else if (priv->value_pos == GTK_POS_RIGHT)
-        pango_layout_set_alignment (priv->layout, PANGO_ALIGN_LEFT);
+        pango_layout_set_alignment (layout, PANGO_ALIGN_LEFT);
       else
-        pango_layout_set_alignment (priv->layout, PANGO_ALIGN_CENTER);
+        pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+
+      priv->layout = layout;
     }
 
   if (priv->draw_value)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]