+static void
+scale_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GtkColorScale *scale = GTK_COLOR_SCALE (object);
+
+ switch (prop_id)
+ {
+ case PROP_SCALE_TYPE:
+ scale_set_type (scale, (GtkColorScaleType)g_value_get_int (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+hold_action (GtkPressAndHold *pah,
+ gint x,
+ gint y,
+ GtkColorScale *scale)
+{
+ gboolean handled;
+
+ g_signal_emit_by_name (scale, "popup-menu", &handled);
+}
+
+static gboolean
+scale_touch (GtkWidget *widget,
+ GdkEventTouch *event)
+{
+ GtkColorScale *scale = GTK_COLOR_SCALE (widget);
+
+ if (!scale->priv->press_and_hold)
+ {
+ gint drag_threshold;
+
+ g_object_get (gtk_widget_get_settings (widget),
+ "gtk-dnd-drag-threshold", &drag_threshold,
+ NULL);
+
+ scale->priv->press_and_hold = gtk_press_and_hold_new ();
+
+ g_object_set (scale->priv->press_and_hold,
+ "drag-threshold", drag_threshold,
+ "hold-time", 1000,
+ NULL);
+
+ g_signal_connect (scale->priv->press_and_hold, "hold",
+ G_CALLBACK (hold_action), scale);
+ }
+
+ gtk_press_and_hold_process_event (scale->priv->press_and_hold, (GdkEvent *)event);
+
+ return GTK_WIDGET_CLASS (gtk_color_scale_parent_class)->touch_event (widget, event);
+}
+
+
+static void
+gtk_color_scale_class_init (GtkColorScaleClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+
+ object_class->finalize = scale_finalize;
+ object_class->get_property = scale_get_property;
+ object_class->set_property = scale_set_property;
+
+ widget_class->draw = scale_draw;
+ widget_class->touch_event = scale_touch;
+
+ g_object_class_install_property (object_class, PROP_SCALE_TYPE,
+ g_param_spec_int ("scale-type", P_("Scale type"), P_("Scale type"),
+ 0, 1, 0,
+ GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+ g_type_class_add_private (class, sizeof (GtkColorScalePrivate));
+}
+
+void
+gtk_color_scale_set_rgba (GtkColorScale *scale,
+ const GdkRGBA *color)
+{
+ scale->priv->color = *color;
+ scale->priv->width = -1; /* force surface refresh */
+ create_surface (scale);
+ gtk_widget_queue_draw (GTK_WIDGET (scale));
+}
+