[aisleriot] Use GdkRGBA colours



commit 12c765ee7cb6ede3b9d9452fb02241da3f7df17d
Author: Christian Persch <chpe gnome org>
Date:   Tue Apr 12 18:38:20 2011 +0200

    Use GdkRGBA colours

 src/ar-style-gtk.c     |   51 ++++++----------------------
 src/ar-style-private.h |   18 ++--------
 src/ar-style.c         |   85 +++--------------------------------------------
 src/ar-style.h         |   16 +--------
 src/board-noclutter.c  |   19 ++--------
 src/prop-editor.c      |   60 +++++++++++++++++++++++++++++++++-
 src/slot-renderer.c    |   19 +++++++++--
 7 files changed, 102 insertions(+), 166 deletions(-)
---
diff --git a/src/ar-style-gtk.c b/src/ar-style-gtk.c
index 5cdd945..f0dd2bf 100644
--- a/src/ar-style-gtk.c
+++ b/src/ar-style-gtk.c
@@ -198,13 +198,13 @@ screen_changed_cb (GtkWidget *widget,
 }
 
 static void
-style_set_cb (GtkWidget *widget,
-              GtkStyle *previous_style,
-              ArStyle *style)
+style_updated_cb (GtkWidget *widget,
+                  ArStyle *style)
 {
   ArStylePrivate *style_priv = style->priv;
   GObject *style_object = G_OBJECT (style);
-  GdkColor *color = NULL;
+  GdkRGBA selection_color;
+  GdkRGBA *color = NULL;
   int focus_line_width, focus_padding;
   gboolean interior_focus;
   double card_slot_ratio, card_overhang, card_step;
@@ -261,41 +261,18 @@ style_set_cb (GtkWidget *widget,
     g_object_notify (style_object, AR_STYLE_PROP_CARD_STEP);
   }
 
-#ifdef HAVE_CLUTTER
-{
-  ClutterColor selection_color;
-
-  if (color != NULL) {
-    _ar_clutter_color_from_gdk_color (&selection_color, color);
-    gdk_color_free (color);
-  } else {
-    _ar_clutter_color_from_gdk_color (&selection_color, &default_selection_color);
-  }
-
-  if (!clutter_color_equal (&style_priv->selection_color, &selection_color)) {
-    style_priv->selection_color = selection_color;
-
-    g_object_notify (style_object, AR_STYLE_PROP_SELECTION_COLOR);
-  }
-}
-#else
-{
-  GdkColor selection_color;
-
   if (color != NULL) {
     selection_color = *color;
-    gdk_color_free (color);
+    gdk_rgba_free (color);
   } else {
     selection_color = default_selection_color;
   }
 
-  if (!gdk_color_equal (&style_priv->selection_color, &selection_color)) {
+  if (!gdk_rgba_equal (&style_priv->selection_color, &selection_color)) {
     style_priv->selection_color = selection_color;
 
     g_object_notify (style_object, AR_STYLE_PROP_SELECTION_COLOR);
   }
-}
-#endif /* HAVE_CLUTTER */
 
   g_object_thaw_notify (style_object);
 }
@@ -319,7 +296,7 @@ _ar_style_gtk_class_install_style_properties (GtkWidgetClass *widget_class)
   gtk_widget_class_install_style_property
     (widget_class,
      g_param_spec_boxed ("selection-color", NULL, NULL,
-                         GDK_TYPE_COLOR,
+                         GDK_TYPE_RGBA,
                          G_PARAM_READWRITE |
                          G_PARAM_STATIC_STRINGS));
 
@@ -385,18 +362,12 @@ _ar_style_gtk_attach (ArStyle *style,
   g_assert (g_object_get_data (G_OBJECT (widget), "Ar::Style") == NULL);
   g_object_set_data (G_OBJECT (widget), "Ar::Style", style);
 
-#if 0
-  if (gtk_widget_get_style (widget))
-    style_set_cb (widget, NULL, style);
-  if (gtk_widget_has_screen (widget))
-    screen_changed_cb (widget, NULL, style);
-#endif
-
   /* This is necessary since we don't get an initial change notification! */
   direction_changed_cb (widget, GTK_TEXT_DIR_LTR, style);
+  style_updated_cb (widget, style);
 
-  g_signal_connect (widget, "style-set",
-                    G_CALLBACK (style_set_cb), style);
+  g_signal_connect (widget, "style-updated",
+                    G_CALLBACK (style_updated_cb), style);
   g_signal_connect (widget, "screen-changed",
                     G_CALLBACK (screen_changed_cb), style);
   g_signal_connect (widget, "direction-changed",
@@ -423,7 +394,7 @@ _ar_style_gtk_detach (ArStyle *style,
   g_assert (g_object_get_data (G_OBJECT (widget), "Ar::Style") == style);
   g_object_set_data (G_OBJECT (widget), "Ar::Style", NULL);
 
-  g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (style_set_cb), style);
+  g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (style_updated_cb), style);
   g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (screen_changed_cb), style);
   g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (direction_changed_cb), style);
 
diff --git a/src/ar-style-private.h b/src/ar-style-private.h
index 356fd3b..55c45d4 100644
--- a/src/ar-style-private.h
+++ b/src/ar-style-private.h
@@ -20,8 +20,8 @@
 
 G_BEGIN_DECLS
 
-static const GdkColor default_selection_color = { 0, 0 /* red */, 0 /* green */, 0xaa00 /* blue */ };
-static const GdkColor default_baize_color = { 0, 0 /* red */, 0x5000 /* green */, 0x1000 /* blue */ };
+static const GdkRGBA default_selection_color = { 0. /* red */, 0. /* green */, 0.6666 /* blue */, 0.5 /* alpha */ };
+static const GdkRGBA default_baize_color = { 0. /* red */, 0.3125 /* green */, 0.0625 /* blue */, 1.0 /* alpha */ };
 
 /* The proportion of a slot dedicated to the card (horiz or vert). */
 #define DEFAULT_CARD_OVERHANG (0.0)
@@ -39,13 +39,8 @@ struct _ArStylePrivate
 {
   ArCardTheme* card_theme;
 
-#ifdef HAVE_CLUTTER
-  ClutterColor selection_color;
-  ClutterColor baize_color;
-#else
-  GdkColor selection_color;
-  GdkColor baize_color;
-#endif
+  GdkRGBA selection_color;
+  GdkRGBA baize_color;
 
   double card_slot_ratio;
   double card_overhang;
@@ -75,11 +70,6 @@ struct _ArStylePrivate
   guint show_seleccion          : 1;
 };
 
-#ifdef HAVE_CLUTTER
-void _ar_clutter_color_from_gdk_color (ClutterColor *clutter_color,
-                                       const GdkColor *gdk_color);
-#endif
-
 G_END_DECLS
 
 #endif /* __AR_STYLE_PRIVATE_H__ */
diff --git a/src/ar-style.c b/src/ar-style.c
index 696879c..1b78c47 100644
--- a/src/ar-style.c
+++ b/src/ar-style.c
@@ -59,14 +59,8 @@ ar_style_init (ArStyle *style)
 
   priv = style->priv = G_TYPE_INSTANCE_GET_PRIVATE (style, AR_TYPE_STYLE, ArStylePrivate);
 
-#ifdef HAVE_CLUTTER
-  _ar_clutter_color_from_gdk_color (&priv->selection_color, &default_selection_color);
-  _ar_clutter_color_from_gdk_color (&priv->baize_color, &default_baize_color);
-#else
   priv->selection_color = default_selection_color;
   priv->baize_color = default_baize_color;
-#endif
-
   priv->card_slot_ratio = DEFAULT_CARD_SLOT_RATIO;
   priv->card_overhang = DEFAULT_CARD_OVERHANG;
   priv->card_step = DEFAULT_CARD_STEP;
@@ -197,23 +191,13 @@ ar_style_set_property (GObject      *object,
 
   switch (property_id) {
     case PROP_BAIZE_COLOR: {
-#ifdef HAVE_CLUTTER
-      ClutterColor *color;
-
-      if ((color = g_value_get_boxed (value)) != NULL) {
-        priv->baize_color = *color;
-      } else {
-        _ar_clutter_color_from_gdk_color (&priv->baize_color, &default_baize_color);
-      }
-#else
-      GdkColor *color;
+      const GdkRGBA *color;
 
       if ((color = g_value_get_boxed (value)) != NULL) {
         priv->baize_color = *color;
       } else {
         priv->baize_color = default_baize_color;
       }
-#endif
       break;
     }
 
@@ -266,23 +250,13 @@ ar_style_set_property (GObject      *object,
       break;
 
     case PROP_SELECTION_COLOR: {
-#ifdef HAVE_CLUTTER
-      ClutterColor *color;
-
-      if ((color = g_value_get_boxed (value)) != NULL) {
-        priv->selection_color = *color;
-      } else {
-        _ar_clutter_color_from_gdk_color (&priv->selection_color, &default_selection_color);
-      }
-#else
-      GdkColor *color;
+      const GdkRGBA *color;
 
       if ((color = g_value_get_boxed (value)) != NULL) {
         priv->selection_color = *color;
       } else {
         priv->selection_color = default_selection_color;
       }
-#endif
       break;
     }
 
@@ -311,9 +285,6 @@ static void
 ar_style_class_init (ArStyleClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
-#ifdef HAVE_CLUTTER
-  ClutterColor color;
-#endif
 
   g_type_class_add_private (klass, sizeof (ArStylePrivate));
 
@@ -326,24 +297,13 @@ ar_style_class_init (ArStyleClass *klass)
    *
    * The board baize color.
    */
-#ifdef HAVE_CLUTTER
-  _ar_clutter_color_from_gdk_color (&color, &default_baize_color);
-  g_object_class_install_property
-    (object_class,
-     PROP_BAIZE_COLOR,
-     clutter_param_spec_color (AR_STYLE_PROP_BAIZE_COLOR, NULL, NULL,
-                               &color,
-                               G_PARAM_READWRITE |
-                               G_PARAM_STATIC_STRINGS));
-#else
   g_object_class_install_property
     (object_class,
      PROP_BAIZE_COLOR,
      g_param_spec_boxed (AR_STYLE_PROP_BAIZE_COLOR, NULL, NULL,
-                         GDK_TYPE_COLOR,
+                         GDK_TYPE_RGBA,
                          G_PARAM_READWRITE |
                          G_PARAM_STATIC_STRINGS));
-#endif /* HAVE_CLUTTER */
 
   g_object_class_install_property
     (object_class,
@@ -461,24 +421,13 @@ ar_style_class_init (ArStyleClass *klass)
                            G_PARAM_READWRITE |
                            G_PARAM_STATIC_STRINGS));
 
-#ifdef HAVE_CLUTTER
-  _ar_clutter_color_from_gdk_color (&color, &default_selection_color);
-  g_object_class_install_property
-    (object_class,
-     PROP_SELECTION_COLOR,
-     clutter_param_spec_color (AR_STYLE_PROP_SELECTION_COLOR, NULL, NULL,
-                               &color,
-                               G_PARAM_READWRITE |
-                               G_PARAM_STATIC_STRINGS));
-#else
   g_object_class_install_property
     (object_class,
      PROP_SELECTION_COLOR,
      g_param_spec_boxed (AR_STYLE_PROP_SELECTION_COLOR, NULL, NULL,
-                         GDK_TYPE_COLOR,
+                         GDK_TYPE_RGBA,
                          G_PARAM_READWRITE |
                          G_PARAM_STATIC_STRINGS));
-#endif /* HAVE_CLUTTER */
 
   /**
    * ArStyle:show-tooltips:
@@ -517,20 +466,6 @@ ar_style_class_init (ArStyleClass *klass)
 
 /* private API */
 
-#ifdef HAVE_CLUTTER
-
-void
-_ar_clutter_color_from_gdk_color (ClutterColor *clutter_color,
-                                  const GdkColor *gdk_color)
-{
-  clutter_color->red   = gdk_color->red   >> 8;
-  clutter_color->green = gdk_color->green >> 8;
-  clutter_color->blue  = gdk_color->blue  >> 8;
-  clutter_color->alpha = 0xff;
-}
-
-#endif /* HAVE_CLUTTER */
-
 /* public API */
 
 /**
@@ -852,11 +787,7 @@ ar_style_get_card_step (ArStyle *style)
  */
 void
 ar_style_get_selection_color (ArStyle *style,
-#ifdef HAVE_CLUTTER
-                              ClutterColor * const color)
-#else
-                              GdkColor * const color)
-#endif
+                              GdkRGBA * const color)
 {
   ArStylePrivate *priv = style->priv;
 
@@ -871,11 +802,7 @@ ar_style_get_selection_color (ArStyle *style,
  */
 void
 ar_style_get_baize_color (ArStyle *style,
-#ifdef HAVE_CLUTTER
-                               ClutterColor * const color)
-#else
-                               GdkColor * const color)
-#endif
+                          GdkRGBA * const color)
 {
   ArStylePrivate *priv = style->priv;
 
diff --git a/src/ar-style.h b/src/ar-style.h
index f2c98a4..d29b582 100644
--- a/src/ar-style.h
+++ b/src/ar-style.h
@@ -19,12 +19,7 @@
 #define __AR_STYLE_H__
 
 #include <glib-object.h>
-
-#ifdef HAVE_CLUTTER
-#include <clutter/clutter.h>
-#else
 #include <gdk/gdk.h>
-#endif
 
 #include "ar-card-theme.h"
 
@@ -108,17 +103,10 @@ double ar_style_get_card_slot_ratio (ArStyle *style);
 double ar_style_get_card_overhang   (ArStyle *style);
 double ar_style_get_card_step       (ArStyle *style);
 
-#ifdef HAVE_CLUTTER
-void ar_style_get_selection_color  (ArStyle *style,
-                                    ClutterColor * const color);
-void ar_style_get_baize_color (ArStyle *style,
-                                    ClutterColor * const color);
-#else
 void ar_style_get_selection_color  (ArStyle *style,
-                                    GdkColor * const color);
+                                    GdkRGBA * const color);
 void ar_style_get_baize_color (ArStyle *style,
-                                    GdkColor * const color);
-#endif
+                               GdkRGBA * const color);
 
 gboolean ar_style_check_dnd_drag_threshold (ArStyle *style,
                                             float x1,
diff --git a/src/board-noclutter.c b/src/board-noclutter.c
index d7861a1..580dfcb 100644
--- a/src/board-noclutter.c
+++ b/src/board-noclutter.c
@@ -63,9 +63,6 @@
 
 #define DOUBLE_TO_INT_CEIL(d) ((int) (d + 0.5))
 
-/* FIXMEchpe */
-#define HIGHLIGHT_ALPHA (0.5)
-
 #define I_(string) g_intern_static_string (string)
 
 typedef enum {
@@ -2910,7 +2907,7 @@ aisleriot_board_draw (GtkWidget *widget,
   ArSlot **exposed_slots;
   ArSlot *highlight_slot;
   guint n_exposed_slots;
-  GdkColor color;
+  GdkRGBA color;
   cairo_surface_t *surface;
   cairo_pattern_t *pattern;
   cairo_matrix_t matrix;
@@ -2959,7 +2956,7 @@ aisleriot_board_draw (GtkWidget *widget,
   /* First paint the background */
 
   ar_style_get_baize_color (priv->style, &color);
-  gdk_cairo_set_source_color (cr, &color);
+  gdk_cairo_set_source_rgba (cr, &color);
 
 #ifdef OPTIMISED_EXPOSE
   gdk_cairo_region (cr, region);
@@ -3029,11 +3026,7 @@ aisleriot_board_draw (GtkWidget *widget,
     if (G_UNLIKELY (hslot == highlight_slot)) {
       cairo_save (cr);
       ar_style_get_selection_color (priv->style, &color);
-      cairo_set_source_rgba (cr,
-                             color.red / 65535.,
-                             color.green / 65535.,
-                             color.blue / 65535.,
-                             HIGHLIGHT_ALPHA);
+      gdk_cairo_set_source_rgba (cr, &color);
       cairo_mask (cr, pattern);
       cairo_restore (cr);
     }
@@ -3101,11 +3094,7 @@ draw_cards:
       if (G_UNLIKELY (j >= highlight_start_card_id)) {
         cairo_save (cr);
         ar_style_get_selection_color (priv->style, &color);
-        cairo_set_source_rgba (cr,
-                               color.red / 65535.,
-                               color.green / 65535.,
-                               color.blue / 65535.,
-                               HIGHLIGHT_ALPHA);
+        gdk_cairo_set_source_rgba (cr, &color);
         cairo_mask (cr, pattern);
         cairo_restore (cr);
       }
diff --git a/src/prop-editor.c b/src/prop-editor.c
index 41c61f8..87edd37 100644
--- a/src/prop-editor.c
+++ b/src/prop-editor.c
@@ -659,7 +659,7 @@ object_properties (GtkWidget *button,
   if (G_IS_OBJECT (obj)) 
     create_prop_editor (obj, 0);
 }
- 
+
 static void
 color_modified (GtkColorButton *cb, gpointer data)
 {
@@ -704,6 +704,50 @@ color_changed (GObject *object, GParamSpec *pspec, gpointer data)
   g_value_unset (&val);
 }
 
+static void
+rgba_modified (GtkColorButton *cb, gpointer data)
+{
+  ObjectProperty *p = data;
+  GdkRGBA color;
+
+  gtk_color_button_get_rgba (cb, &color);
+
+  if (is_child_property (p->spec))
+    {
+      GtkWidget *widget = GTK_WIDGET (p->obj);
+      GtkWidget *parent = gtk_widget_get_parent (widget);
+
+      gtk_container_child_set (GTK_CONTAINER (parent),
+                               widget, p->spec->name, &color, NULL);
+    }
+  else
+    g_object_set (p->obj, p->spec->name, &color, NULL);
+}
+
+static void
+rgba_changed (GObject *object, GParamSpec *pspec, gpointer data)
+{
+  GtkColorButton *cb = GTK_COLOR_BUTTON (data);
+  GValue val = { 0, };
+  GdkRGBA *color;
+  GdkRGBA cb_color;
+
+  g_value_init (&val, GDK_TYPE_RGBA);
+  get_property_value (object, pspec, &val);
+
+  color = g_value_get_boxed (&val);
+  gtk_color_button_get_rgba (cb, &cb_color);
+
+  if (color != NULL && !gdk_rgba_equal (color, &cb_color))
+    {
+      block_controller (G_OBJECT (cb));
+      gtk_color_button_set_rgba (cb, color);
+      unblock_controller (G_OBJECT (cb));
+    }
+
+  g_value_unset (&val);
+}
+
 static GtkWidget *
 property_widget (GObject    *object, 
 		 GParamSpec *spec, 
@@ -930,6 +974,20 @@ property_widget (GObject    *object,
 	connect_controller (G_OBJECT (prop_edit), "color-set",
 			    object, spec, G_CALLBACK (color_modified));
     }
+  else if (type == G_TYPE_PARAM_BOXED &&
+           G_PARAM_SPEC_VALUE_TYPE (spec) == GDK_TYPE_RGBA)
+    {
+      prop_edit = gtk_color_button_new ();
+      gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (prop_edit), TRUE);
+
+      g_object_connect_property (object, spec,
+                                 G_CALLBACK (rgba_changed),
+                                 prop_edit, G_OBJECT (prop_edit));
+
+      if (can_modify)
+        connect_controller (G_OBJECT (prop_edit), "color-set",
+                            object, spec, G_CALLBACK (rgba_modified));
+    }
   else
     {  
       msg = g_strdup_printf ("uneditable property type: %s",
diff --git a/src/slot-renderer.c b/src/slot-renderer.c
index ca2ae45..c31d3bb 100644
--- a/src/slot-renderer.c
+++ b/src/slot-renderer.c
@@ -100,18 +100,31 @@ enum
 };
 
 static void
+clutter_color_from_gdk_rgba (ClutterColor *clutter_color,
+                             const GdkRGBA *rgba)
+{
+  clutter_color->red   = rgba->red   * 255.;
+  clutter_color->green = rgba->green * 255.;
+  clutter_color->blue  = rgba->blue  * 255.;
+  clutter_color->alpha = rgba->alpha * 255.;
+}
+
+static void
 sync_style_selection_color (ArStyle *style,
                             GParamSpec *pspec,
                             AisleriotSlotRenderer *srend)
 {
   AisleriotSlotRendererPrivate *priv = srend->priv;
-  ClutterColor color;
+  GdkRGBA color;
+  ClutterColor clutter_color;
 
   ar_style_get_selection_color (style, &color);
-  if (clutter_color_equal (&color, &priv->highlight_color))
+  clutter_color_from_gdk_rgba (&clutter_color, &color);
+
+  if (clutter_color_equal (&clutter_color, &priv->highlight_color))
     return;
 
-  priv->highlight_color = color;
+  priv->highlight_color = clutter_color;
 
   if (priv->show_highlight)
     clutter_actor_queue_redraw (CLUTTER_ACTOR (srend));



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