From cc57692345042a2d49f1caccc9d06926da119e33 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Tue, 6 Sep 2022 19:27:38 +0200 Subject: [PATCH] GtkScale: Update the label's size request from set_digits () Update the label size request when setting the digits property by calling the update_label_request () util function. That util function works by measuring the size request of the label with the lower and upper values of the adjustment, then taking the max. That way the size requisition is constant regardless of the actual displayed value. Since the util function internally works by setting the text of the label, let it also set the text at last by taking in account the current adjustment's value. Most of its callers do that anyway. Fixes https://gitlab.gnome.org/GNOME/gtk/-/issues/5156 --- gtk/gtkscale.c | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/gtk/gtkscale.c b/gtk/gtkscale.c index 7d289d9363..801d9dde10 100644 --- a/gtk/gtkscale.c +++ b/gtk/gtkscale.c @@ -243,7 +243,6 @@ update_label_request (GtkScale *scale) GtkScalePrivate *priv = gtk_scale_get_instance_private (scale); GtkAdjustment *adjustment = gtk_range_get_adjustment (GTK_RANGE (scale)); double lowest_value, highest_value; - char *old_text; char *text; int size = 0; int min; @@ -253,7 +252,6 @@ update_label_request (GtkScale *scale) lowest_value = gtk_adjustment_get_lower (adjustment); highest_value = gtk_adjustment_get_upper (adjustment); - old_text = g_strdup (gtk_label_get_label (GTK_LABEL (priv->value_widget))); gtk_widget_set_size_request (priv->value_widget, -1, -1); text = gtk_scale_format_value (scale, lowest_value); @@ -272,9 +270,10 @@ update_label_request (GtkScale *scale) size = MAX (size, min); g_free (text); + text = gtk_scale_format_value (scale, gtk_adjustment_get_value (adjustment)); gtk_widget_set_size_request (priv->value_widget, size, -1); - gtk_label_set_label (GTK_LABEL (priv->value_widget), old_text); - g_free (old_text); + gtk_label_set_label (GTK_LABEL (priv->value_widget), text); + g_free (text); } static void @@ -1028,6 +1027,9 @@ gtk_scale_set_digits (GtkScale *scale, if (priv->draw_value) gtk_range_set_round_digits (range, digits); + if (priv->value_widget) + update_label_request (scale); + gtk_widget_queue_resize (GTK_WIDGET (scale)); g_object_notify_by_pspec (G_OBJECT (scale), properties[PROP_DIGITS]); @@ -1108,16 +1110,9 @@ gtk_scale_set_draw_value (GtkScale *scale, priv->draw_value = draw_value; if (draw_value) { - char *txt; - - txt = gtk_scale_format_value (scale, - gtk_adjustment_get_value (gtk_range_get_adjustment (GTK_RANGE (scale)))); - priv->value_widget = g_object_new (GTK_TYPE_LABEL, "css-name", "value", - "label", txt, NULL); - g_free (txt); gtk_widget_insert_after (priv->value_widget, GTK_WIDGET (scale), NULL); gtk_range_set_round_digits (GTK_RANGE (scale), priv->digits); @@ -2057,8 +2052,6 @@ gtk_scale_set_format_value_func (GtkScale *scale, GDestroyNotify destroy_notify) { GtkScalePrivate *priv = gtk_scale_get_instance_private (scale); - GtkAdjustment *adjustment; - char *text; g_return_if_fail (GTK_IS_SCALE (scale)); @@ -2069,15 +2062,6 @@ gtk_scale_set_format_value_func (GtkScale *scale, priv->format_value_func_user_data = user_data; priv->format_value_func_destroy_notify = destroy_notify; - if (!priv->value_widget) - return; - - update_label_request (scale); - - adjustment = gtk_range_get_adjustment (GTK_RANGE (scale)); - text = gtk_scale_format_value (scale, - gtk_adjustment_get_value (adjustment)); - gtk_label_set_label (GTK_LABEL (priv->value_widget), text); - - g_free (text); + if (priv->value_widget) + update_label_request (scale); } -- 2.30.2