]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcolorsel.c
Merge libgdk and libgtk
[~andy/gtk] / gtk / gtkcolorsel.c
index 96382faf21329d284380edd6c17526803004100c..2f029ac333227b2997909679eb47afc8b4f725c2 100644 (file)
  */
 
 #include "config.h"
+
+#include "gtkcolorsel.h"
+
 #include <math.h>
 #include <string.h>
 
-#include "gdkconfig.h"
-#include "gdk/gdkkeysyms.h"
-#include "gtkcolorsel.h"
+#include "gdk/gdk.h"
 #include "gtkhsv.h"
 #include "gtkwindow.h"
 #include "gtkselection.h"
 #include "gtksettings.h"
 #include "gtkstock.h"
 #include "gtkaccessible.h"
+#include "gtksizerequest.h"
 #include "gtkprivate.h"
 #include "gtkintl.h"
 
+
+/**
+ * SECTION:gtkcolorsel
+ * @Short_description: A widget used to select a color
+ * @Title: GtkColorSelection
+ *
+ * The #GtkColorSelection is a widget that is used to select
+ * a color.  It consists of a color wheel and number of sliders
+ * and entry boxes for color parameters such as hue, saturation,
+ * value, red, green, blue, and opacity.  It is found on the standard
+ * color selection dialog box #GtkColorSelectionDialog.
+ */
+
+
+/* Keep it in sync with gtksettings.c:default_color_palette */
+#define DEFAULT_COLOR_PALETTE   "black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90"
+
 /* Number of elements in the custom palatte */
 #define GTK_CUSTOM_PALETTE_WIDTH 10
 #define GTK_CUSTOM_PALETTE_HEIGHT 2
@@ -70,6 +89,7 @@
 /* The cursor for the dropper */
 #define DROPPER_WIDTH 17
 #define DROPPER_HEIGHT 17
+#define DROPPER_STRIDE (DROPPER_WIDTH * 4)
 #define DROPPER_X_HOT 2
 #define DROPPER_Y_HOT 16
 
@@ -95,7 +115,8 @@ enum {
   PROP_HAS_PALETTE,
   PROP_HAS_OPACITY_CONTROL,
   PROP_CURRENT_COLOR,
-  PROP_CURRENT_ALPHA
+  PROP_CURRENT_ALPHA,
+  PROP_CURRENT_RGBA
 };
 
 enum {
@@ -110,7 +131,7 @@ enum {
 };
 
 
-struct _ColorSelectionPrivate
+struct _GtkColorSelectionPrivate
 {
   guint has_opacity : 1;
   guint has_palette : 1;
@@ -155,7 +176,7 @@ struct _ColorSelectionPrivate
 };
 
 
-static void gtk_color_selection_destroy                (GtkObject               *object);
+static void gtk_color_selection_destroy                (GtkWidget               *widget);
 static void gtk_color_selection_finalize        (GObject                *object);
 static void update_color                       (GtkColorSelection       *colorsel);
 static void gtk_color_selection_set_property    (GObject                 *object,
@@ -187,7 +208,7 @@ static void     default_change_palette_func             (GdkScreen     *screen,
 static void     make_control_relations                  (AtkObject         *atk_obj,
                                                          GtkWidget         *widget);
 static void     make_all_relations                      (AtkObject         *atk_obj,
-                                                         ColorSelectionPrivate *priv);
+                                                         GtkColorSelectionPrivate *priv);
 
 static void    hsv_changed                             (GtkWidget         *hsv,
                                                         gpointer           data);
@@ -231,24 +252,51 @@ static void shutdown_eyedropper (GtkWidget *widget);
 
 static guint color_selection_signals[LAST_SIGNAL] = { 0 };
 
-static const gchar default_colors[] = "black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90";
-
 static GtkColorSelectionChangePaletteFunc noscreen_change_palette_hook = default_noscreen_change_palette_func;
 static GtkColorSelectionChangePaletteWithScreenFunc change_palette_hook = default_change_palette_func;
 
 static const guchar dropper_bits[] = {
-  0xff, 0x8f, 0x01, 0xff, 0x77, 0x01, 0xff, 0xfb, 0x00, 0xff, 0xf8, 0x00,
-  0x7f, 0xff, 0x00, 0xff, 0x7e, 0x01, 0xff, 0x9d, 0x01, 0xff, 0xd8, 0x01,
-  0x7f, 0xd4, 0x01, 0x3f, 0xee, 0x01, 0x1f, 0xff, 0x01, 0x8f, 0xff, 0x01,
-  0xc7, 0xff, 0x01, 0xe3, 0xff, 0x01, 0xf3, 0xff, 0x01, 0xfd, 0xff, 0x01,
-  0xff, 0xff, 0x01, };
-
-static const guchar dropper_mask[] = {
-  0x00, 0x70, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xff, 0x01,
-  0x80, 0xff, 0x01, 0x00, 0xff, 0x00, 0x00, 0x7f, 0x00, 0x80, 0x3f, 0x00,
-  0xc0, 0x3f, 0x00, 0xe0, 0x13, 0x00, 0xf0, 0x01, 0x00, 0xf8, 0x00, 0x00,
-  0x7c, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0d, 0x00, 0x00,
-  0x02, 0x00, 0x00, };
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\0\0\0\377"
+  "\0\0\0\377\0\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377"
+  "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377\377"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\377\0\0"
+  "\0\377\0\0\0\377\0\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\0\0\0\377\0\0\0\377\0"
+  "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377"
+  "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\377\377\377\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
+  "\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\0\0\0\377\0\0"
+  "\0\377\0\0\0\377\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\377\377\377"
+  "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\0\0\0\377\377\377\377\377\0\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\0\0\0\0\0\377\377"
+  "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0"
+  "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\0\0"
+  "\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\377\0\0\0"
+  "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
 
 G_DEFINE_TYPE (GtkColorSelection, gtk_color_selection, GTK_TYPE_VBOX)
 
@@ -256,7 +304,6 @@ static void
 gtk_color_selection_class_init (GtkColorSelectionClass *klass)
 {
   GObjectClass *gobject_class;
-  GtkObjectClass *object_class;
   GtkWidgetClass *widget_class;
   
   gobject_class = G_OBJECT_CLASS (klass);
@@ -264,10 +311,8 @@ gtk_color_selection_class_init (GtkColorSelectionClass *klass)
   gobject_class->set_property = gtk_color_selection_set_property;
   gobject_class->get_property = gtk_color_selection_get_property;
 
-  object_class = GTK_OBJECT_CLASS (klass);
-  object_class->destroy = gtk_color_selection_destroy;
-  
   widget_class = GTK_WIDGET_CLASS (klass);
+  widget_class->destroy = gtk_color_selection_destroy;
   widget_class->realize = gtk_color_selection_realize;
   widget_class->unrealize = gtk_color_selection_unrealize;
   widget_class->show_all = gtk_color_selection_show_all;
@@ -301,23 +346,39 @@ gtk_color_selection_class_init (GtkColorSelectionClass *klass)
                                                      P_("The current opacity value (0 fully transparent, 65535 fully opaque)"),
                                                      0, 65535, 65535,
                                                      GTK_PARAM_READWRITE));
-  
+
+  /**
+   * GtkColorSelection:current-rgba
+   *
+   * The current RGBA color.
+   *
+   * Since: 3.0
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_CURRENT_RGBA,
+                                   g_param_spec_boxed ("current-rgba",
+                                                       P_("Current RGBA"),
+                                                       P_("The current RGBA color"),
+                                                       GDK_TYPE_RGBA,
+                                                       GTK_PARAM_READWRITE));
+
+  /**
+   * GtkColorSelection::color-changed:
+   * @colorselection: the object which received the signal.
+   *
+   * This signal is emitted when the color changes in the #GtkColorSelection
+   * according to its update policy.
+   */
   color_selection_signals[COLOR_CHANGED] =
     g_signal_new (I_("color-changed"),
-                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_OBJECT_CLASS_TYPE (gobject_class),
                  G_SIGNAL_RUN_FIRST,
                  G_STRUCT_OFFSET (GtkColorSelectionClass, color_changed),
                  NULL, NULL,
                  _gtk_marshal_VOID__VOID,
                  G_TYPE_NONE, 0);
 
-  gtk_settings_install_property (g_param_spec_string ("gtk-color-palette",
-                                                      P_("Custom palette"),
-                                                      P_("Palette to use in the color selector"),
-                                                      default_colors,
-                                                      GTK_PARAM_READWRITE));
-
-   g_type_class_add_private (gobject_class, sizeof (ColorSelectionPrivate));
+  g_type_class_add_private (gobject_class, sizeof (GtkColorSelectionPrivate));
 }
 
 static void
@@ -329,21 +390,21 @@ gtk_color_selection_init (GtkColorSelection *colorsel)
   GtkAdjustment *adjust;
   GtkWidget *picker_image;
   gint i, j;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   AtkObject *atk_obj;
   GList *focus_chain = NULL;
   
   gtk_widget_push_composite_child ();
 
-  priv = colorsel->private_data = G_TYPE_INSTANCE_GET_PRIVATE (colorsel, GTK_TYPE_COLOR_SELECTION, ColorSelectionPrivate);
+  priv = colorsel->private_data = G_TYPE_INSTANCE_GET_PRIVATE (colorsel, GTK_TYPE_COLOR_SELECTION, GtkColorSelectionPrivate);
   priv->changing = FALSE;
   priv->default_set = FALSE;
   priv->default_alpha_set = FALSE;
   
-  top_hbox = gtk_hbox_new (FALSE, 12);
+  top_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
   gtk_box_pack_start (GTK_BOX (colorsel), top_hbox, FALSE, FALSE, 0);
   
-  vbox = gtk_vbox_new (FALSE, 6);
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
   priv->triangle_colorsel = gtk_hsv_new ();
   g_signal_connect (priv->triangle_colorsel, "changed",
                     G_CALLBACK (hsv_changed), colorsel);
@@ -353,7 +414,7 @@ gtk_color_selection_init (GtkColorSelection *colorsel)
   gtk_widget_set_tooltip_text (priv->triangle_colorsel,
                         _("Select the color you want from the outer ring. Select the darkness or lightness of that color using the inner triangle."));
   
-  hbox = gtk_hbox_new (FALSE, 6);
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
   gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
   
   frame = gtk_frame_new (NULL);
@@ -377,7 +438,7 @@ gtk_color_selection_init (GtkColorSelection *colorsel)
   gtk_widget_set_tooltip_text (button,
                         _("Click the eyedropper, then click a color anywhere on your screen to select that color."));
   
-  top_right_vbox = gtk_vbox_new (FALSE, 6);
+  top_right_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
   gtk_box_pack_start (GTK_BOX (top_hbox), top_right_vbox, FALSE, FALSE, 0);
   table = gtk_table_new (8, 6, FALSE);
   gtk_box_pack_start (GTK_BOX (top_right_vbox), table, FALSE, FALSE, 0);
@@ -397,14 +458,14 @@ gtk_color_selection_init (GtkColorSelection *colorsel)
                          _("Amount of green light in the color."));
   make_label_spinbutton (colorsel, &priv->blue_spinbutton, _("_Blue:"), table, 6, 2, COLORSEL_BLUE,
                          _("Amount of blue light in the color."));
-  gtk_table_attach_defaults (GTK_TABLE (table), gtk_hseparator_new (), 0, 8, 3, 4); 
+  gtk_table_attach_defaults (GTK_TABLE (table), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), 0, 8, 3, 4); 
 
   priv->opacity_label = gtk_label_new_with_mnemonic (_("Op_acity:")); 
   gtk_misc_set_alignment (GTK_MISC (priv->opacity_label), 0.0, 0.5); 
   gtk_table_attach_defaults (GTK_TABLE (table), priv->opacity_label, 0, 1, 4, 5); 
-  adjust = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 255.0, 1.0, 1.0, 0.0)); 
+  adjust = gtk_adjustment_new (0.0, 0.0, 255.0, 1.0, 1.0, 0.0);
   g_object_set_data (G_OBJECT (adjust), I_("COLORSEL"), colorsel); 
-  priv->opacity_slider = gtk_hscale_new (adjust);
+  priv->opacity_slider = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adjust);
   gtk_widget_set_tooltip_text (priv->opacity_slider,
                         _("Transparency of the color."));
   gtk_label_set_mnemonic_widget (GTK_LABEL (priv->opacity_label),
@@ -466,7 +527,7 @@ gtk_color_selection_init (GtkColorSelection *colorsel)
        }
     }
   set_selected_palette (colorsel, 0, 0);
-  priv->palette_frame = gtk_vbox_new (FALSE, 6);
+  priv->palette_frame = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
   label = gtk_label_new_with_mnemonic (_("_Palette:"));
   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
   gtk_box_pack_start (GTK_BOX (priv->palette_frame), label, FALSE, FALSE, 0);
@@ -535,6 +596,9 @@ gtk_color_selection_set_property (GObject         *object,
     case PROP_CURRENT_ALPHA:
       gtk_color_selection_set_current_alpha (colorsel, g_value_get_uint (value));
       break;
+    case PROP_CURRENT_RGBA:
+      gtk_color_selection_set_current_rgba (colorsel, g_value_get_boxed (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -566,19 +630,27 @@ gtk_color_selection_get_property (GObject     *object,
     case PROP_CURRENT_ALPHA:
       g_value_set_uint (value, gtk_color_selection_get_current_alpha (colorsel));
       break;
+    case PROP_CURRENT_RGBA:
+      {
+        GdkRGBA rgba;
+
+        gtk_color_selection_get_current_rgba (colorsel, &rgba);
+        g_value_set_boxed (value, &rgba);
+      }
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     }
 }
 
-/* GtkObject methods */
+/* GtkWidget methods */
 
 static void
-gtk_color_selection_destroy (GtkObject *object)
+gtk_color_selection_destroy (GtkWidget *widget)
 {
-  GtkColorSelection *cselection = GTK_COLOR_SELECTION (object);
-  ColorSelectionPrivate *priv = cselection->private_data;
+  GtkColorSelection *cselection = GTK_COLOR_SELECTION (widget);
+  GtkColorSelectionPrivate *priv = cselection->private_data;
 
   if (priv->dropper_grab_widget)
     {
@@ -586,16 +658,14 @@ gtk_color_selection_destroy (GtkObject *object)
       priv->dropper_grab_widget = NULL;
     }
 
-  GTK_OBJECT_CLASS (gtk_color_selection_parent_class)->destroy (object);
+  GTK_WIDGET_CLASS (gtk_color_selection_parent_class)->destroy (widget);
 }
 
-/* GtkWidget methods */
-
 static void
 gtk_color_selection_realize (GtkWidget *widget)
 {
   GtkColorSelection *colorsel = GTK_COLOR_SELECTION (widget);
-  ColorSelectionPrivate *priv = colorsel->private_data;
+  GtkColorSelectionPrivate *priv = colorsel->private_data;
   GtkSettings *settings = gtk_widget_get_settings (widget);
 
   priv->settings_connection =  g_signal_connect (settings,
@@ -611,7 +681,7 @@ static void
 gtk_color_selection_unrealize (GtkWidget *widget)
 {
   GtkColorSelection *colorsel = GTK_COLOR_SELECTION (widget);
-  ColorSelectionPrivate *priv = colorsel->private_data;
+  GtkColorSelectionPrivate *priv = colorsel->private_data;
   GtkSettings *settings = gtk_widget_get_settings (widget);
 
   g_signal_handler_disconnect (settings, priv->settings_connection);
@@ -644,14 +714,16 @@ gtk_color_selection_grab_broken (GtkWidget          *widget,
  *
  */
 
-static void color_sample_draw_sample (GtkColorSelection *colorsel, int which);
+static void color_sample_draw_sample (GtkColorSelection *colorsel,
+                                      int                which,
+                                      cairo_t *          cr);
 static void color_sample_update_samples (GtkColorSelection *colorsel);
 
 static void
 set_color_internal (GtkColorSelection *colorsel,
                    gdouble           *color)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   gint i;
   
   priv = colorsel->private_data;
@@ -702,7 +774,7 @@ color_sample_drag_begin (GtkWidget      *widget,
                         gpointer        data)
 {
   GtkColorSelection *colorsel = data;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   gdouble *colsrc;
   
   priv = colorsel->private_data;
@@ -734,7 +806,8 @@ color_sample_drop_handle (GtkWidget        *widget,
                          gpointer          data)
 {
   GtkColorSelection *colorsel = data;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
+  gint length;
   guint16 *vals;
   gdouble color[4];
   priv = colorsel->private_data;
@@ -745,21 +818,23 @@ color_sample_drop_handle (GtkWidget        *widget,
    * B
    * opacity
    */
-  
-  if (selection_data->length < 0)
+
+  length = gtk_selection_data_get_length (selection_data);
+
+  if (length < 0)
     return;
   
   /* We accept drops with the wrong format, since the KDE color
    * chooser incorrectly drops application/x-color with format 8.
    */
-  if (selection_data->length != 8)
+  if (length != 8)
     {
       g_warning ("Received invalid color data\n");
       return;
     }
-  
-  vals = (guint16 *)selection_data->data;
-  
+
+  vals = (guint16 *) gtk_selection_data_get_data (selection_data);
+
   if (widget == priv->cur_sample)
     {
       color[0] = (gdouble)vals[0] / 0xffff;
@@ -780,7 +855,7 @@ color_sample_drag_handle (GtkWidget        *widget,
                          gpointer          data)
 {
   GtkColorSelection *colorsel = data;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   guint16 vals[4];
   gdouble *colsrc;
   
@@ -803,12 +878,14 @@ color_sample_drag_handle (GtkWidget        *widget,
 
 /* which = 0 means draw old sample, which = 1 means draw new */
 static void
-color_sample_draw_sample (GtkColorSelection *colorsel, int which)
+color_sample_draw_sample (GtkColorSelection *colorsel,
+                          int                which,
+                          cairo_t           *cr)
 {
   GtkWidget *da;
-  gint x, y, wid, heig, goff;
-  ColorSelectionPrivate *priv;
-  cairo_t *cr;
+  gint x, y, goff;
+  GtkColorSelectionPrivate *priv;
+  int width, height;
   
   g_return_if_fail (colorsel != NULL);
   priv = colorsel->private_data;
@@ -824,28 +901,28 @@ color_sample_draw_sample (GtkColorSelection *colorsel, int which)
     }
   else
     {
+      GtkAllocation old_sample_allocation;
+
       da = priv->cur_sample;
-      goff =  priv->old_sample->allocation.width % 32;
+      gtk_widget_get_allocation (priv->old_sample, &old_sample_allocation);
+      goff =  old_sample_allocation.width % 32;
     }
 
-  cr = gdk_cairo_create (da->window);
-  
-  wid = da->allocation.width;
-  heig = da->allocation.height;
-
   /* Below needs tweaking for non-power-of-two */  
+  width = gtk_widget_get_allocated_width (da);
+  height = gtk_widget_get_allocated_height (da);
   
   if (priv->has_opacity)
     {
       /* Draw checks in background */
 
       cairo_set_source_rgb (cr, 0.5, 0.5, 0.5);
-      cairo_rectangle (cr, 0, 0, wid, heig);
+      cairo_rectangle (cr, 0, 0, width, height);
       cairo_fill (cr);
 
       cairo_set_source_rgb (cr, 0.75, 0.75, 0.75);
-      for (x = goff & -CHECK_SIZE; x < goff + wid; x += CHECK_SIZE)
-       for (y = 0; y < heig; y += CHECK_SIZE)
+      for (x = goff & -CHECK_SIZE; x < goff + width; x += CHECK_SIZE)
+       for (y = 0; y < height; y += CHECK_SIZE)
          if ((x / CHECK_SIZE + y / CHECK_SIZE) % 2 == 0)
            cairo_rectangle (cr, x - goff, y, CHECK_SIZE, CHECK_SIZE);
       cairo_fill (cr);
@@ -870,37 +947,35 @@ color_sample_draw_sample (GtkColorSelection *colorsel, int which)
                               priv->color[COLORSEL_OPACITY] : 1.0);
     }
 
-  cairo_rectangle (cr, 0, 0, wid, heig);
+  cairo_rectangle (cr, 0, 0, width, height);
   cairo_fill (cr);
-
-  cairo_destroy (cr);
 }
 
 
 static void
 color_sample_update_samples (GtkColorSelection *colorsel)
 {
-  ColorSelectionPrivate *priv = colorsel->private_data;
+  GtkColorSelectionPrivate *priv = colorsel->private_data;
   gtk_widget_queue_draw (priv->old_sample);
   gtk_widget_queue_draw (priv->cur_sample);
 }
 
 static gboolean
-color_old_sample_expose (GtkWidget         *da,
-                        GdkEventExpose    *event,
-                        GtkColorSelection *colorsel)
+color_old_sample_draw (GtkWidget         *da,
+                       cairo_t           *cr,
+                       GtkColorSelection *colorsel)
 {
-  color_sample_draw_sample (colorsel, 0);
+  color_sample_draw_sample (colorsel, 0, cr);
   return FALSE;
 }
 
 
 static gboolean
-color_cur_sample_expose (GtkWidget         *da,
-                        GdkEventExpose    *event,
-                        GtkColorSelection *colorsel)
+color_cur_sample_draw (GtkWidget         *da,
+                       cairo_t           *cr,
+                       GtkColorSelection *colorsel)
 {
-  color_sample_draw_sample (colorsel, 1);
+  color_sample_draw_sample (colorsel, 1, cr);
   return FALSE;
 }
 
@@ -910,7 +985,7 @@ color_sample_setup_dnd (GtkColorSelection *colorsel, GtkWidget *sample)
   static const GtkTargetEntry targets[] = {
     { "application/x-color", 0 }
   };
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   priv = colorsel->private_data;
   
   gtk_drag_source_set (sample,
@@ -948,7 +1023,7 @@ color_sample_setup_dnd (GtkColorSelection *colorsel, GtkWidget *sample)
 static void
 update_tooltips (GtkColorSelection *colorsel)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
 
   priv = colorsel->private_data;
 
@@ -973,11 +1048,11 @@ update_tooltips (GtkColorSelection *colorsel)
 static void
 color_sample_new (GtkColorSelection *colorsel)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   priv = colorsel->private_data;
   
-  priv->sample_area = gtk_hbox_new (FALSE, 0);
+  priv->sample_area = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
   priv->old_sample = gtk_drawing_area_new ();
   priv->cur_sample = gtk_drawing_area_new ();
 
@@ -986,11 +1061,11 @@ color_sample_new (GtkColorSelection *colorsel)
   gtk_box_pack_start (GTK_BOX (priv->sample_area), priv->cur_sample,
                      TRUE, TRUE, 0);
   
-  g_signal_connect (priv->old_sample, "expose-event",
-                   G_CALLBACK (color_old_sample_expose),
+  g_signal_connect (priv->old_sample, "draw",
+                   G_CALLBACK (color_old_sample_draw),
                    colorsel);
-  g_signal_connect (priv->cur_sample, "expose-event",
-                   G_CALLBACK (color_cur_sample_expose),
+  g_signal_connect (priv->cur_sample, "draw",
+                   G_CALLBACK (color_cur_sample_draw),
                    colorsel);
   
   color_sample_setup_dnd (colorsel, priv->old_sample);
@@ -1032,35 +1107,28 @@ palette_get_color (GtkWidget *drawing_area, gdouble *color)
   color[3] = 1.0;
 }
 
-static void
-palette_paint (GtkWidget    *drawing_area,
-              GdkRectangle *area,
-              gpointer      data)
+static gboolean
+palette_draw (GtkWidget *drawing_area,
+               cairo_t   *cr,
+              gpointer   data)
 {
-  cairo_t *cr;
   gint focus_width;
-    
-  if (drawing_area->window == NULL)
-    return;
-
-  cr = gdk_cairo_create (drawing_area->window);
 
-  gdk_cairo_set_source_color (cr, &drawing_area->style->bg[GTK_STATE_NORMAL]);
-  gdk_cairo_rectangle (cr, area);
-  cairo_fill (cr);
+  gdk_cairo_set_source_color (cr, &gtk_widget_get_style (drawing_area)->bg[GTK_STATE_NORMAL]);
+  cairo_paint (cr);
   
   if (gtk_widget_has_focus (drawing_area))
     {
       set_focus_line_attributes (drawing_area, cr, &focus_width);
 
       cairo_rectangle (cr,
-                      focus_width / 2., focus_width / 2.,
-                      drawing_area->allocation.width - focus_width,
-                      drawing_area->allocation.height - focus_width);
+                       focus_width / 2., focus_width / 2.,
+                       gtk_widget_get_allocated_width (drawing_area) - focus_width,
+                       gtk_widget_get_allocated_height (drawing_area) - focus_width);
       cairo_stroke (cr);
     }
 
-  cairo_destroy (cr);
+  return FALSE;
 }
 
 static void
@@ -1166,13 +1234,13 @@ get_current_colors (GtkColorSelection *colorsel)
   gchar *palette;
 
   settings = gtk_widget_get_settings (GTK_WIDGET (colorsel));
-  g_object_get (settings,
-               "gtk-color-palette", &palette,
-               NULL);
+  g_object_get (settings, "gtk-color-palette", &palette, NULL);
   
   if (!gtk_color_selection_palette_from_string (palette, &colors, &n_colors))
     {
-      gtk_color_selection_palette_from_string (default_colors, &colors, &n_colors);
+      gtk_color_selection_palette_from_string (DEFAULT_COLOR_PALETTE,
+                                               &colors,
+                                               &n_colors);
     }
   else
     {
@@ -1184,14 +1252,17 @@ get_current_colors (GtkColorSelection *colorsel)
          GdkColor *tmp_colors = colors;
          gint tmp_n_colors = n_colors;
          
-         gtk_color_selection_palette_from_string (default_colors, &colors, &n_colors);
+         gtk_color_selection_palette_from_string (DEFAULT_COLOR_PALETTE,
+                                                   &colors,
+                                                   &n_colors);
          memcpy (colors, tmp_colors, sizeof (GdkColor) * tmp_n_colors);
 
          g_free (tmp_colors);
        }
     }
 
-  g_assert (n_colors >= GTK_CUSTOM_PALETTE_WIDTH * GTK_CUSTOM_PALETTE_HEIGHT);
+  /* make sure that we fill every slot */
+  g_assert (n_colors == GTK_CUSTOM_PALETTE_WIDTH * GTK_CUSTOM_PALETTE_HEIGHT);
   g_free (palette);
   
   return colors;
@@ -1204,7 +1275,7 @@ palette_change_color (GtkWidget         *drawing_area,
                       gdouble           *color)
 {
   gint x, y;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   GdkColor gdk_color;
   GdkColor *current_colors;
   GdkScreen *screen;
@@ -1304,19 +1375,6 @@ palette_set_color (GtkWidget         *drawing_area,
   g_object_set_data_full (G_OBJECT (drawing_area), I_("color_val"), new_color, (GDestroyNotify)g_free);
 }
 
-static gboolean
-palette_expose (GtkWidget      *drawing_area,
-               GdkEventExpose *event,
-               gpointer        data)
-{
-  if (drawing_area->window == NULL)
-    return FALSE;
-  
-  palette_paint (drawing_area, &(event->area), data);
-  
-  return FALSE;
-}
-
 static void
 popup_position_func (GtkMenu   *menu,
                      gint      *x,
@@ -1324,6 +1382,7 @@ popup_position_func (GtkMenu   *menu,
                      gboolean  *push_in,
                      gpointer  user_data)
 {
+  GtkAllocation allocation;
   GtkWidget *widget;
   GtkRequisition req;      
   gint root_x, root_y;
@@ -1333,13 +1392,16 @@ popup_position_func (GtkMenu   *menu,
   
   g_return_if_fail (gtk_widget_get_realized (widget));
 
-  gdk_window_get_origin (widget->window, &root_x, &root_y);
-  
-  gtk_widget_size_request (GTK_WIDGET (menu), &req);
+  gdk_window_get_origin (gtk_widget_get_window (widget),
+                         &root_x, &root_y);
+
+  gtk_widget_get_preferred_size (GTK_WIDGET (menu),
+                                 &req, NULL);
+  gtk_widget_get_allocation (widget, &allocation);
 
   /* Put corner of menu centered on color cell */
-  *x = root_x + widget->allocation.width / 2;
-  *y = root_y + widget->allocation.height / 2;
+  *x = root_x + allocation.width / 2;
+  *y = root_y + allocation.height / 2;
 
   /* Ensure sanity */
   screen = gtk_widget_get_screen (widget);
@@ -1353,7 +1415,7 @@ save_color_selected (GtkWidget *menuitem,
 {
   GtkColorSelection *colorsel;
   GtkWidget *drawing_area;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
 
   drawing_area = GTK_WIDGET (data);
   
@@ -1473,23 +1535,26 @@ palette_drop_handle (GtkWidget        *widget,
                     gpointer          data)
 {
   GtkColorSelection *colorsel = GTK_COLOR_SELECTION (data);
+  gint length;
   guint16 *vals;
   gdouble color[4];
-  
-  if (selection_data->length < 0)
+
+  length = gtk_selection_data_get_length (selection_data);
+
+  if (length < 0)
     return;
   
   /* We accept drops with the wrong format, since the KDE color
    * chooser incorrectly drops application/x-color with format 8.
    */
-  if (selection_data->length != 8)
+  if (length != 8)
     {
       g_warning ("Received invalid color data\n");
       return;
     }
-  
-  vals = (guint16 *)selection_data->data;
-  
+
+  vals = (guint16 *) gtk_selection_data_get_data (selection_data);
+
   color[0] = (gdouble)vals[0] / 0xffff;
   color[1] = (gdouble)vals[1] / 0xffff;
   color[2] = (gdouble)vals[2] / 0xffff;
@@ -1504,11 +1569,11 @@ palette_activate (GtkWidget   *widget,
                  gpointer     data)
 {
   /* should have a drawing area subclass with an activate signal */
-  if ((event->keyval == GDK_space) ||
-      (event->keyval == GDK_Return) ||
-      (event->keyval == GDK_ISO_Enter) ||
-      (event->keyval == GDK_KP_Enter) ||
-      (event->keyval == GDK_KP_Space))
+  if ((event->keyval == GDK_KEY_space) ||
+      (event->keyval == GDK_KEY_Return) ||
+      (event->keyval == GDK_KEY_ISO_Enter) ||
+      (event->keyval == GDK_KEY_KP_Enter) ||
+      (event->keyval == GDK_KEY_KP_Space))
     {
       if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "color_set")) != 0)
         {
@@ -1537,7 +1602,7 @@ static GtkWidget*
 palette_new (GtkColorSelection *colorsel)
 {
   GtkWidget *retval;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   static const GtkTargetEntry targets[] = {
     { "application/x-color", 0 }
@@ -1556,8 +1621,8 @@ palette_new (GtkColorSelection *colorsel)
                          | GDK_ENTER_NOTIFY_MASK
                          | GDK_LEAVE_NOTIFY_MASK);
   
-  g_signal_connect (retval, "expose-event",
-                   G_CALLBACK (palette_expose), colorsel);
+  g_signal_connect (retval, "draw",
+                   G_CALLBACK (palette_draw), colorsel);
   g_signal_connect (retval, "button-press-event",
                    G_CALLBACK (palette_press), colorsel);
   g_signal_connect (retval, "button-release-event",
@@ -1605,26 +1670,19 @@ make_picker_cursor (GdkScreen *screen)
 
   if (!cursor)
     {
-      GdkColor bg = { 0, 0xffff, 0xffff, 0xffff };
-      GdkColor fg = { 0, 0x0000, 0x0000, 0x0000 };
-      GdkWindow *window;
-      GdkPixmap *pixmap, *mask;
+      GdkPixbuf *pixbuf;
 
-      window = gdk_screen_get_root_window (screen);
-      
-      pixmap =
-       gdk_bitmap_create_from_data (window, (gchar *) dropper_bits,
-                                    DROPPER_WIDTH, DROPPER_HEIGHT);
-      
-      mask =
-       gdk_bitmap_create_from_data (window, (gchar *) dropper_mask,
-                                    DROPPER_WIDTH, DROPPER_HEIGHT);
-      
-      cursor = gdk_cursor_new_from_pixmap (pixmap, mask, &fg, &bg,
+      pixbuf = gdk_pixbuf_new_from_data (dropper_bits,
+                                         GDK_COLORSPACE_RGB, TRUE, 8,
+                                         DROPPER_WIDTH, DROPPER_HEIGHT,
+                                         DROPPER_STRIDE,
+                                         NULL, NULL);
+
+      cursor = gdk_cursor_new_from_pixbuf (gdk_screen_get_display (screen),
+                                           pixbuf,
                                           DROPPER_X_HOT, DROPPER_Y_HOT);
       
-      g_object_unref (pixmap);
-      g_object_unref (mask);
+      g_object_unref (pixbuf);
     }
       
   return cursor;
@@ -1637,33 +1695,37 @@ grab_color_at_pointer (GdkScreen *screen,
                        gint       y_root,
                        gpointer   data)
 {
-  GdkImage *image;
-  guint32 pixel;
+  GdkPixbuf *pixbuf;
+  guchar *pixels;
   GtkColorSelection *colorsel = data;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   GdkColor color;
-  GdkColormap *colormap = gdk_screen_get_system_colormap (screen);
   GdkWindow *root_window = gdk_screen_get_root_window (screen);
   
   priv = colorsel->private_data;
   
-  image = gdk_drawable_get_image (root_window, x_root, y_root, 1, 1);
-  if (!image)
+  pixbuf = gdk_pixbuf_get_from_window (root_window,
+                                       x_root, y_root,
+                                       1, 1);
+  if (!pixbuf)
     {
       gint x, y;
       GdkDisplay *display = gdk_screen_get_display (screen);
       GdkWindow *window = gdk_display_get_window_at_device_position (display, device, &x, &y);
       if (!window)
        return;
-      image = gdk_drawable_get_image (window, x, y, 1, 1);
-      if (!image)
+      pixbuf = gdk_pixbuf_get_from_window (window,
+                                           x, y,
+                                           1, 1);
+      if (!pixbuf)
        return;
     }
-  pixel = gdk_image_get_pixel (image, 0, 0);
-  g_object_unref (image);
+  pixels = gdk_pixbuf_get_pixels (pixbuf);
+  color.red = pixels[0] * 0x101;
+  color.green = pixels[1] * 0x101;
+  color.blue = pixels[2] * 0x101;
+  g_object_unref (pixbuf);
 
-  gdk_colormap_query_color (colormap, pixel, &color);
-  
   priv->color[COLORSEL_RED] = SCALE (color.red);
   priv->color[COLORSEL_GREEN] = SCALE (color.green);
   priv->color[COLORSEL_BLUE] = SCALE (color.blue);
@@ -1682,7 +1744,7 @@ static void
 shutdown_eyedropper (GtkWidget *widget)
 {
   GtkColorSelection *colorsel;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
 
   colorsel = GTK_COLOR_SELECTION (widget);
   priv = colorsel->private_data;
@@ -1758,15 +1820,15 @@ key_press (GtkWidget   *invisible,
 
   switch (event->keyval) 
     {
-    case GDK_space:
-    case GDK_Return:
-    case GDK_ISO_Enter:
-    case GDK_KP_Enter:
-    case GDK_KP_Space:
+    case GDK_KEY_space:
+    case GDK_KEY_Return:
+    case GDK_KEY_ISO_Enter:
+    case GDK_KEY_KP_Enter:
+    case GDK_KEY_KP_Space:
       grab_color_at_pointer (screen, pointer_device, x, y, data);
       /* fall through */
 
-    case GDK_Escape:
+    case GDK_KEY_Escape:
       shutdown_eyedropper (data);
       
       g_signal_handlers_disconnect_by_func (invisible,
@@ -1779,23 +1841,23 @@ key_press (GtkWidget   *invisible,
       return TRUE;
 
 #if defined GDK_WINDOWING_X11 || defined GDK_WINDOWING_WIN32
-    case GDK_Up:
-    case GDK_KP_Up:
+    case GDK_KEY_Up:
+    case GDK_KEY_KP_Up:
       dy = state == GDK_MOD1_MASK ? -BIG_STEP : -1;
       break;
 
-    case GDK_Down:
-    case GDK_KP_Down:
+    case GDK_KEY_Down:
+    case GDK_KEY_KP_Down:
       dy = state == GDK_MOD1_MASK ? BIG_STEP : 1;
       break;
 
-    case GDK_Left:
-    case GDK_KP_Left:
+    case GDK_KEY_Left:
+    case GDK_KEY_KP_Left:
       dx = state == GDK_MOD1_MASK ? -BIG_STEP : -1;
       break;
 
-    case GDK_Right:
-    case GDK_KP_Right:
+    case GDK_KEY_Right:
+    case GDK_KEY_KP_Right:
       dx = state == GDK_MOD1_MASK ? BIG_STEP : 1;
       break;
 #endif
@@ -1843,18 +1905,19 @@ static void
 get_screen_color (GtkWidget *button)
 {
   GtkColorSelection *colorsel = g_object_get_data (G_OBJECT (button), "COLORSEL");
-  ColorSelectionPrivate *priv = colorsel->private_data;
+  GtkColorSelectionPrivate *priv = colorsel->private_data;
   GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (button));
   GdkDevice *device, *keyb_device, *pointer_device;
   GdkCursor *picker_cursor;
   GdkGrabStatus grab_status;
+  GdkWindow *window;
   GtkWidget *grab_widget, *toplevel;
 
   guint32 time = gtk_get_current_event_time ();
 
   device = gtk_get_current_event_device ();
 
-  if (device->source == GDK_SOURCE_KEYBOARD)
+  if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
     {
       keyb_device = device;
       pointer_device = gdk_device_get_associated_device (device);
@@ -1880,16 +1943,18 @@ get_screen_color (GtkWidget *button)
   
       if (GTK_IS_WINDOW (toplevel))
        {
-         if (GTK_WINDOW (toplevel)->group)
-           gtk_window_group_add_window (GTK_WINDOW (toplevel)->group, 
+          if (gtk_window_has_group (GTK_WINDOW (toplevel)))
+           gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)),
                                         GTK_WINDOW (grab_widget));
        }
 
       priv->dropper_grab_widget = grab_widget;
     }
 
+  window = gtk_widget_get_window (priv->dropper_grab_widget);
+
   if (gdk_device_grab (keyb_device,
-                       priv->dropper_grab_widget->window,
+                       window,
                        GDK_OWNERSHIP_APPLICATION, FALSE,
                        GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
                        NULL, time) != GDK_GRAB_SUCCESS)
@@ -1897,7 +1962,7 @@ get_screen_color (GtkWidget *button)
 
   picker_cursor = make_picker_cursor (screen);
   grab_status = gdk_device_grab (pointer_device,
-                                 priv->dropper_grab_widget->window,
+                                 window,
                                  GDK_OWNERSHIP_APPLICATION,
                                  FALSE,
                                  GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK,
@@ -1931,7 +1996,7 @@ hex_changed (GtkWidget *hex_entry,
             gpointer   data)
 {
   GtkColorSelection *colorsel;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   GdkColor color;
   gchar *text;
   
@@ -1973,7 +2038,7 @@ hsv_changed (GtkWidget *hsv,
             gpointer   data)
 {
   GtkColorSelection *colorsel;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   colorsel = GTK_COLOR_SELECTION (data);
   priv = colorsel->private_data;
@@ -1999,7 +2064,7 @@ adjustment_changed (GtkAdjustment *adjustment,
                    gpointer       data)
 {
   GtkColorSelection *colorsel;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   colorsel = GTK_COLOR_SELECTION (g_object_get_data (G_OBJECT (adjustment), "COLORSEL"));
   priv = colorsel->private_data;
@@ -2052,7 +2117,7 @@ opacity_entry_changed (GtkWidget *opacity_entry,
                       gpointer   data)
 {
   GtkColorSelection *colorsel;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   GtkAdjustment *adj;
   gchar *text;
   
@@ -2086,16 +2151,16 @@ make_label_spinbutton (GtkColorSelection *colorsel,
 
   if (channel_type == COLORSEL_HUE)
     {
-      adjust = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 360.0, 1.0, 1.0, 0.0));
+      adjust = gtk_adjustment_new (0.0, 0.0, 360.0, 1.0, 1.0, 0.0);
     }
   else if (channel_type == COLORSEL_SATURATION ||
           channel_type == COLORSEL_VALUE)
     {
-      adjust = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 100.0, 1.0, 1.0, 0.0));
+      adjust = gtk_adjustment_new (0.0, 0.0, 100.0, 1.0, 1.0, 0.0);
     }
   else
     {
-      adjust = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 255.0, 1.0, 1.0, 0.0));
+      adjust = gtk_adjustment_new (0.0, 0.0, 255.0, 1.0, 1.0, 0.0);
     }
   g_object_set_data (G_OBJECT (adjust), I_("COLORSEL"), colorsel);
   *spinbutton = gtk_spin_button_new (adjust, 10.0, 0);
@@ -2120,7 +2185,7 @@ make_palette_frame (GtkColorSelection *colorsel,
                    gint               j)
 {
   GtkWidget *frame;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   priv = colorsel->private_data;
   frame = gtk_frame_new (NULL);
@@ -2135,7 +2200,7 @@ make_palette_frame (GtkColorSelection *colorsel,
 static void 
 set_selected_palette (GtkColorSelection *colorsel, int x, int y)
 {
-  ColorSelectionPrivate *priv = colorsel->private_data; 
+  GtkColorSelectionPrivate *priv = colorsel->private_data; 
 
   gtk_widget_grab_focus (priv->custom_palette[x][y]);
 }
@@ -2152,7 +2217,7 @@ scale_round (double val, double factor)
 static void
 update_color (GtkColorSelection *colorsel)
 {
-  ColorSelectionPrivate *priv = colorsel->private_data;
+  GtkColorSelectionPrivate *priv = colorsel->private_data;
   gchar entryval[12];
   gchar opacity_text[32];
   gchar *ptr;
@@ -2280,7 +2345,7 @@ GtkWidget *
 gtk_color_selection_new (void)
 {
   GtkColorSelection *colorsel;
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   gdouble color[4];
   color[0] = 1.0;
   color[1] = 1.0;
@@ -2311,7 +2376,7 @@ gtk_color_selection_new (void)
 gboolean
 gtk_color_selection_get_has_opacity_control (GtkColorSelection *colorsel)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   g_return_val_if_fail (GTK_IS_COLOR_SELECTION (colorsel), FALSE);
   
@@ -2332,7 +2397,7 @@ void
 gtk_color_selection_set_has_opacity_control (GtkColorSelection *colorsel,
                                             gboolean           has_opacity)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
   
@@ -2371,7 +2436,7 @@ gtk_color_selection_set_has_opacity_control (GtkColorSelection *colorsel,
 gboolean
 gtk_color_selection_get_has_palette (GtkColorSelection *colorsel)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   g_return_val_if_fail (GTK_IS_COLOR_SELECTION (colorsel), FALSE);
   
@@ -2392,7 +2457,7 @@ void
 gtk_color_selection_set_has_palette (GtkColorSelection *colorsel,
                                     gboolean           has_palette)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
   
   priv = colorsel->private_data;
@@ -2424,7 +2489,7 @@ void
 gtk_color_selection_set_current_color (GtkColorSelection *colorsel,
                                       const GdkColor    *color)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   gint i;
   
   g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
@@ -2462,7 +2527,7 @@ void
 gtk_color_selection_set_current_alpha (GtkColorSelection *colorsel,
                                       guint16            alpha)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   gint i;
   
   g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
@@ -2490,7 +2555,7 @@ void
 gtk_color_selection_get_current_color (GtkColorSelection *colorsel,
                                       GdkColor          *color)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
   g_return_if_fail (color != NULL);
@@ -2512,7 +2577,7 @@ gtk_color_selection_get_current_color (GtkColorSelection *colorsel,
 guint16
 gtk_color_selection_get_current_alpha (GtkColorSelection *colorsel)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   g_return_val_if_fail (GTK_IS_COLOR_SELECTION (colorsel), 0);
   
@@ -2534,7 +2599,7 @@ void
 gtk_color_selection_set_previous_color (GtkColorSelection *colorsel,
                                        const GdkColor    *color)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
   g_return_if_fail (color != NULL);
@@ -2567,7 +2632,7 @@ void
 gtk_color_selection_set_previous_alpha (GtkColorSelection *colorsel,
                                        guint16            alpha)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
   
@@ -2591,7 +2656,7 @@ void
 gtk_color_selection_get_previous_color (GtkColorSelection *colorsel,
                                        GdkColor           *color)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
   g_return_if_fail (color != NULL);
@@ -2613,7 +2678,7 @@ gtk_color_selection_get_previous_color (GtkColorSelection *colorsel,
 guint16
 gtk_color_selection_get_previous_alpha (GtkColorSelection *colorsel)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   g_return_val_if_fail (GTK_IS_COLOR_SELECTION (colorsel), 0);
   
@@ -2621,6 +2686,142 @@ gtk_color_selection_get_previous_alpha (GtkColorSelection *colorsel)
   return priv->has_opacity ? UNSCALE (priv->old_color[COLORSEL_OPACITY]) : 65535;
 }
 
+/**
+ * gtk_color_selection_set_current_rgba:
+ * @colorsel: a #GtkColorSelection.
+ * @rgba: A #GdkRGBA to set the current color with
+ *
+ * Sets the current color to be @rgba.  The first time this is called, it will
+ * also set the original color to be @rgba too.
+ *
+ * Since: 3.0
+ **/
+void
+gtk_color_selection_set_current_rgba (GtkColorSelection *colorsel,
+                                      const GdkRGBA     *rgba)
+{
+  GtkColorSelectionPrivate *priv;
+  gint i;
+
+  g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
+  g_return_if_fail (rgba != NULL);
+
+  priv = colorsel->private_data;
+  priv->changing = TRUE;
+
+  priv->color[COLORSEL_RED] = CLAMP (rgba->red, 0, 1);
+  priv->color[COLORSEL_GREEN] = CLAMP (rgba->green, 0, 1);
+  priv->color[COLORSEL_BLUE] = CLAMP (rgba->blue, 0, 1);
+  priv->color[COLORSEL_OPACITY] = CLAMP (rgba->alpha, 0, 1);
+
+  gtk_rgb_to_hsv (priv->color[COLORSEL_RED],
+                 priv->color[COLORSEL_GREEN],
+                 priv->color[COLORSEL_BLUE],
+                 &priv->color[COLORSEL_HUE],
+                 &priv->color[COLORSEL_SATURATION],
+                 &priv->color[COLORSEL_VALUE]);
+
+  if (priv->default_set == FALSE)
+    {
+      for (i = 0; i < COLORSEL_NUM_CHANNELS; i++)
+       priv->old_color[i] = priv->color[i];
+    }
+
+  priv->default_set = TRUE;
+  update_color (colorsel);
+}
+
+/**
+ * gtk_color_selection_get_current_rgba:
+ * @colorsel: a #GtkColorSelection.
+ * @rgba: (out): a #GdkRGBA to fill in with the current color.
+ *
+ * Sets @rgba to be the current color in the GtkColorSelection widget.
+ *
+ * Since: 3.0
+ **/
+void
+gtk_color_selection_get_current_rgba (GtkColorSelection *colorsel,
+                                      GdkRGBA           *rgba)
+{
+  GtkColorSelectionPrivate *priv;
+
+  g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
+  g_return_if_fail (rgba != NULL);
+
+  priv = colorsel->private_data;
+  rgba->red = priv->color[COLORSEL_RED];
+  rgba->green = priv->color[COLORSEL_GREEN];
+  rgba->blue = priv->color[COLORSEL_BLUE];
+  rgba->alpha = (priv->has_opacity) ? priv->color[COLORSEL_OPACITY] : 1;
+}
+
+/**
+ * gtk_color_selection_set_previous_rgba:
+ * @colorsel: a #GtkColorSelection.
+ * @rgba: a #GdkRGBA to set the previous color with
+ *
+ * Sets the 'previous' color to be @rgba.  This function should be called with
+ * some hesitations, as it might seem confusing to have that color change.
+ * Calling gtk_color_selection_set_current_rgba() will also set this color the first
+ * time it is called.
+ *
+ * Since: 3.0
+ **/
+void
+gtk_color_selection_set_previous_rgba (GtkColorSelection *colorsel,
+                                       const GdkRGBA     *rgba)
+{
+  GtkColorSelectionPrivate *priv;
+
+  g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
+  g_return_if_fail (rgba != NULL);
+
+  priv = colorsel->private_data;
+  priv->changing = TRUE;
+
+  priv->old_color[COLORSEL_RED] = CLAMP (rgba->red, 0, 1);
+  priv->old_color[COLORSEL_GREEN] = CLAMP (rgba->green, 0, 1);
+  priv->old_color[COLORSEL_BLUE] = CLAMP (rgba->blue, 0, 1);
+  priv->old_color[COLORSEL_OPACITY] = CLAMP (rgba->alpha, 0, 1);
+
+  gtk_rgb_to_hsv (priv->old_color[COLORSEL_RED],
+                 priv->old_color[COLORSEL_GREEN],
+                 priv->old_color[COLORSEL_BLUE],
+                 &priv->old_color[COLORSEL_HUE],
+                 &priv->old_color[COLORSEL_SATURATION],
+                 &priv->old_color[COLORSEL_VALUE]);
+
+  color_sample_update_samples (colorsel);
+  priv->default_set = TRUE;
+  priv->changing = FALSE;
+}
+
+/**
+ * gtk_color_selection_get_previous_rgba:
+ * @colorsel: a #GtkColorSelection.
+ * @rgba: a #GdkRGBA to fill in with the original color value.
+ *
+ * Fills @rgba in with the original color value.
+ *
+ * Since: 3.0
+ **/
+void
+gtk_color_selection_get_previous_rgba (GtkColorSelection *colorsel,
+                                       GdkRGBA           *rgba)
+{
+  GtkColorSelectionPrivate *priv;
+
+  g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
+  g_return_if_fail (rgba != NULL);
+
+  priv = colorsel->private_data;
+  rgba->red = priv->old_color[COLORSEL_RED];
+  rgba->green = priv->old_color[COLORSEL_GREEN];
+  rgba->blue = priv->old_color[COLORSEL_BLUE];
+  rgba->alpha = (priv->has_opacity) ? priv->old_color[COLORSEL_OPACITY] : 1;
+}
+
 /**
  * gtk_color_selection_set_palette_color:
  * @colorsel: a #GtkColorSelection.
@@ -2635,7 +2836,7 @@ gtk_color_selection_set_palette_color (GtkColorSelection   *colorsel,
                                       gint                 index,
                                       GdkColor            *color)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   gint x, y;
   gdouble col[3];
   
@@ -2665,7 +2866,7 @@ gtk_color_selection_set_palette_color (GtkColorSelection   *colorsel,
 gboolean
 gtk_color_selection_is_adjusting (GtkColorSelection *colorsel)
 {
-  ColorSelectionPrivate *priv;
+  GtkColorSelectionPrivate *priv;
   
   g_return_val_if_fail (GTK_IS_COLOR_SELECTION (colorsel), FALSE);
   
@@ -2846,7 +3047,7 @@ make_control_relations (AtkObject *atk_obj,
 
 static void
 make_all_relations (AtkObject *atk_obj,
-                    ColorSelectionPrivate *priv)
+                    GtkColorSelectionPrivate *priv)
 {
   make_control_relations (atk_obj, priv->hue_spinbutton);
   make_control_relations (atk_obj, priv->sat_spinbutton);