From 9fa7a47081066e92068b4f954eff7ba541f0d4a4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 21 Feb 2020 19:56:44 -0500 Subject: [PATCH] color chooser: Fix fallout from floatification We are using (dddd) variants to store colors in variants, which is dangerous now that GdkRGBA members are just floats. Avoid passsing the GdkRGBA members directly to any varargs functions. --- gtk/gtkcolorchooserwidget.c | 32 ++++++++++++++++++++++++++----- gtk/gtkcolorswatch.c | 38 ++++++++++++++++++++++--------------- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/gtk/gtkcolorchooserwidget.c b/gtk/gtkcolorchooserwidget.c index 0b6b3afe4b..269c6a26e8 100644 --- a/gtk/gtkcolorchooserwidget.c +++ b/gtk/gtkcolorchooserwidget.c @@ -115,6 +115,7 @@ select_swatch (GtkColorChooserWidget *cc, { GtkColorChooserWidgetPrivate *priv = gtk_color_chooser_widget_get_instance_private (cc); GdkRGBA color; + double red, green, blue, alpha; if (priv->current == swatch) return; @@ -127,8 +128,12 @@ select_swatch (GtkColorChooserWidget *cc, gtk_color_swatch_get_rgba (swatch, &color); + red = color.red; + green = color.green; + blue = color.blue; + alpha = color.alpha; g_settings_set (priv->settings, "selected-color", "(bdddd)", - TRUE, color.red, color.green, color.blue, color.alpha); + TRUE, red, green, blue, alpha); if (gtk_widget_get_visible (GTK_WIDGET (priv->editor))) gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->editor), &color); @@ -180,8 +185,15 @@ save_custom_colors (GtkColorChooserWidget *cc) { child = l->data; if (gtk_color_swatch_get_rgba (GTK_COLOR_SWATCH (child), &color)) - g_variant_builder_add (&builder, "(dddd)", - color.red, color.green, color.blue, color.alpha); + { + double red, green, blue, alpha; + + red = color.red; + green = color.green; + blue = color.blue; + alpha = color.alpha; + g_variant_builder_add (&builder, "(dddd)", red, green, blue, alpha); + } } variant = g_variant_builder_end (&builder); @@ -499,9 +511,14 @@ gtk_color_chooser_widget_activate_color_customize (GtkWidget *widget, { GtkColorChooserWidget *cc = GTK_COLOR_CHOOSER_WIDGET (widget); GtkColorChooserWidgetPrivate *priv = gtk_color_chooser_widget_get_instance_private (cc); + double red, green, blue, alpha; GdkRGBA color; - g_variant_get (parameter, "(dddd)", &color.red, &color.green, &color.blue, &color.alpha); + g_variant_get (parameter, "(dddd)", &red, &green, &blue, &alpha); + color.red = red; + color.green = green; + color.blue = blue; + color.alpha = alpha; gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->editor), &color); @@ -517,8 +534,13 @@ gtk_color_chooser_widget_activate_color_select (GtkWidget *widget, { GtkColorChooserWidget *cc = GTK_COLOR_CHOOSER_WIDGET (widget); GdkRGBA color; + double red, green, blue, alpha; - g_variant_get (parameter, "(dddd)", &color.red, &color.green, &color.blue, &color.alpha); + g_variant_get (parameter, "(dddd)", &red, &green, &blue, &alpha); + color.red = red; + color.green = green; + color.blue = blue; + color.alpha = alpha; _gtk_color_chooser_color_activated (GTK_COLOR_CHOOSER (cc), &color); } diff --git a/gtk/gtkcolorswatch.c b/gtk/gtkcolorswatch.c index ac40dfae8c..bc7a4c9fc8 100644 --- a/gtk/gtkcolorswatch.c +++ b/gtk/gtkcolorswatch.c @@ -167,24 +167,30 @@ static void activate_color (GtkColorSwatch *swatch) { GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); + double red, green, blue, alpha; + + red = priv->color.red; + green = priv->color.green; + blue = priv->color.blue; + alpha = priv->color.alpha; + gtk_widget_activate_action (GTK_WIDGET (swatch), - "color.select", "(dddd)", - priv->color.red, - priv->color.green, - priv->color.blue, - priv->color.alpha); + "color.select", "(dddd)", red, green, blue, alpha); } static void customize_color (GtkColorSwatch *swatch) { GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); + double red, green, blue, alpha; + + red = priv->color.red; + green = priv->color.green; + blue = priv->color.blue; + alpha = priv->color.alpha; + gtk_widget_activate_action (GTK_WIDGET (swatch), - "color.customize", "(dddd)", - priv->color.red, - priv->color.green, - priv->color.blue, - priv->color.alpha); + "color.customize", "(dddd)", red, green, blue, alpha); } static gboolean @@ -222,17 +228,19 @@ gtk_color_swatch_get_menu_model (GtkColorSwatch *swatch) GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); GMenu *menu, *section; GMenuItem *item; + double red, green, blue, alpha; menu = g_menu_new (); + red = priv->color.red; + green = priv->color.green; + blue = priv->color.blue; + alpha = priv->color.alpha; + section = g_menu_new (); item = g_menu_item_new (_("Customize"), NULL); g_menu_item_set_action_and_target_value (item, "color.customize", - g_variant_new ("(dddd)", - priv->color.red, - priv->color.green, - priv->color.blue, - priv->color.alpha)); + g_variant_new ("(dddd)", red, green, blue, alpha)); g_menu_append_item (section, item); g_menu_append_section (menu, NULL, G_MENU_MODEL (section));