diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gsm_color_button.c | 265 | ||||
-rw-r--r-- | src/gsm_color_button.h | 20 |
2 files changed, 145 insertions, 140 deletions
diff --git a/src/gsm_color_button.c b/src/gsm_color_button.c index d433cf6..3148c34 100644 --- a/src/gsm_color_button.c +++ b/src/gsm_color_button.c @@ -35,10 +35,7 @@ #include "gsm_color_button.h" -#define GSM_COLOR_BUTTON_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GSM_TYPE_COLOR_BUTTON, GSMColorButtonPrivate)) - -struct _GSMColorButtonPrivate -{ +typedef struct { GtkWidget *cc_dialog; /* Color chooser dialog */ gchar *title; /* Title for the color selection window */ @@ -51,7 +48,9 @@ struct _GSMColorButtonPrivate gdouble highlight; gboolean button_down; gboolean in_button; -}; +} GSMColorButtonPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (GSMColorButton, gsm_color_button, GTK_TYPE_DRAWING_AREA) /* Properties */ enum @@ -125,44 +124,8 @@ static void gsm_color_button_drag_data_received (GtkWidget * widget, static guint color_button_signals[LAST_SIGNAL] = { 0 }; -static gpointer gsm_color_button_parent_class = NULL; - static const GtkTargetEntry drop_types[] = { {"application/x-color", 0, 0} }; -GType -gsm_color_button_get_type () -{ - static GType gsm_color_button_type = 0; - - if (!gsm_color_button_type) - { - static const GTypeInfo gsm_color_button_info = { - sizeof (GSMColorButtonClass), - NULL, - NULL, - (GClassInitFunc) gsm_color_button_class_intern_init, - NULL, - NULL, - sizeof (GSMColorButton), - 0, - (GInstanceInitFunc) gsm_color_button_init, - }; - - gsm_color_button_type = - g_type_register_static (GTK_TYPE_DRAWING_AREA, "GSMColorButton", - &gsm_color_button_info, 0); - } - - return gsm_color_button_type; -} - -static void -gsm_color_button_class_intern_init (gpointer klass) -{ - gsm_color_button_parent_class = g_type_class_peek_parent (klass); - gsm_color_button_class_init ((GSMColorButtonClass *) klass); -} - static void gsm_color_button_class_init (GSMColorButtonClass * klass) { @@ -231,7 +194,6 @@ gsm_color_button_class_init (GSMColorButtonClass * klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - g_type_class_add_private (gobject_class, sizeof (GSMColorButtonPrivate)); } @@ -267,9 +229,12 @@ fill_image_buffer_from_file (cairo_t *cr, const char *filePath) static void render (GtkWidget * widget) { + GSMColorButtonPrivate *priv; GSMColorButton *color_button = GSM_COLOR_BUTTON (widget); + + priv = gsm_color_button_get_instance_private (color_button); GdkRGBA *color; - GdkRGBA tmp_color = color_button->priv->color; + GdkRGBA tmp_color = priv->color; color = &tmp_color; cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (widget)); cairo_path_t *path = NULL; @@ -277,8 +242,8 @@ render (GtkWidget * widget) gdouble radius, arc_start, arc_end; gdouble highlight_factor; - if (color_button->priv->highlight > 0) { - highlight_factor = 0.125 * color_button->priv->highlight; + if (priv->highlight > 0) { + highlight_factor = 0.125 * priv->highlight; if (color->red + highlight_factor > 1.0) color->red = 1.0; @@ -300,7 +265,7 @@ render (GtkWidget * widget) width = gdk_window_get_width(gtk_widget_get_window(widget)); height = gdk_window_get_height(gtk_widget_get_window(widget)); - switch (color_button->priv->type) + switch (priv->type) { case GSMCP_TYPE_CPU: //gtk_widget_set_size_request (widget, GSMCP_MIN_WIDTH, GSMCP_MIN_HEIGHT); @@ -322,16 +287,16 @@ render (GtkWidget * widget) else radius = height / 2; - arc_start = -G_PI_2 + 2 * G_PI * color_button->priv->fraction; + arc_start = -G_PI_2 + 2 * G_PI * priv->fraction; arc_end = -G_PI_2; cairo_set_line_width (cr, 1); // Draw external stroke and fill - if (color_button->priv->fraction < 0.01) { + if (priv->fraction < 0.01) { cairo_arc (cr, (width / 2) + .5, (height / 2) + .5, 4.5, 0, 2 * G_PI); - } else if (color_button->priv->fraction > 0.99) { + } else if (priv->fraction > 0.99) { cairo_arc (cr, (width / 2) + .5, (height / 2) + .5, radius - 2.25, 0, 2 * G_PI); } else { @@ -350,10 +315,10 @@ render (GtkWidget * widget) cairo_set_source_rgba (cr, 1, 1, 1, 0.45); cairo_set_line_width (cr, 1); - if (color_button->priv->fraction < 0.03) { + if (priv->fraction < 0.03) { cairo_arc (cr, (width / 2) + .5, (height / 2) + .5, 3.25, 0, 2 * G_PI); - } else if (color_button->priv->fraction > 0.99) { + } else if (priv->fraction > 0.99) { cairo_arc (cr, (width / 2) + .5, (height / 2) + .5, radius - 3.5, 0, 2 * G_PI); } else { @@ -378,8 +343,8 @@ render (GtkWidget * widget) break; case GSMCP_TYPE_NETWORK_IN: - if (color_button->priv->image_buffer == NULL) - color_button->priv->image_buffer = + if (priv->image_buffer == NULL) + priv->image_buffer = fill_image_buffer_from_file (cr, DATADIR "/pixmaps/mate-system-monitor/download.svg"); gtk_widget_set_size_request (widget, 32, 32); cairo_move_to (cr, 8.5, 1.5); @@ -403,14 +368,14 @@ render (GtkWidget * widget) cairo_append_path (cr, path); cairo_path_destroy(path); cairo_stroke (cr); - cairo_set_source_surface (cr, color_button->priv->image_buffer, 0.0, + cairo_set_source_surface (cr, priv->image_buffer, 0.0, 0.0); cairo_paint (cr); break; case GSMCP_TYPE_NETWORK_OUT: - if (color_button->priv->image_buffer == NULL) - color_button->priv->image_buffer = + if (priv->image_buffer == NULL) + priv->image_buffer = fill_image_buffer_from_file (cr, DATADIR "/pixmaps/mate-system-monitor/upload.svg"); gtk_widget_set_size_request (widget, 32, 32); cairo_move_to (cr, 16.5, 1.5); @@ -434,7 +399,7 @@ render (GtkWidget * widget) cairo_append_path (cr, path); cairo_path_destroy(path); cairo_stroke (cr); - cairo_set_source_surface (cr, color_button->priv->image_buffer, 0.0, + cairo_set_source_surface (cr, priv->image_buffer, 0.0, 0.0); cairo_paint (cr); @@ -525,6 +490,9 @@ gsm_color_button_drag_data_received (GtkWidget * widget, { gint length; guint16 *dropped; + GSMColorButtonPrivate *priv; + + priv = gsm_color_button_get_instance_private (color_button); length = gtk_selection_data_get_length (selection_data); @@ -543,11 +511,11 @@ gsm_color_button_drag_data_received (GtkWidget * widget, dropped = (guint16 *) gtk_selection_data_get_data (selection_data); - color_button->priv->color.red = dropped[0]; - color_button->priv->color.green = dropped[1]; - color_button->priv->color.blue = dropped[2]; + priv->color.red = dropped[0]; + priv->color.green = dropped[1]; + priv->color.blue = dropped[2]; - gtk_widget_queue_draw (GTK_WIDGET (&color_button->widget)); + gtk_widget_queue_draw (GTK_WIDGET(color_button)); g_signal_emit (color_button, color_button_signals[COLOR_SET], 0); @@ -579,9 +547,12 @@ static void gsm_color_button_drag_begin (GtkWidget * widget, GdkDragContext * context, gpointer data) { + GSMColorButtonPrivate *priv; GSMColorButton *color_button = data; - set_color_icon (context, &color_button->priv->color); + priv = gsm_color_button_get_instance_private (color_button); + + set_color_icon (context, &priv->color); } static void @@ -592,10 +563,13 @@ gsm_color_button_drag_data_get (GtkWidget * widget, guint time, GSMColorButton * color_button) { guint16 dropped[4]; + GSMColorButtonPrivate *priv; + + priv = gsm_color_button_get_instance_private (color_button); - dropped[0] = color_button->priv->color.red; - dropped[1] = color_button->priv->color.green; - dropped[2] = color_button->priv->color.blue; + dropped[0] = priv->color.red; + dropped[1] = priv->color.green; + dropped[2] = priv->color.blue; dropped[3] = 65535; // This widget doesn't care about alpha gtk_selection_data_set (selection_data, gtk_selection_data_get_target (selection_data), @@ -606,17 +580,19 @@ gsm_color_button_drag_data_get (GtkWidget * widget, static void gsm_color_button_init (GSMColorButton * color_button) { - color_button->priv = GSM_COLOR_BUTTON_GET_PRIVATE (color_button); + GSMColorButtonPrivate *priv; - color_button->priv->color.red = 0; - color_button->priv->color.green = 0; - color_button->priv->color.blue = 0; - color_button->priv->fraction = 0.5; - color_button->priv->type = GSMCP_TYPE_CPU; - color_button->priv->image_buffer = NULL; - color_button->priv->title = g_strdup (_("Pick a Color")); /* default title */ - color_button->priv->in_button = FALSE; - color_button->priv->button_down = FALSE; + priv = gsm_color_button_get_instance_private (color_button); + + priv->color.red = 0; + priv->color.green = 0; + priv->color.blue = 0; + priv->fraction = 0.5; + priv->type = GSMCP_TYPE_CPU; + priv->image_buffer = NULL; + priv->title = g_strdup (_("Pick a Color")); /* default title */ + priv->in_button = FALSE; + priv->button_down = FALSE; gtk_drag_dest_set (GTK_WIDGET (color_button), GTK_DEST_DEFAULT_MOTION | @@ -645,17 +621,20 @@ gsm_color_button_init (GSMColorButton * color_button) static void gsm_color_button_finalize (GObject * object) { + GSMColorButtonPrivate *priv; GSMColorButton *color_button = GSM_COLOR_BUTTON (object); - if (color_button->priv->cc_dialog != NULL) - gtk_widget_destroy (color_button->priv->cc_dialog); - color_button->priv->cc_dialog = NULL; + priv = gsm_color_button_get_instance_private (color_button); + + if (priv->cc_dialog != NULL) + gtk_widget_destroy (priv->cc_dialog); + priv->cc_dialog = NULL; - g_free (color_button->priv->title); - color_button->priv->title = NULL; + g_free (priv->title); + priv->title = NULL; - cairo_surface_destroy (color_button->priv->image_buffer); - color_button->priv->image_buffer = NULL; + cairo_surface_destroy (priv->image_buffer); + priv->image_buffer = NULL; G_OBJECT_CLASS (gsm_color_button_parent_class)->finalize (object); } @@ -670,17 +649,20 @@ gsm_color_button_new (const GdkRGBA * color, guint type) static void dialog_response (GtkWidget * widget, GtkResponseType response, gpointer data) { + GSMColorButtonPrivate *priv; GSMColorButton *color_button = GSM_COLOR_BUTTON (data); + + priv = gsm_color_button_get_instance_private (color_button); GtkColorChooser *color_chooser; if (response == GTK_RESPONSE_OK) { - color_chooser = GTK_COLOR_CHOOSER (color_button->priv->cc_dialog); + color_chooser = GTK_COLOR_CHOOSER (priv->cc_dialog); - gtk_color_chooser_get_rgba (color_chooser, &color_button->priv->color); + gtk_color_chooser_get_rgba (color_chooser, &priv->color); - gtk_widget_hide (color_button->priv->cc_dialog); + gtk_widget_hide (priv->cc_dialog); - gtk_widget_queue_draw (GTK_WIDGET (&color_button->widget)); + gtk_widget_queue_draw (GTK_WIDGET(color_button)); g_signal_emit (color_button, color_button_signals[COLOR_SET], 0); @@ -689,15 +671,18 @@ dialog_response (GtkWidget * widget, GtkResponseType response, gpointer data) g_object_thaw_notify (G_OBJECT (color_button)); } else /* (response == GTK_RESPONSE_CANCEL) */ - gtk_widget_hide (color_button->priv->cc_dialog); + gtk_widget_hide (priv->cc_dialog); } static gboolean dialog_destroy (GtkWidget * widget, gpointer data) { + GSMColorButtonPrivate *priv; GSMColorButton *color_button = GSM_COLOR_BUTTON (data); - color_button->priv->cc_dialog = NULL; + priv = gsm_color_button_get_instance_private (color_button); + + priv->cc_dialog = NULL; return FALSE; } @@ -705,10 +690,13 @@ dialog_destroy (GtkWidget * widget, gpointer data) static gint gsm_color_button_clicked (GtkWidget * widget, GdkEventButton * event) { + GSMColorButtonPrivate *priv; GSMColorButton *color_button = GSM_COLOR_BUTTON (widget); + priv = gsm_color_button_get_instance_private (color_button); + /* if dialog already exists, make sure it's shown and raised */ - if (!color_button->priv->cc_dialog) + if (!priv->cc_dialog) { /* Create the dialog and connects its buttons */ GtkWidget *cc_dialog; @@ -718,7 +706,7 @@ gsm_color_button_clicked (GtkWidget * widget, GdkEventButton * event) if (!gtk_widget_is_toplevel (parent)) parent = NULL; - cc_dialog = gtk_color_chooser_dialog_new (color_button->priv->title, GTK_WINDOW (parent)); + cc_dialog = gtk_color_chooser_dialog_new (priv->title, GTK_WINDOW (parent)); gtk_window_set_modal (GTK_WINDOW (cc_dialog), TRUE); @@ -728,13 +716,13 @@ gsm_color_button_clicked (GtkWidget * widget, GdkEventButton * event) g_signal_connect (cc_dialog, "destroy", G_CALLBACK (dialog_destroy), color_button); - color_button->priv->cc_dialog = cc_dialog; + priv->cc_dialog = cc_dialog; } - gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (color_button->priv->cc_dialog), - &color_button->priv->color); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->cc_dialog), + &priv->color); - gtk_window_present (GTK_WINDOW (color_button->priv->cc_dialog)); + gtk_window_present (GTK_WINDOW (priv->cc_dialog)); return 0; } @@ -744,8 +732,10 @@ gsm_color_button_pressed (GtkWidget * widget, GdkEventButton * event) { if ( (event->type == GDK_BUTTON_PRESS) && (event->button == 1) ) { + GSMColorButtonPrivate *priv; GSMColorButton *color_button = GSM_COLOR_BUTTON (widget); - color_button->priv->button_down = TRUE; + priv = gsm_color_button_get_instance_private (color_button); + priv->button_down = TRUE; } return 0; } @@ -753,10 +743,13 @@ gsm_color_button_pressed (GtkWidget * widget, GdkEventButton * event) static gint gsm_color_button_released (GtkWidget * widget, GdkEventButton * event) { + GSMColorButtonPrivate *priv; GSMColorButton *color_button = GSM_COLOR_BUTTON (widget); - if (color_button->priv->button_down && color_button->priv->in_button) + + priv = gsm_color_button_get_instance_private (color_button); + if (priv->button_down && priv->in_button) gsm_color_button_clicked (widget, event); - color_button->priv->button_down = FALSE; + priv->button_down = FALSE; return 0; } @@ -764,9 +757,12 @@ gsm_color_button_released (GtkWidget * widget, GdkEventButton * event) static gboolean gsm_color_button_enter_notify (GtkWidget * widget, GdkEventCrossing * event) { + GSMColorButtonPrivate *priv; GSMColorButton *color_button = GSM_COLOR_BUTTON (widget); - color_button->priv->highlight = 1.0; - color_button->priv->in_button = TRUE; + + priv = gsm_color_button_get_instance_private (color_button); + priv->highlight = 1.0; + priv->in_button = TRUE; gtk_widget_queue_draw(widget); return FALSE; } @@ -775,8 +771,11 @@ static gboolean gsm_color_button_leave_notify (GtkWidget * widget, GdkEventCrossing * event) { GSMColorButton *color_button = GSM_COLOR_BUTTON (widget); - color_button->priv->highlight = 0; - color_button->priv->in_button = FALSE; + GSMColorButtonPrivate *priv; + + priv = gsm_color_button_get_instance_private (color_button); + priv->highlight = 0; + priv->in_button = FALSE; gtk_widget_queue_draw(widget); return FALSE; } @@ -784,19 +783,25 @@ gsm_color_button_leave_notify (GtkWidget * widget, GdkEventCrossing * event) guint gsm_color_button_get_cbtype (GSMColorButton * color_button) { + GSMColorButtonPrivate *priv; g_return_val_if_fail (GSM_IS_COLOR_BUTTON (color_button), 0); - return color_button->priv->type; + priv = gsm_color_button_get_instance_private (color_button); + + return priv->type; } void gsm_color_button_set_cbtype (GSMColorButton * color_button, guint type) { + GSMColorButtonPrivate *priv; g_return_if_fail (GSM_IS_COLOR_BUTTON (color_button)); - color_button->priv->type = type; + priv = gsm_color_button_get_instance_private (color_button); + + priv->type = type; - gtk_widget_queue_draw (GTK_WIDGET (&color_button->widget)); + gtk_widget_queue_draw (GTK_WIDGET(color_button)); g_object_notify (G_OBJECT (color_button), "type"); } @@ -804,20 +809,26 @@ gsm_color_button_set_cbtype (GSMColorButton * color_button, guint type) gdouble gsm_color_button_get_fraction (GSMColorButton * color_button) { + GSMColorButtonPrivate *priv; g_return_val_if_fail (GSM_IS_COLOR_BUTTON (color_button), 0); - return color_button->priv->fraction; + priv = gsm_color_button_get_instance_private (color_button); + + return priv->fraction; } void gsm_color_button_set_fraction (GSMColorButton * color_button, gdouble fraction) { + GSMColorButtonPrivate *priv; g_return_if_fail (GSM_IS_COLOR_BUTTON (color_button)); - color_button->priv->fraction = fraction; + priv = gsm_color_button_get_instance_private (color_button); + + priv->fraction = fraction; - gtk_widget_queue_draw (GTK_WIDGET (&color_button->widget)); + gtk_widget_queue_draw (GTK_WIDGET(color_button)); g_object_notify (G_OBJECT (color_button), "fraction"); } @@ -825,27 +836,32 @@ gsm_color_button_set_fraction (GSMColorButton * color_button, void gsm_color_button_get_color (GSMColorButton * color_button, GdkRGBA * color) { + GSMColorButtonPrivate *priv; g_return_if_fail (GSM_IS_COLOR_BUTTON (color_button)); - color->red = color_button->priv->color.red; - color->green = color_button->priv->color.green; - color->blue = color_button->priv->color.blue; - color->alpha = color_button->priv->color.alpha; + priv = gsm_color_button_get_instance_private (color_button); + color->red = priv->color.red; + color->green = priv->color.green; + color->blue = priv->color.blue; + color->alpha = priv->color.alpha; } void gsm_color_button_set_color (GSMColorButton * color_button, const GdkRGBA * color) { + GSMColorButtonPrivate *priv; g_return_if_fail (GSM_IS_COLOR_BUTTON (color_button)); g_return_if_fail (color != NULL); - color_button->priv->color.red = color->red; - color_button->priv->color.green = color->green; - color_button->priv->color.blue = color->blue; - color_button->priv->color.alpha = color->alpha; + priv = gsm_color_button_get_instance_private (color_button); - gtk_widget_queue_draw (GTK_WIDGET (&color_button->widget)); //->priv->draw_area); + priv->color.red = color->red; + priv->color.green = color->green; + priv->color.blue = color->blue; + priv->color.alpha = color->alpha; + + gtk_widget_queue_draw (GTK_WIDGET (color_button)); g_object_notify (G_OBJECT (color_button), "color"); } @@ -855,25 +871,30 @@ gsm_color_button_set_title (GSMColorButton * color_button, const gchar * title) { gchar *old_title; + GSMColorButtonPrivate *priv; g_return_if_fail (GSM_IS_COLOR_BUTTON (color_button)); + priv = gsm_color_button_get_instance_private (color_button); - old_title = color_button->priv->title; - color_button->priv->title = g_strdup (title); + old_title = priv->title; + priv->title = g_strdup (title); g_free (old_title); - if (color_button->priv->cc_dialog) - gtk_window_set_title (GTK_WINDOW (color_button->priv->cc_dialog), - color_button->priv->title); + if (priv->cc_dialog) + gtk_window_set_title (GTK_WINDOW (priv->cc_dialog), + priv->title); g_object_notify (G_OBJECT (color_button), "title"); } const gchar* gsm_color_button_get_title(GSMColorButton* color_button) { + GSMColorButtonPrivate *priv; g_return_val_if_fail(GSM_IS_COLOR_BUTTON(color_button), NULL); - return color_button->priv->title; + priv = gsm_color_button_get_instance_private (color_button); + + return priv->title; } static void diff --git a/src/gsm_color_button.h b/src/gsm_color_button.h index 5f1bcb1..adb34dd 100644 --- a/src/gsm_color_button.h +++ b/src/gsm_color_button.h @@ -27,29 +27,14 @@ #include <gtk/gtk.h> G_BEGIN_DECLS + /* The GtkColorSelectionButton widget is a simple color picker in a button. * The button displays a sample of the currently selected color. When * the user clicks on the button, a color selection dialog pops up. * The color picker emits the "color_set" signal when the color is set. */ #define GSM_TYPE_COLOR_BUTTON (gsm_color_button_get_type ()) -#define GSM_COLOR_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSM_TYPE_COLOR_BUTTON, GSMColorButton)) -#define GSM_COLOR_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSM_TYPE_COLOR_BUTTON, GSMColorButtonClass)) -#define GSM_IS_COLOR_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSM_TYPE_COLOR_BUTTON)) -#define GSM_IS_COLOR_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSM_TYPE_COLOR_BUTTON)) -#define GSM_COLOR_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSM_TYPE_COLOR_BUTTON, GSMColorButtonClass)) -typedef struct _GSMColorButton GSMColorButton; -typedef struct _GSMColorButtonClass GSMColorButtonClass; -typedef struct _GSMColorButtonPrivate GSMColorButtonPrivate; - -struct _GSMColorButton -{ - GtkDrawingArea widget; - - /*< private > */ - - GSMColorButtonPrivate *priv; -}; +G_DECLARE_DERIVABLE_TYPE (GSMColorButton, gsm_color_button, GSM, COLOR_BUTTON, GtkDrawingArea) /* Widget types */ enum @@ -74,7 +59,6 @@ struct _GSMColorButtonClass void (*_gtk_reserved4) (void); }; -GType gsm_color_button_get_type (void) G_GNUC_CONST; GtkWidget *gsm_color_button_new (const GdkRGBA * color, guint type); void gsm_color_button_set_color (GSMColorButton * color_button, const GdkRGBA * color); void gsm_color_button_set_fraction (GSMColorButton * color_button, const gdouble fraction); |