static void mate_color_button_get_property (GObject *object, guint param_id, GValue *value, GParamSpec *pspec) { MateColorButton *color_button = MATE_COLOR_BUTTON (object); GdkColor color; switch (param_id) { case PROP_USE_ALPHA: g_value_set_boolean (value, mate_color_button_get_use_alpha (color_button)); break; case PROP_TITLE: g_value_set_string (value, mate_color_button_get_title (color_button)); break; case PROP_COLOR: mate_color_button_get_color (color_button, &color); g_value_set_boxed (value, &color); break; case PROP_ALPHA: g_value_set_uint (value, mate_color_button_get_alpha (color_button)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); break; } }
static void dialog_cancel_clicked (GtkWidget *widget, gpointer data) { MateColorButton *color_button = MATE_COLOR_BUTTON (data); gtk_widget_hide (color_button->priv->cs_dialog); }
static gboolean dialog_destroy (GtkWidget *widget, gpointer data) { MateColorButton *color_button = MATE_COLOR_BUTTON (data); color_button->priv->cs_dialog = NULL; return FALSE; }
static void mate_color_button_clicked (GtkButton *button) { MateColorButton *color_button = MATE_COLOR_BUTTON (button); MateColorSelectionDialog *color_dialog; /* if dialog already exists, make sure it's shown and raised */ if (!color_button->priv->cs_dialog) { /* Create the dialog and connects its buttons */ GtkWidget *parent; parent = gtk_widget_get_toplevel (GTK_WIDGET (color_button)); color_button->priv->cs_dialog = mate_color_selection_dialog_new (color_button->priv->title); color_dialog = MATE_COLOR_SELECTION_DIALOG (color_button->priv->cs_dialog); if (gtk_widget_is_toplevel (parent) && GTK_IS_WINDOW (parent)) { if (GTK_WINDOW (parent) != gtk_window_get_transient_for (GTK_WINDOW (color_dialog))) gtk_window_set_transient_for (GTK_WINDOW (color_dialog), GTK_WINDOW (parent)); gtk_window_set_modal (GTK_WINDOW (color_dialog), gtk_window_get_modal (GTK_WINDOW (parent))); } g_signal_connect (color_dialog->ok_button, "clicked", G_CALLBACK (dialog_ok_clicked), color_button); g_signal_connect (color_dialog->cancel_button, "clicked", G_CALLBACK (dialog_cancel_clicked), color_button); g_signal_connect (color_dialog, "destroy", G_CALLBACK (dialog_destroy), color_button); } color_dialog = MATE_COLOR_SELECTION_DIALOG (color_button->priv->cs_dialog); mate_color_selection_set_has_opacity_control (MATE_COLOR_SELECTION (color_dialog->colorsel), color_button->priv->use_alpha); mate_color_selection_set_has_palette (MATE_COLOR_SELECTION (color_dialog->colorsel), TRUE); mate_color_selection_set_previous_color (MATE_COLOR_SELECTION (color_dialog->colorsel), &color_button->priv->color); mate_color_selection_set_previous_alpha (MATE_COLOR_SELECTION (color_dialog->colorsel), color_button->priv->alpha); mate_color_selection_set_current_color (MATE_COLOR_SELECTION (color_dialog->colorsel), &color_button->priv->color); mate_color_selection_set_current_alpha (MATE_COLOR_SELECTION (color_dialog->colorsel), color_button->priv->alpha); gtk_window_present (GTK_WINDOW (color_button->priv->cs_dialog)); }
static void mate_color_button_finalize (GObject *object) { MateColorButton *color_button = MATE_COLOR_BUTTON (object); if (color_button->priv->cs_dialog != NULL) gtk_widget_destroy (color_button->priv->cs_dialog); color_button->priv->cs_dialog = NULL; g_free (color_button->priv->title); color_button->priv->title = NULL; G_OBJECT_CLASS (mate_color_button_parent_class)->finalize (object); }
/* Handle exposure events for the color picker's drawing area */ static gboolean draw (GtkWidget *widget, cairo_t *cr, gpointer data) { MateColorButton *color_button = MATE_COLOR_BUTTON (data); cairo_pattern_t *checkered; if (mate_color_button_has_alpha (color_button)) { cairo_save (cr); cairo_set_source_rgb (cr, CHECK_DARK, CHECK_DARK, CHECK_DARK); cairo_paint (cr); cairo_set_source_rgb (cr, CHECK_LIGHT, CHECK_LIGHT, CHECK_LIGHT); cairo_scale (cr, CHECK_SIZE, CHECK_SIZE); checkered = mate_color_button_get_checkered (); cairo_mask (cr, checkered); cairo_pattern_destroy (checkered); cairo_restore (cr); cairo_set_source_rgba (cr, color_button->priv->color.red / 65535., color_button->priv->color.green / 65535., color_button->priv->color.blue / 65535., color_button->priv->alpha / 65535.); } else { gdk_cairo_set_source_color (cr, &color_button->priv->color); } cairo_paint (cr); if (!gtk_widget_is_sensitive (GTK_WIDGET (color_button))) { gdk_cairo_set_source_color (cr, >k_widget_get_style (GTK_WIDGET(color_button))->bg[GTK_STATE_INSENSITIVE]); checkered = mate_color_button_get_checkered (); cairo_mask (cr, checkered); cairo_pattern_destroy (checkered); } return FALSE; }
static void dialog_ok_clicked (GtkWidget *widget, gpointer data) { MateColorButton *color_button = MATE_COLOR_BUTTON (data); MateColorSelection *color_selection; color_selection = MATE_COLOR_SELECTION (MATE_COLOR_SELECTION_DIALOG (color_button->priv->cs_dialog)->colorsel); mate_color_selection_get_current_color (color_selection, &color_button->priv->color); color_button->priv->alpha = mate_color_selection_get_current_alpha (color_selection); gtk_widget_hide (color_button->priv->cs_dialog); gtk_widget_queue_draw (color_button->priv->draw_area); g_signal_emit (color_button, color_button_signals[COLOR_SET], 0); g_object_freeze_notify (G_OBJECT (color_button)); g_object_notify (G_OBJECT (color_button), "color"); g_object_notify (G_OBJECT (color_button), "alpha"); g_object_thaw_notify (G_OBJECT (color_button)); }
static gint expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer data) #endif { MateColorButton *color_button = MATE_COLOR_BUTTON (data); GtkAllocation allocation; cairo_pattern_t *checkered; #if !GTK_CHECK_VERSION (3, 0, 0) cairo_t *cr; cr = gdk_cairo_create (event->window); gtk_widget_get_allocation (widget, &allocation); gdk_cairo_rectangle (cr, &allocation); cairo_clip (cr); #endif if (mate_color_button_has_alpha (color_button)) { cairo_save (cr); cairo_set_source_rgb (cr, CHECK_DARK, CHECK_DARK, CHECK_DARK); cairo_paint (cr); cairo_set_source_rgb (cr, CHECK_LIGHT, CHECK_LIGHT, CHECK_LIGHT); cairo_scale (cr, CHECK_SIZE, CHECK_SIZE); checkered = mate_color_button_get_checkered (); cairo_mask (cr, checkered); cairo_pattern_destroy (checkered); cairo_restore (cr); cairo_set_source_rgba (cr, color_button->priv->color.red / 65535., color_button->priv->color.green / 65535., color_button->priv->color.blue / 65535., color_button->priv->alpha / 65535.); } else { gdk_cairo_set_source_color (cr, &color_button->priv->color); } cairo_paint (cr); if (!gtk_widget_is_sensitive (GTK_WIDGET (color_button))) { gdk_cairo_set_source_color (cr, >k_widget_get_style (GTK_WIDGET(color_button))->bg[GTK_STATE_INSENSITIVE]); checkered = mate_color_button_get_checkered (); cairo_mask (cr, checkered); cairo_pattern_destroy (checkered); } #if !GTK_CHECK_VERSION (3, 0, 0) cairo_destroy (cr); #endif return FALSE; }