[Xfce4-commits] [xfce/xfce4-panel] 71/73: Draw panel background with CSS and switch to GdkRGBA
noreply at xfce.org
noreply at xfce.org
Sun Feb 26 16:34:52 CET 2017
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.steinbeiss at 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.
More information about the Xfce4-commits
mailing list