diff options
author | Nick Schermer <nick@xfce.org> | 2010-04-25 11:34:05 +0200 |
---|---|---|
committer | Nick Schermer <nick@xfce.org> | 2010-05-09 22:23:25 +0200 |
commit | 8c9fcef677f360e82f5a8de7d3bbf7a2e206d55e (patch) | |
tree | 5cd77f632bf268e3454cce9179ab4c358a01d67e /wrapper | |
parent | 5db31ffd871d39cbe4fb51862405aafac5cf1d0d (diff) |
Add support for more background options (bug #1731).
Add support for colored and image backgrounds. This makes theming the
panel a lot easier and allows us to handle the colors and image
positioning in the external plugins.
The background image does not apply to the autohide window.
Diffstat (limited to 'wrapper')
-rw-r--r-- | wrapper/main.c | 20 | ||||
-rw-r--r-- | wrapper/wrapper-plug.c | 179 | ||||
-rw-r--r-- | wrapper/wrapper-plug.h | 6 |
3 files changed, 168 insertions, 37 deletions
diff --git a/wrapper/main.c b/wrapper/main.c index 69e83d5b..36a9ea8f 100644 --- a/wrapper/main.c +++ b/wrapper/main.c @@ -90,11 +90,6 @@ wrapper_gproxy_set (DBusGProxy *dbus_gproxy, xfce_panel_plugin_provider_set_screen_position (provider, g_value_get_uint (value)); else if (strcmp (property, SIGNAL_SET_LOCKED) == 0) xfce_panel_plugin_provider_set_locked (provider, g_value_get_boolean (value)); - else if (strcmp (property, SIGNAL_WRAPPER_BACKGROUND_ALPHA) == 0) - { - plug = g_object_get_qdata (G_OBJECT (provider), plug_quark); - wrapper_plug_set_background_alpha (plug, g_value_get_double (value)); - } else if (strcmp (property, SIGNAL_SAVE) == 0) xfce_panel_plugin_provider_save (provider); else if (strcmp (property, SIGNAL_SHOW_CONFIGURE) == 0) @@ -108,7 +103,20 @@ wrapper_gproxy_set (DBusGProxy *dbus_gproxy, else if (strcmp (property, SIGNAL_WRAPPER_QUIT) == 0) gtk_main_quit (); else - panel_assert_not_reached (); + { + plug = g_object_get_qdata (G_OBJECT (provider), plug_quark); + + if (strcmp (property, SIGNAL_WRAPPER_BACKGROUND_ALPHA) == 0) + wrapper_plug_set_background_alpha (plug, g_value_get_double (value)); + else if (strcmp (property, SIGNAL_WRAPPER_BACKGROUND_COLOR) == 0) + wrapper_plug_set_background_color (plug, g_value_get_string (value)); + else if (strcmp (property, SIGNAL_WRAPPER_BACKGROUND_IMAGE) == 0) + wrapper_plug_set_background_image (plug, g_value_get_string (value)); + else if (strcmp (property, SIGNAL_WRAPPER_BACKGROUND_UNSET) == 0) + wrapper_plug_set_background_color (plug, NULL); + else + panel_assert_not_reached (); + } g_free (property); g_value_unset (value); diff --git a/wrapper/wrapper-plug.c b/wrapper/wrapper-plug.c index fcefe9cb..cdeb1241 100644 --- a/wrapper/wrapper-plug.c +++ b/wrapper/wrapper-plug.c @@ -29,8 +29,10 @@ -static gboolean wrapper_plug_expose_event (GtkWidget *widget, - GdkEventExpose *event); +static void wrapper_plug_finalize (GObject *object); +static gboolean wrapper_plug_expose_event (GtkWidget *widget, + GdkEventExpose *event); +static void wrapper_plug_background_reset (WrapperPlug *plug); @@ -43,11 +45,14 @@ struct _WrapperPlug { GtkPlug __parent__; - /* background alpha */ - gdouble background_alpha; - /* whether the wrapper has a rgba colormap */ - guint is_composited : 1; + guint is_composited : 1; + + /* background information */ + gdouble background_alpha; + GdkColor *background_color; + gchar *background_image; + cairo_pattern_t *background_image_cache; }; @@ -64,8 +69,12 @@ G_DEFINE_TYPE (WrapperPlug, wrapper_plug, GTK_TYPE_PLUG) static void wrapper_plug_class_init (WrapperPlugClass *klass) { + GObjectClass *gobject_class; GtkWidgetClass *gtkwidget_class; + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = wrapper_plug_finalize; + gtkwidget_class = GTK_WIDGET_CLASS (klass); gtkwidget_class->expose_event = wrapper_plug_expose_event; } @@ -79,6 +88,9 @@ wrapper_plug_init (WrapperPlug *plug) GdkScreen *screen; plug->background_alpha = 1.00; + plug->background_color = NULL; + plug->background_image = NULL; + plug->background_image_cache = NULL; gtk_widget_set_name (GTK_WIDGET (plug), "XfcePanelWindowWrapper"); @@ -110,43 +122,113 @@ wrapper_plug_init (WrapperPlug *plug) +static void +wrapper_plug_finalize (GObject *object) +{ + wrapper_plug_background_reset (WRAPPER_PLUG (object)); + + G_OBJECT_CLASS (wrapper_plug_parent_class)->finalize (object); +} + + + static gboolean wrapper_plug_expose_event (GtkWidget *widget, GdkEventExpose *event) { - WrapperPlug *plug = WRAPPER_PLUG (widget); - cairo_t *cr; - GdkColor *color; - GtkStateType state = GTK_STATE_NORMAL; - gdouble alpha = plug->is_composited ? plug->background_alpha : 1.00; - - if (GTK_WIDGET_DRAWABLE (widget) && alpha < 1.00) + WrapperPlug *plug = WRAPPER_PLUG (widget); + cairo_t *cr; + const GdkColor *color; + gdouble alpha; + GdkPixbuf *pixbuf; + GError *error = NULL; + + if (GTK_WIDGET_DRAWABLE (widget)) { - /* create the cairo context */ - cr = gdk_cairo_create (widget->window); + if (G_UNLIKELY (plug->background_image != NULL)) + { + cr = gdk_cairo_create (widget->window); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + gdk_cairo_rectangle (cr, &event->area); + cairo_clip (cr); + + if (G_LIKELY (plug->background_image_cache != NULL)) + { + cairo_set_source (cr, plug->background_image_cache); + cairo_paint (cr); + } + else + { + /* load the image in a pixbuf */ + pixbuf = gdk_pixbuf_new_from_file (plug->background_image, &error); + + if (G_LIKELY (pixbuf != NULL)) + { + gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); + g_object_unref (G_OBJECT (pixbuf)); + + plug->background_image_cache = cairo_get_source (cr); + cairo_pattern_reference (plug->background_image_cache); + cairo_pattern_set_extend (plug->background_image_cache, CAIRO_EXTEND_REPEAT); + cairo_paint (cr); + } + else + { + /* print error message */ + g_warning ("Background image disabled, \"%s\" could not be loaded: %s", + plug->background_image, error != NULL ? error->message : "No error"); + g_error_free (error); + + /* disable background image */ + wrapper_plug_background_reset (plug); + } + } + + cairo_destroy (cr); + } + else + { + alpha = plug->is_composited ? plug->background_alpha : 1.00; + + if (alpha < 1.00 || plug->background_color != NULL) + { + /* get the background gdk color */ + if (plug->background_color != NULL) + color = plug->background_color; + else + color = &(widget->style->bg[GTK_STATE_NORMAL]); + + /* draw the background color */ + cr = gdk_cairo_create (widget->window); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, PANEL_GDKCOLOR_TO_DOUBLE (color), alpha); + gdk_cairo_rectangle (cr, &event->area); + cairo_fill (cr); + cairo_destroy (cr); + } + } + } - /* get the background gdk color */ - color = &(widget->style->bg[state]); + return GTK_WIDGET_CLASS (wrapper_plug_parent_class)->expose_event (widget, event); +} - /* set the cairo source color */ - cairo_set_source_rgba (cr, PANEL_GDKCOLOR_TO_DOUBLE (color), - plug->background_alpha); - /* create retangle */ - cairo_rectangle (cr, event->area.x, event->area.y, - event->area.width, event->area.height); - /* draw on source */ - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); +static void +wrapper_plug_background_reset (WrapperPlug *plug) +{ + panel_return_if_fail (WRAPPER_IS_PLUG (plug)); - /* paint rectangle */ - cairo_fill (cr); + if (plug->background_color != NULL) + gdk_color_free (plug->background_color); + plug->background_color = NULL; - /* destroy cairo context */ - cairo_destroy (cr); - } + if (plug->background_image_cache != NULL) + cairo_pattern_destroy (plug->background_image_cache); + plug->background_image_cache = NULL; - return GTK_WIDGET_CLASS (wrapper_plug_parent_class)->expose_event (widget, event); + g_free (plug->background_image); + plug->background_image = NULL; } @@ -181,3 +263,38 @@ wrapper_plug_set_background_alpha (WrapperPlug *plug, if (plug->is_composited) gtk_widget_queue_draw (GTK_WIDGET (plug)); } + + + + +void +wrapper_plug_set_background_color (WrapperPlug *plug, + const gchar *color_string) +{ + GdkColor color = { 0, }; + + panel_return_if_fail (WRAPPER_IS_PLUG (plug)); + + wrapper_plug_background_reset (plug); + + if (color_string != NULL + && gdk_color_parse (color_string, &color)) + plug->background_color = gdk_color_copy (&color); + + gtk_widget_queue_draw (GTK_WIDGET (plug)); +} + + + +void +wrapper_plug_set_background_image (WrapperPlug *plug, + const gchar *image) +{ + panel_return_if_fail (WRAPPER_IS_PLUG (plug)); + + wrapper_plug_background_reset (plug); + + plug->background_image = g_strdup (image); + + gtk_widget_queue_draw (GTK_WIDGET (plug)); +} diff --git a/wrapper/wrapper-plug.h b/wrapper/wrapper-plug.h index 5a089afc..ab0d3f53 100644 --- a/wrapper/wrapper-plug.h +++ b/wrapper/wrapper-plug.h @@ -44,6 +44,12 @@ WrapperPlug *wrapper_plug_new (GdkNativeWindow socket_id); void wrapper_plug_set_background_alpha (WrapperPlug *plug, gdouble alpha); +void wrapper_plug_set_background_color (WrapperPlug *plug, + const gchar *color_string); + +void wrapper_plug_set_background_image (WrapperPlug *plug, + const gchar *image); + G_END_DECLS #endif /* !__WRAPPER_PLUG_H__ */ |