This is an automated email from the git hooks/post-receive script. andrzejr pushed a commit to branch master in repository xfce/xfce4-panel.
commit 28133ea35fd542beea4e519df6e6534c44739481 Author: Simon Steinbeiss <simon.steinbe...@elfenbeinturm.at> Date: Fri Nov 4 00:57:52 2016 +0100 Draw panel background with CSS and switch to GdkRGBA --- common/panel-xfconf.c | 27 +-- panel/panel-application.c | 2 +- panel/panel-base-window.c | 388 +++++++++++------------------------ panel/panel-base-window.h | 14 +- panel/panel-plugin-external.c | 19 -- panel/panel-plugin-external.h | 3 - panel/panel-preferences-dialog.c | 9 +- panel/panel-preferences-dialog.glade | 58 +----- panel/panel-window.c | 19 +- wrapper/main.c | 5 +- wrapper/wrapper-plug.c | 79 ++++--- 11 files changed, 193 insertions(+), 430 deletions(-) diff --git a/common/panel-xfconf.c b/common/panel-xfconf.c index 76feb5e..84f93c0 100644 --- a/common/panel-xfconf.c +++ b/common/panel-xfconf.c @@ -20,6 +20,10 @@ #include <config.h> #endif +#ifdef HAVE_MATH_H +#include <math.h> +#endif + #include <dbus/dbus-glib.h> #include <common/panel-private.h> @@ -35,9 +39,8 @@ panel_properties_store_value (XfconfChannel *channel, GObject *object, const gchar *object_property) { - GValue value = { 0, }; - GdkColor *color; - guint16 alpha = 0xffff; + GValue value = { 0, }; + GdkRGBA *rgba; #ifndef NDEBUG GParamSpec *pspec; #endif @@ -62,20 +65,20 @@ panel_properties_store_value (XfconfChannel *channel, g_value_init (&value, xfconf_property_type); g_object_get_property (G_OBJECT (object), object_property, &value); - if (G_LIKELY (xfconf_property_type != GDK_TYPE_COLOR)) + if (G_LIKELY (xfconf_property_type != GDK_TYPE_RGBA)) { - xfconf_channel_set_property (channel, xfconf_property, &value); + xfconf_channel_set_property (channel, xfconf_property, &value); } else { /* work around xfconf's lack of storing colors (bug #7117) and * do the same as xfconf_g_property_bind_gdkcolor() does */ - color = g_value_get_boxed (&value); + rgba = g_value_get_boxed (&value); xfconf_channel_set_array (channel, xfconf_property, - XFCONF_TYPE_UINT16, &color->red, - XFCONF_TYPE_UINT16, &color->green, - XFCONF_TYPE_UINT16, &color->blue, - XFCONF_TYPE_UINT16, &alpha, + G_TYPE_DOUBLE, &rgba->red, + G_TYPE_DOUBLE, &rgba->green, + G_TYPE_DOUBLE, &rgba->blue, + G_TYPE_DOUBLE, &rgba->alpha, G_TYPE_INVALID); } @@ -134,10 +137,10 @@ panel_properties_bind (XfconfChannel *channel, if (save_properties) panel_properties_store_value (channel, property, prop->type, object, prop->property); - if (G_LIKELY (prop->type != GDK_TYPE_COLOR)) + if (G_LIKELY (prop->type != GDK_TYPE_RGBA)) xfconf_g_property_bind (channel, property, prop->type, object, prop->property); else - xfconf_g_property_bind_gdkcolor (channel, property, object, prop->property); + xfconf_g_property_bind_gdkrgba (channel, property, object, prop->property); g_free (property); } diff --git a/panel/panel-application.c b/panel/panel-application.c index 4235b6f..53fdc61 100644 --- a/panel/panel-application.c +++ b/panel/panel-application.c @@ -297,8 +297,8 @@ panel_application_xfconf_window_bindings (PanelApplication *application, { "length-adjust", G_TYPE_BOOLEAN }, { "enter-opacity", G_TYPE_UINT }, { "leave-opacity", G_TYPE_UINT }, - { "background-alpha", G_TYPE_UINT }, { "background-style", G_TYPE_UINT }, + { "background-rgba", GDK_TYPE_RGBA }, { "background-color", GDK_TYPE_COLOR }, { "background-image", G_TYPE_STRING }, { "output-name", G_TYPE_STRING }, diff --git a/panel/panel-base-window.c b/panel/panel-base-window.c index 39a5c28..bce173d 100644 --- a/panel/panel-base-window.c +++ b/panel/panel-base-window.c @@ -48,8 +48,6 @@ static void panel_base_window_set_property (GObject static void panel_base_window_finalize (GObject *object); static void panel_base_window_screen_changed (GtkWidget *widget, GdkScreen *previous_screen); -static gboolean panel_base_window_draw (GtkWidget *widget, - cairo_t *cr); static gboolean panel_base_window_enter_notify_event (GtkWidget *widget, GdkEventCrossing *event); static gboolean panel_base_window_leave_notify_event (GtkWidget *widget, @@ -57,10 +55,13 @@ static gboolean panel_base_window_leave_notify_event (GtkWidget static void panel_base_window_composited_changed (GtkWidget *widget); static gboolean panel_base_window_active_timeout (gpointer user_data); static void panel_base_window_active_timeout_destroyed (gpointer user_data); +static void panel_base_window_set_background_color_css (PanelBaseWindow *window); +static void panel_base_window_set_background_image_css (PanelBaseWindow *window); +static void panel_base_window_set_background_css (PanelBaseWindow *window, + gchar *css_string); +static void panel_base_window_reset_background_css (PanelBaseWindow *window); static void panel_base_window_set_plugin_data (PanelBaseWindow *window, GtkCallback func); -static void panel_base_window_set_plugin_background_alpha (GtkWidget *widget, - gpointer user_data); static void panel_base_window_set_plugin_background_color (GtkWidget *widget, gpointer user_data); static void panel_base_window_set_plugin_background_image (GtkWidget *widget, @@ -73,11 +74,11 @@ enum PROP_0, PROP_ENTER_OPACITY, PROP_LEAVE_OPACITY, - PROP_BACKGROUND_ALPHA, PROP_BORDERS, PROP_ACTIVE, PROP_COMPOSITED, PROP_BACKGROUND_STYLE, + PROP_BACKGROUND_RGBA, PROP_BACKGROUND_COLOR, PROP_BACKGROUND_IMAGE }; @@ -86,8 +87,8 @@ struct _PanelBaseWindowPrivate { PanelBorders borders; - /* background image cache */ - cairo_pattern_t *bg_image_cache; + /* background css style provider */ + GtkCssProvider *css_provider; /* transparency settings */ gdouble enter_opacity; @@ -118,7 +119,6 @@ panel_base_window_class_init (PanelBaseWindowClass *klass) gobject_class->finalize = panel_base_window_finalize; gtkwidget_class = GTK_WIDGET_CLASS (klass); - gtkwidget_class->draw = panel_base_window_draw; gtkwidget_class->enter_notify_event = panel_base_window_enter_notify_event; gtkwidget_class->leave_notify_event = panel_base_window_leave_notify_event; gtkwidget_class->composited_changed = panel_base_window_composited_changed; @@ -139,13 +139,6 @@ panel_base_window_class_init (PanelBaseWindowClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, - PROP_BACKGROUND_ALPHA, - g_param_spec_uint ("background-alpha", - NULL, NULL, - 0, 100, 100, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_BACKGROUND_STYLE, g_param_spec_uint ("background-style", NULL, NULL, @@ -155,6 +148,13 @@ panel_base_window_class_init (PanelBaseWindowClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, + PROP_BACKGROUND_RGBA, + g_param_spec_boxed ("background-rgba", + NULL, NULL, + GDK_TYPE_RGBA, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_BACKGROUND_COLOR, g_param_spec_boxed ("background-color", NULL, NULL, @@ -201,12 +201,12 @@ panel_base_window_init (PanelBaseWindow *window) window->priv = G_TYPE_INSTANCE_GET_PRIVATE (window, PANEL_TYPE_BASE_WINDOW, PanelBaseWindowPrivate); window->is_composited = FALSE; - window->background_alpha = 1.00; window->background_style = PANEL_BG_STYLE_NONE; window->background_image = NULL; + window->background_rgba = NULL; window->background_color = NULL; - window->priv->bg_image_cache = NULL; + window->priv->css_provider = gtk_css_provider_new (); window->priv->enter_opacity = 1.00; window->priv->leave_opacity = 1.00; window->priv->borders = PANEL_BORDER_NONE; @@ -233,11 +233,12 @@ panel_base_window_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - PanelBaseWindow *window = PANEL_BASE_WINDOW (object); - PanelBaseWindowPrivate *priv = window->priv; - GdkRGBA *color; - GdkRGBA bg_color; - GtkStyleContext *ctx; + PanelBaseWindow *window = PANEL_BASE_WINDOW (object); + PanelBaseWindowPrivate *priv = window->priv; + GdkRGBA *rgba; + GdkColor *color; + GdkRGBA bg_color; + GtkStyleContext *ctx; switch (prop_id) { @@ -249,14 +250,23 @@ panel_base_window_get_property (GObject *object, g_value_set_uint (value, rint (priv->leave_opacity * 100.00)); break; - case PROP_BACKGROUND_ALPHA: - g_value_set_uint (value, rint (window->background_alpha * 100.00)); - break; - case PROP_BACKGROUND_STYLE: g_value_set_uint (value, window->background_style); break; + case PROP_BACKGROUND_RGBA: + if (window->background_rgba != NULL) { + rgba = window->background_rgba; + } + else + { + ctx = gtk_widget_get_style_context (GTK_WIDGET (window)); + gtk_style_context_get_background_color (ctx, GTK_STATE_NORMAL, &bg_color); + rgba = &bg_color; + } + g_value_set_boxed (value, rgba); + break; + case PROP_BACKGROUND_COLOR: if (window->background_color != NULL) color = window->background_color; @@ -302,7 +312,9 @@ panel_base_window_set_property (GObject *object, PanelBaseWindow *window = PANEL_BASE_WINDOW (object); PanelBaseWindowPrivate *priv = window->priv; PanelBgStyle bg_style; + GtkStyleContext *context; + context = gtk_widget_get_style_context (GTK_WIDGET (window)); switch (prop_id) { case PROP_ENTER_OPACITY: @@ -317,41 +329,30 @@ panel_base_window_set_property (GObject *object, gtk_window_set_opacity (GTK_WINDOW (object), priv->leave_opacity); break; - case PROP_BACKGROUND_ALPHA: - /* set the new background alpha */ - window->background_alpha = g_value_get_uint (value) / 100.00; - if (window->is_composited) - gtk_widget_queue_draw (GTK_WIDGET (object)); - - /* send the new background alpha to the external plugins */ - panel_base_window_set_plugin_data (window, - panel_base_window_set_plugin_background_alpha); - break; - case PROP_BACKGROUND_STYLE: bg_style = g_value_get_uint (value); if (window->background_style != bg_style) { window->background_style = bg_style; - if (priv->bg_image_cache != NULL) - { - /* destroy old image cache */ - cairo_pattern_destroy (priv->bg_image_cache); - priv->bg_image_cache = NULL; - } - /* send information to external plugins */ if (window->background_style == PANEL_BG_STYLE_IMAGE && window->background_image != NULL) { + panel_base_window_set_background_image_css (window); panel_base_window_set_plugin_data (window, panel_base_window_set_plugin_background_image); } - else if (window->background_style == PANEL_BG_STYLE_NONE - || (window->background_style == PANEL_BG_STYLE_COLOR - && window->background_color != NULL)) + else if (window->background_style == PANEL_BG_STYLE_NONE) + { + panel_base_window_reset_background_css (window); + panel_base_window_set_plugin_data (window, + panel_base_window_set_plugin_background_color); + } + else if (window->background_style == PANEL_BG_STYLE_COLOR + && window->background_rgba != NULL) { + panel_base_window_set_background_color_css (window); panel_base_window_set_plugin_data (window, panel_base_window_set_plugin_background_color); } @@ -361,6 +362,19 @@ panel_base_window_set_property (GObject *object, } break; + case PROP_BACKGROUND_RGBA: + if (window->background_rgba != NULL) + gdk_rgba_free (window->background_rgba); + window->background_rgba = g_value_dup_boxed (value); + + if (window->background_style == PANEL_BG_STYLE_COLOR) + { + panel_base_window_set_background_color_css (window); + panel_base_window_set_plugin_data (window, + panel_base_window_set_plugin_background_color); + } + break; + case PROP_BACKGROUND_COLOR: if (window->background_color != NULL) gdk_color_free (window->background_color); @@ -368,9 +382,9 @@ panel_base_window_set_property (GObject *object, if (window->background_style == PANEL_BG_STYLE_COLOR) { + gtk_widget_queue_draw (GTK_WIDGET (window)); panel_base_window_set_plugin_data (window, panel_base_window_set_plugin_background_color); - gtk_widget_queue_draw (GTK_WIDGET (window)); } break; @@ -379,18 +393,11 @@ panel_base_window_set_property (GObject *object, g_free (window->background_image); window->background_image = g_value_dup_string (value); - /* drop old cache */ - if (priv->bg_image_cache != NULL) - { - cairo_pattern_destroy (priv->bg_image_cache); - priv->bg_image_cache = NULL; - } - if (window->background_style == PANEL_BG_STYLE_IMAGE) { + panel_base_window_set_background_image_css (window); panel_base_window_set_plugin_data (window, panel_base_window_set_plugin_background_image); - gtk_widget_queue_draw (GTK_WIDGET (window)); } break; @@ -439,12 +446,14 @@ panel_base_window_finalize (GObject *object) if (window->priv->active_timeout_id != 0) g_source_remove (window->priv->active_timeout_id); - /* release bg image data */ + /* release bg colors data */ g_free (window->background_image); - if (window->priv->bg_image_cache != NULL) - cairo_pattern_destroy (window->priv->bg_image_cache); + if (window->background_rgba != NULL) + gdk_rgba_free (window->background_rgba); if (window->background_color != NULL) gdk_color_free (window->background_color); + g_object_unref (window->priv->css_provider); + (*G_OBJECT_CLASS (panel_base_window_parent_class)->finalize) (object); } @@ -478,172 +487,6 @@ panel_base_window_screen_changed (GtkWidget *widget, GdkScreen *previous_screen) static gboolean -panel_base_window_draw (GtkWidget *widget, - cairo_t *cr) -{ - const GdkRGBA *color; - GdkRGBA bg_rgba; - GtkSymbolicColor *literal; - GtkSymbolicColor *shade; - PanelBaseWindow *window = PANEL_BASE_WINDOW (widget); - PanelBaseWindowPrivate *priv = window->priv; - gdouble alpha; - gdouble width = gtk_widget_get_allocated_width (widget); - gdouble height = gtk_widget_get_allocated_height (widget); - const gdouble dashes[] = { 4.00, 4.00 }; - GTimeVal timeval; - GdkPixbuf *pixbuf; - GError *error = NULL; - cairo_matrix_t matrix = { 1, 0, 0, 1, 0, 0 }; /* identity matrix */ - GtkStyleContext *ctx; - - if (!gtk_widget_is_drawable (widget)) - return FALSE; - - ctx = gtk_widget_get_style_context (widget); - - /* create cairo context and set some default properties */ - cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_set_line_width (cr, 1.00); - - /* get background alpha */ - alpha = window->is_composited ? window->background_alpha : 1.00; - - if (window->background_style == PANEL_BG_STYLE_IMAGE) - { - if (G_LIKELY (priv->bg_image_cache != NULL)) - { - if (G_UNLIKELY (priv->active_timeout_id != 0)) - cairo_matrix_init_translate (&matrix, -1, -1); - - cairo_set_source (cr, priv->bg_image_cache); - cairo_pattern_set_matrix (priv->bg_image_cache, &matrix); - cairo_paint (cr); - } - else if (window->background_image != NULL) - { - /* load the image in a pixbuf */ - pixbuf = gdk_pixbuf_new_from_file (window->background_image, &error); - - if (G_LIKELY (pixbuf != NULL)) - { - gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); - g_object_unref (G_OBJECT (pixbuf)); - - priv->bg_image_cache = cairo_get_source (cr); - cairo_pattern_reference (priv->bg_image_cache); - cairo_pattern_set_extend (priv->bg_image_cache, CAIRO_EXTEND_REPEAT); - cairo_paint (cr); - } - else - { - /* print error message */ - g_warning ("Background image disabled, \"%s\" could not be loaded: %s", - window->background_image, error != NULL ? error->message : "No error"); - g_error_free (error); - - /* disable background image mode */ - window->background_style = PANEL_BG_STYLE_NONE; - } - } - } - else - { - /* get the background color */ - if (window->background_style == PANEL_BG_STYLE_COLOR - && window->background_color != NULL) - { - color = window->background_color; - panel_util_set_source_rgba (cr, color, alpha); - } - else - { - gtk_style_context_get_background_color (ctx, GTK_STATE_NORMAL, &bg_rgba); - bg_rgba.alpha = alpha; - gdk_cairo_set_source_rgba (cr, &bg_rgba); - } - cairo_paint (cr); - } - - /* draw marching ants selection if the timeout is running */ - if (G_UNLIKELY (priv->active_timeout_id != 0)) - { - /* red color, no alpha */ - cairo_set_source_rgb (cr, 1.00, 0.00, 0.00); - - /* set dash based on time (odd/even) */ - g_get_current_time (&timeval); - cairo_set_dash (cr, dashes, G_N_ELEMENTS (dashes), - (timeval.tv_sec % 4) * 2); - - /* draw rectangle */ - cairo_rectangle (cr, 0.5, 0.5, width - 1, height - 1); - cairo_stroke (cr); - } - else if (window->background_style == PANEL_BG_STYLE_NONE) - { - if (PANEL_HAS_FLAG (priv->borders, PANEL_BORDER_BOTTOM | PANEL_BORDER_RIGHT)) - { - /* use dark color for buttom and right line */ - gtk_style_context_get_background_color (ctx, GTK_STATE_NORMAL, &bg_rgba); - literal = gtk_symbolic_color_new_literal (&bg_rgba); - shade = gtk_symbolic_color_new_shade (literal, 0.7); - gtk_symbolic_color_unref (literal); - gtk_symbolic_color_resolve (shade, NULL, &bg_rgba); - gtk_symbolic_color_unref (shade); - bg_rgba.alpha = alpha; - gdk_cairo_set_source_rgba (cr, &bg_rgba); - - if (PANEL_HAS_FLAG (priv->borders, PANEL_BORDER_BOTTOM)) - { - cairo_move_to (cr, 0.50, height - 1); - cairo_rel_line_to (cr, width, 0.50); - } - - if (PANEL_HAS_FLAG (priv->borders, PANEL_BORDER_RIGHT)) - { - cairo_move_to (cr, width - 1, 0.50); - cairo_rel_line_to (cr, 0.50, height); - } - - cairo_stroke (cr); - } - - if (PANEL_HAS_FLAG (priv->borders, PANEL_BORDER_TOP | PANEL_BORDER_LEFT)) - { - /* use light color for top and left line */ - gtk_style_context_get_background_color (ctx, GTK_STATE_NORMAL, &bg_rgba); - literal = gtk_symbolic_color_new_literal (&bg_rgba); - shade = gtk_symbolic_color_new_shade (literal, 1.3); - gtk_symbolic_color_unref (literal); - gtk_symbolic_color_resolve (shade, NULL, &bg_rgba); - gtk_symbolic_color_unref (shade); - bg_rgba.alpha = alpha; - gdk_cairo_set_source_rgba (cr, &bg_rgba); - - if (PANEL_HAS_FLAG (priv->borders, PANEL_BORDER_LEFT)) - { - cairo_move_to (cr, 0.50, 0.50); - cairo_rel_line_to (cr, 0.50, height); - } - - if (PANEL_HAS_FLAG (priv->borders, PANEL_BORDER_TOP)) - { - cairo_move_to (cr, 0.50, 0.50); - cairo_rel_line_to (cr, width, 0.50); - } - - cairo_stroke (cr); - } - } - - return FALSE; -} - - - -static gboolean panel_base_window_enter_notify_event (GtkWidget *widget, GdkEventCrossing *event) { @@ -701,13 +544,6 @@ panel_base_window_composited_changed (GtkWidget *widget) "%p: compositing=%s", window, PANEL_DEBUG_BOOL (window->is_composited)); - /* clear cairo image cache */ - if (window->priv->bg_image_cache != NULL) - { - cairo_pattern_destroy (window->priv->bg_image_cache); - window->priv->bg_image_cache = NULL; - } - if (window->is_composited != was_composited) g_object_notify (G_OBJECT (widget), "composited"); @@ -746,29 +582,64 @@ panel_base_window_active_timeout_destroyed (gpointer user_data) static void -panel_base_window_set_plugin_data (PanelBaseWindow *window, - GtkCallback func) -{ - GtkWidget *itembar; +panel_base_window_set_background_color_css (PanelBaseWindow *window) { + gchar *css_string; + panel_return_if_fail (window->background_rgba != NULL); + css_string = g_strdup_printf (".xfce4-panel.background { background-image: none; background-color: %s; }" + ".xfce4-panel.background button { background: transparent; }", + gdk_rgba_to_string (window->background_rgba)); + panel_base_window_set_background_css (window, css_string); +} - itembar = gtk_bin_get_child (GTK_BIN (window)); - if (G_LIKELY (itembar != NULL)) - gtk_container_foreach (GTK_CONTAINER (itembar), func, window); + + +static void +panel_base_window_set_background_image_css (PanelBaseWindow *window) { + gchar *css_string; + panel_return_if_fail (window->background_image != NULL); + css_string = g_strdup_printf (".xfce4-panel.background { background-image: url('%s'); }" + ".xfce4-panel.background button { background: transparent; }", + window->background_image); + panel_base_window_set_background_css (window, css_string); } static void -panel_base_window_set_plugin_background_alpha (GtkWidget *widget, - gpointer user_data) +panel_base_window_set_background_css (PanelBaseWindow *window, gchar *css_string) { + GtkStyleContext *context; + + context = gtk_widget_get_style_context (GTK_WIDGET (window)); + /* Reset the css style provider */ + gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (window->priv->css_provider)); + gtk_css_provider_load_from_data (window->priv->css_provider, css_string, -1, NULL); + gtk_style_context_add_provider (context, + GTK_STYLE_PROVIDER (window->priv->css_provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + g_free (css_string); +} + + + +static void +panel_base_window_reset_background_css (PanelBaseWindow *window) { + GtkStyleContext *context; + + context = gtk_widget_get_style_context (GTK_WIDGET (window)); + gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (window->priv->css_provider)); +} + + + +static void +panel_base_window_set_plugin_data (PanelBaseWindow *window, + GtkCallback func) { - panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (widget)); - panel_return_if_fail (PANEL_IS_BASE_WINDOW (user_data)); + GtkWidget *itembar; - /* if the plugin is external, send the new alpha value to the wrapper/socket */ - if (PANEL_IS_PLUGIN_EXTERNAL (widget)) - panel_plugin_external_set_background_alpha (PANEL_PLUGIN_EXTERNAL (widget), - PANEL_BASE_WINDOW (user_data)->background_alpha); + itembar = gtk_bin_get_child (GTK_BIN (window)); + if (G_LIKELY (itembar != NULL)) + gtk_container_foreach (GTK_CONTAINER (itembar), func, window); } @@ -784,8 +655,7 @@ panel_base_window_set_plugin_background_color (GtkWidget *widget, panel_return_if_fail (PANEL_IS_BASE_WINDOW (user_data)); /* send null if the style is not a bg color */ - color = window->background_style == PANEL_BG_STYLE_COLOR ? window->background_color : NULL; - + color = window->background_style == PANEL_BG_STYLE_COLOR ? window->background_rgba : NULL; if (PANEL_IS_PLUGIN_EXTERNAL (widget)) panel_plugin_external_set_background_color (PANEL_PLUGIN_EXTERNAL (widget), color); } @@ -856,23 +726,3 @@ panel_base_window_get_borders (PanelBaseWindow *window) return priv->borders; } - - - -void -panel_util_set_source_rgba (cairo_t *cr, - const GdkRGBA *color, - gdouble alpha) -{ - panel_return_if_fail (alpha >= 0.00 && alpha <= 1.00); - panel_return_if_fail (color != NULL); - - if (G_LIKELY (alpha == 1.00)) - cairo_set_source_rgb (cr, color->red, - color->green, - color->blue); - else - cairo_set_source_rgba (cr, color->red, - color->green, - color->blue, alpha); -} diff --git a/panel/panel-base-window.h b/panel/panel-base-window.h index 95016ab..3bbd8d5 100644 --- a/panel/panel-base-window.h +++ b/panel/panel-base-window.h @@ -64,12 +64,12 @@ struct _PanelBaseWindow /*< private >*/ PanelBaseWindowPrivate *priv; - guint is_composited : 1; + guint is_composited : 1; - gdouble background_alpha; - PanelBgStyle background_style; - GdkRGBA *background_color; - gchar *background_image; + PanelBgStyle background_style; + GdkRGBA *background_rgba; + GdkColor *background_color; + gchar *background_image; }; GType panel_base_window_get_type (void) G_GNUC_CONST; @@ -84,10 +84,6 @@ void panel_base_window_set_borders (PanelBaseWindow *window, PanelBorders borders); PanelBorders panel_base_window_get_borders (PanelBaseWindow *window); -void panel_util_set_source_rgba (cairo_t *cr, - const GdkRGBA *color, - gdouble alpha); - G_END_DECLS #endif /* !__PANEL_BASE_WINDOW_H__ */ diff --git a/panel/panel-plugin-external.c b/panel/panel-plugin-external.c index c263902..16ef221 100644 --- a/panel/panel-plugin-external.c +++ b/panel/panel-plugin-external.c @@ -1116,25 +1116,6 @@ panel_plugin_external_restart (PanelPluginExternal *external) void -panel_plugin_external_set_background_alpha (PanelPluginExternal *external, - gdouble alpha) -{ - GValue value = { 0, }; - - panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external)); - - g_value_init (&value, G_TYPE_DOUBLE); - g_value_set_double (&value, alpha); - - panel_plugin_external_queue_add (external, PROVIDER_PROP_TYPE_SET_BACKGROUND_ALPHA, - &value); - - g_value_unset (&value); -} - - - -void panel_plugin_external_set_background_color (PanelPluginExternal *external, const GdkRGBA *color) { diff --git a/panel/panel-plugin-external.h b/panel/panel-plugin-external.h index 83537be..e6606f0 100644 --- a/panel/panel-plugin-external.h +++ b/panel/panel-plugin-external.h @@ -86,9 +86,6 @@ GType panel_plugin_external_get_type (void) G_GNUC_CONST; void panel_plugin_external_restart (PanelPluginExternal *external); -void panel_plugin_external_set_background_alpha (PanelPluginExternal *external, - gdouble alpha); - void panel_plugin_external_set_background_color (PanelPluginExternal *external, const GdkRGBA *color); diff --git a/panel/panel-preferences-dialog.c b/panel/panel-preferences-dialog.c index 5480507..1e3292a 100644 --- a/panel/panel-preferences-dialog.c +++ b/panel/panel-preferences-dialog.c @@ -443,18 +443,18 @@ panel_preferences_dialog_bindings_update (PanelPreferencesDialog *dialog) panel_preferences_dialog_bindings_add (dialog, "nrows", "value", 0); panel_preferences_dialog_bindings_add (dialog, "length", "value", 0); panel_preferences_dialog_bindings_add (dialog, "length-adjust", "active", 0); - panel_preferences_dialog_bindings_add (dialog, "background-alpha", "value", 0); panel_preferences_dialog_bindings_add (dialog, "enter-opacity", "value", 0); panel_preferences_dialog_bindings_add (dialog, "leave-opacity", "value", 0); panel_preferences_dialog_bindings_add (dialog, "composited", "sensitive", G_BINDING_SYNC_CREATE); panel_preferences_dialog_bindings_add (dialog, "background-style", "active", 0); - panel_preferences_dialog_bindings_add (dialog, "background-color", "color", 0); + panel_preferences_dialog_bindings_add (dialog, "background-rgba", "rgba", 0); /* watch image changes from the panel */ dialog->bg_image_notify_handler_id = g_signal_connect_swapped (G_OBJECT (dialog->active), "notify::background-image", G_CALLBACK (panel_preferences_dialog_bg_image_notified), dialog); panel_preferences_dialog_bg_image_notified (dialog); + /* get run mode of the driver (multiple screens or randr) */ screen = gtk_widget_get_screen (GTK_WIDGET (dialog->active)); display = gtk_widget_get_display (GTK_WIDGET (dialog->active)); @@ -630,11 +630,10 @@ panel_preferences_dialog_bg_style_changed (PanelPreferencesDialog *dialog) panel_return_if_fail (GTK_IS_COMBO_BOX (object)); active = gtk_combo_box_get_active (GTK_COMBO_BOX (object)); - object = gtk_builder_get_object (GTK_BUILDER (dialog), "bg-alpha-box"); + object = gtk_builder_get_object (GTK_BUILDER (dialog), "background-rgba"); panel_return_if_fail (GTK_IS_WIDGET (object)); g_object_get (G_OBJECT (dialog->active), "composited", &composited, NULL); - g_object_set (G_OBJECT (object), "visible", active < 2, - "sensitive", composited, NULL); + gtk_color_chooser_set_use_alpha (object, composited); object = gtk_builder_get_object (GTK_BUILDER (dialog), "bg-color-box"); panel_return_if_fail (GTK_IS_WIDGET (object)); diff --git a/panel/panel-preferences-dialog.glade b/panel/panel-preferences-dialog.glade index 75a7128..7b889b0 100644 --- a/panel/panel-preferences-dialog.glade +++ b/panel/panel-preferences-dialog.glade @@ -3,12 +3,6 @@ <interface> <requires lib="gtk+" version="3.20"/> <requires lib="libxfce4ui-2" version="4.12"/> - <object class="GtkAdjustment" id="background-alpha"> - <property name="upper">100</property> - <property name="value">100</property> - <property name="step_increment">1</property> - <property name="page_increment">10</property> - </object> <object class="GtkAdjustment" id="enter-opacity"> <property name="upper">100</property> <property name="value">100</property> @@ -674,47 +668,6 @@ </packing> </child> <child> - <object class="GtkBox" id="bg-alpha-box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">12</property> - <child> - <object class="GtkLabel" id="label15"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">_Alpha:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">bg-alpha-scale</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkScale" id="bg-alpha-scale"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Alpha value of the panel background, with 0 being fully transparent and 100 fully opaque.</property> - <property name="adjustment">background-alpha</property> - <property name="digits">0</property> - <property name="value_pos">right</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - <child> <object class="GtkBox" id="bg-color-box"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -725,7 +678,6 @@ <property name="can_focus">False</property> <property name="label" translatable="yes">C_olor:</property> <property name="use_underline">True</property> - <property name="mnemonic_widget">background-color</property> </object> <packing> <property name="expand">False</property> @@ -734,12 +686,12 @@ </packing> </child> <child> - <object class="GtkColorButton" id="background-color"> + <object class="GtkColorButton" id="background-rgba"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can_focus">False</property> <property name="receives_default">True</property> <property name="title" translatable="yes">Pick a Panel Color</property> - <property name="rgba">rgb(0,0,0)</property> + <property name="rgba">rgb(217,64,217)</property> </object> <packing> <property name="expand">False</property> @@ -751,7 +703,7 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">2</property> + <property name="position">1</property> </packing> </child> <child> @@ -789,7 +741,7 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">3</property> + <property name="position">2</property> </packing> </child> </object> diff --git a/panel/panel-window.c b/panel/panel-window.c index 140d439..3e00351 100644 --- a/panel/panel-window.c +++ b/panel/panel-window.c @@ -777,7 +777,6 @@ panel_window_draw (GtkWidget *widget, guint xx, yy, i; gint xs, xe, ys, ye; gint handle_w, handle_h; - gdouble alpha = 1.00; GtkWidget *child; GtkStyleContext *ctx; @@ -810,10 +809,6 @@ panel_window_draw (GtkWidget *widget, cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - /* alpha color */ - if (PANEL_BASE_WINDOW (window)->is_composited) - alpha = MAX (0.50, PANEL_BASE_WINDOW (window)->background_alpha); - ctx = gtk_widget_get_style_context (widget); gtk_style_context_get_background_color (ctx, GTK_STATE_NORMAL, &bg_rgba); literal = gtk_symbolic_color_new_literal (&bg_rgba); @@ -824,8 +819,8 @@ panel_window_draw (GtkWidget *widget, gtk_symbolic_color_resolve (shade, NULL, &dark_rgba); gtk_symbolic_color_unref (shade); gtk_symbolic_color_unref (literal); - light_rgba.alpha = alpha; - dark_rgba.alpha = alpha; + light_rgba.alpha = bg_rgba.alpha; + dark_rgba.alpha = bg_rgba.alpha; for (i = HANDLE_PIXELS; i >= HANDLE_PIXELS - 1; i--) { @@ -2318,8 +2313,8 @@ panel_window_set_autohide (PanelWindow *window, GtkWidget *popup; guint i; const gchar *properties[] = { "enter-opacity", "leave-opacity", - "background-alpha", "borders", - "background-style", "background-color", + "borders", "background-style", + "background-color", "role", "screen" }; panel_return_if_fail (PANEL_IS_WINDOW (window)); @@ -2753,12 +2748,6 @@ panel_window_set_povider_info (PanelWindow *window, if (PANEL_IS_PLUGIN_EXTERNAL (provider)) { - if (moving_to_other_panel || base_window->background_alpha < 1.0) - { - panel_plugin_external_set_background_alpha (PANEL_PLUGIN_EXTERNAL (provider), - base_window->background_alpha); - } - if (base_window->background_style == PANEL_BG_STYLE_COLOR) { panel_plugin_external_set_background_color (PANEL_PLUGIN_EXTERNAL (provider), diff --git a/wrapper/main.c b/wrapper/main.c index 0a19ec6..d766741 100644 --- a/wrapper/main.c +++ b/wrapper/main.c @@ -109,15 +109,12 @@ wrapper_gproxy_set (DBusGProxy *dbus_gproxy, gtk_widget_set_sensitive (GTK_WIDGET (provider), g_value_get_boolean (value)); break; - case PROVIDER_PROP_TYPE_SET_BACKGROUND_ALPHA: case PROVIDER_PROP_TYPE_SET_BACKGROUND_COLOR: case PROVIDER_PROP_TYPE_SET_BACKGROUND_IMAGE: case PROVIDER_PROP_TYPE_ACTION_BACKGROUND_UNSET: plug = g_object_get_qdata (G_OBJECT (provider), plug_quark); - if (type == PROVIDER_PROP_TYPE_SET_BACKGROUND_ALPHA) - wrapper_plug_set_background_alpha (plug, g_value_get_double (value)); - else if (type == PROVIDER_PROP_TYPE_SET_BACKGROUND_COLOR) + if (type == PROVIDER_PROP_TYPE_SET_BACKGROUND_COLOR) wrapper_plug_set_background_color (plug, g_value_get_string (value)); else if (type == PROVIDER_PROP_TYPE_SET_BACKGROUND_IMAGE) wrapper_plug_set_background_image (plug, g_value_get_string (value)); diff --git a/wrapper/wrapper-plug.c b/wrapper/wrapper-plug.c index b7592fc..48cdc8b 100644 --- a/wrapper/wrapper-plug.c +++ b/wrapper/wrapper-plug.c @@ -51,8 +51,11 @@ struct _WrapperPlug GtkPlug __parent__; /* background information */ - gdouble background_alpha; +#if GTK_CHECK_VERSION (3, 0, 0) + GdkRGBA *background_rgba; +#else GdkColor *background_color; +#endif gchar *background_image; cairo_pattern_t *background_image_cache; }; @@ -94,15 +97,16 @@ wrapper_plug_init (WrapperPlug *plug) GdkVisual *visual = NULL; GdkScreen *screen; GtkStyleContext *context; - GtkCssProvider *provider = gtk_css_provider_new(); - gchar *css_string; #else GdkColormap *colormap = NULL; GdkScreen *screen; #endif - plug->background_alpha = 1.00; +#if GTK_CHECK_VERSION (3, 0, 0) + plug->background_rgba = NULL; +#else plug->background_color = NULL; +#endif plug->background_image = NULL; plug->background_image_cache = NULL; @@ -128,17 +132,6 @@ wrapper_plug_init (WrapperPlug *plug) context = gtk_widget_get_style_context (GTK_WIDGET (plug)); gtk_style_context_add_class (context, "panel"); gtk_style_context_add_class (context, "xfce4-panel"); - - /* We need to set the plugin button to transparent and let everything else - * be in the theme or panel's color */ - css_string = g_strdup_printf (".xfce4-panel button { background-color: transparent; }"); - gtk_css_provider_load_from_data (provider, css_string, -1, NULL); - gtk_style_context_add_provider (context, - GTK_STYLE_PROVIDER (provider), - GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - - g_free (css_string); - g_object_unref (provider); #endif } @@ -161,9 +154,8 @@ wrapper_plug_draw (GtkWidget *widget, { WrapperPlug *plug = WRAPPER_PLUG (widget); GtkStyleContext *style; - const GdkColor *color; + const GdkRGBA *color; GdkRGBA rgba; - gdouble alpha; GdkPixbuf *pixbuf; GError *error = NULL; @@ -212,20 +204,19 @@ wrapper_plug_draw (GtkWidget *widget, } else { - alpha = gtk_widget_is_composited (GTK_WIDGET (plug)) ? plug->background_alpha : 1.00; cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - /* get the background gdk color */ - if (plug->background_color != NULL) + /* get the background gdk rgba */ + if (plug->background_rgba != NULL) { - color = plug->background_color; - cairo_set_source_rgba (cr, PANEL_GDKCOLOR_TO_DOUBLE (color), alpha); + color = plug->background_rgba; + cairo_set_source_rgba (cr, color->red, color->green, + color->blue, color->alpha); } else { style = gtk_widget_get_style_context (widget); gtk_style_context_get_background_color (style, GTK_STATE_FLAG_NORMAL, &rgba); - rgba.alpha = alpha; gdk_cairo_set_source_rgba (cr, &rgba); } @@ -296,9 +287,7 @@ wrapper_plug_expose_event (GtkWidget *widget, } else { - alpha = gtk_widget_is_composited (GTK_WIDGET (plug)) ? plug->background_alpha : 1.00; - - if (alpha < 1.00 || plug->background_color != NULL) + if (plug->background_color != NULL) { /* get the background gdk color */ if (plug->background_color != NULL) @@ -308,8 +297,8 @@ wrapper_plug_expose_event (GtkWidget *widget, /* draw the background color */ cr = gdk_cairo_create (widget->window); + cairo_set_source_rgba (cr, color->red, color->green, color->blue, 1.00); 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); @@ -328,9 +317,15 @@ wrapper_plug_background_reset (WrapperPlug *plug) { panel_return_if_fail (WRAPPER_IS_PLUG (plug)); +#if GTK_CHECK_VERSION (3, 0, 0) + if (plug->background_rgba != NULL) + gdk_rgba_free (plug->background_rgba); + plug->background_rgba = NULL; +#else if (plug->background_color != NULL) gdk_color_free (plug->background_color); plug->background_color = NULL; +#endif if (plug->background_image_cache != NULL) cairo_pattern_destroy (plug->background_image_cache); @@ -362,23 +357,27 @@ wrapper_plug_new (GdkNativeWindow socket_id) +#if GTK_CHECK_VERSION (3, 0, 0) void -wrapper_plug_set_background_alpha (WrapperPlug *plug, - gdouble alpha) +wrapper_plug_set_background_color (WrapperPlug *plug, + const gchar *color_string) { - panel_return_if_fail (WRAPPER_IS_PLUG (plug)); - panel_return_if_fail (GTK_IS_WIDGET (plug)); + GdkRGBA color; + GtkStyleContext *context; + GtkCssProvider *provider = gtk_css_provider_new(); + gchar *css_string; - /* set the alpha */ - plug->background_alpha = CLAMP (alpha, 0.00, 1.00); - - /* redraw */ - if (gtk_widget_is_composited (GTK_WIDGET (plug))) - gtk_widget_queue_draw (GTK_WIDGET (plug)); -} + panel_return_if_fail (WRAPPER_IS_PLUG (plug)); + wrapper_plug_background_reset (plug); + if (color_string != NULL + && gdk_rgba_parse (&color, color_string)) + plug->background_rgba = gdk_rgba_copy (&color); + gtk_widget_queue_draw (GTK_WIDGET (plug)); +} +#else void wrapper_plug_set_background_color (WrapperPlug *plug, @@ -390,14 +389,14 @@ wrapper_plug_set_background_color (WrapperPlug *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)); } - - +#endif void wrapper_plug_set_background_image (WrapperPlug *plug, -- To stop receiving notification emails like this one, please contact the administrator of this repository. _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits