[Xfce4-commits] <xfce4-panel:nick/background> Make solid colors work.
Nick Schermer
noreply at xfce.org
Tue May 4 17:50:02 CEST 2010
Updating branch refs/heads/nick/background
to 3ec40df5b3f3d6dcfb6a5d421b269ad3ab3a0db8 (commit)
from 00993d1175bb50d746b31623c0193804b230de4e (commit)
commit 3ec40df5b3f3d6dcfb6a5d421b269ad3ab3a0db8
Author: Nick Schermer <nick at xfce.org>
Date: Tue May 4 17:48:23 2010 +0200
Make solid colors work.
common/panel-xfconf.c | 5 ++-
panel/panel-application.c | 2 +
panel/panel-base-window.c | 59 +++++++++++++++++++++++++++++++++++--
panel/panel-base-window.h | 9 ++++++
panel/panel-preferences-dialog.c | 2 +
5 files changed, 72 insertions(+), 5 deletions(-)
diff --git a/common/panel-xfconf.c b/common/panel-xfconf.c
index ccae3ae..5d45d11 100644
--- a/common/panel-xfconf.c
+++ b/common/panel-xfconf.c
@@ -109,7 +109,10 @@ panel_properties_bind (XfconfChannel *channel,
if (save_properties)
panel_properties_store_value (channel, property, prop->type, object, prop->property);
- xfconf_g_property_bind (channel, property, prop->type, object, prop->property);
+ if (G_LIKELY (prop->type != GDK_TYPE_COLOR))
+ xfconf_g_property_bind (channel, property, prop->type, object, prop->property);
+ else
+ xfconf_g_property_bind_gdkcolor (channel, property, object, prop->property);
g_free (property);
}
diff --git a/panel/panel-application.c b/panel/panel-application.c
index f1a32a0..1ef2c27 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -268,6 +268,8 @@ panel_application_xfconf_window_bindings (PanelApplication *application,
{ "enter-opacity", G_TYPE_UINT },
{ "leave-opacity", G_TYPE_UINT },
{ "background-alpha", G_TYPE_UINT },
+ { "background-style", G_TYPE_UINT },
+ { "background-color", GDK_TYPE_COLOR },
{ "output-name", G_TYPE_STRING },
{ "position", G_TYPE_STRING },
{ "disable-struts", G_TYPE_BOOLEAN },
diff --git a/panel/panel-base-window.c b/panel/panel-base-window.c
index 77eb5fe..90536c6 100644
--- a/panel/panel-base-window.c
+++ b/panel/panel-base-window.c
@@ -75,14 +75,19 @@ enum
PROP_BORDERS,
PROP_ACTIVE,
PROP_COMPOSITED,
+ PROP_BACKGROUND_STYLE,
+ PROP_BACKGROUND_COLOR
};
struct _PanelBaseWindowPrivate
{
- /* borders */
PanelBorders borders;
- /* settings */
+ /* background options */
+ PanelBgStyle bg_style;
+ GdkColor bg_color;
+
+ /* transparency settings */
gdouble enter_opacity;
gdouble leave_opacity;
@@ -138,6 +143,22 @@ panel_base_window_class_init (PanelBaseWindowClass *klass)
EXO_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
+ PROP_BACKGROUND_STYLE,
+ g_param_spec_uint ("background-style",
+ NULL, NULL,
+ PANEL_BG_STYLE_NONE,
+ PANEL_BG_STYLE_THEME,
+ PANEL_BG_STYLE_NONE,
+ EXO_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_BACKGROUND_COLOR,
+ g_param_spec_boxed ("background-color",
+ NULL, NULL,
+ GDK_TYPE_COLOR,
+ EXO_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
PROP_BORDERS,
g_param_spec_uint ("borders",
NULL, NULL,
@@ -169,6 +190,8 @@ panel_base_window_init (PanelBaseWindow *window)
window->is_composited = FALSE;
window->background_alpha = 1.00;
+ window->priv->bg_style = PANEL_BG_STYLE_NONE;
+
window->priv->enter_opacity = 1.00;
window->priv->leave_opacity = 1.00;
window->priv->borders = PANEL_BORDER_NONE;
@@ -203,6 +226,14 @@ panel_base_window_get_property (GObject *object,
g_value_set_uint (value, rint (window->background_alpha * 100.00));
break;
+ case PROP_BACKGROUND_STYLE:
+ g_value_set_uint (value, priv->bg_style);
+ break;
+
+ case PROP_BACKGROUND_COLOR:
+ g_value_set_boxed (value, &priv->bg_color);
+ break;
+
case PROP_BORDERS:
g_value_set_uint (value, priv->borders);
break;
@@ -232,6 +263,7 @@ panel_base_window_set_property (GObject *object,
PanelBaseWindow *window = PANEL_BASE_WINDOW (object);
PanelBaseWindowPrivate *priv = window->priv;
GtkWidget *itembar;
+ GdkColor *bg_color;
switch (prop_id)
{
@@ -260,6 +292,19 @@ panel_base_window_set_property (GObject *object,
panel_base_window_set_plugin_background_alpha, window);
break;
+ case PROP_BACKGROUND_STYLE:
+ priv->bg_style = g_value_get_uint (value);
+ break;
+
+ case PROP_BACKGROUND_COLOR:
+ bg_color = g_value_get_boxed (value);
+ if (bg_color != NULL && !gdk_color_equal (&priv->bg_color, bg_color))
+ {
+ priv->bg_color = *bg_color;
+ gtk_widget_queue_draw (GTK_WIDGET (window));
+ }
+ break;
+
case PROP_BORDERS:
/* set new window borders and redraw the widget */
panel_base_window_set_borders (PANEL_BASE_WINDOW (object),
@@ -330,6 +375,12 @@ panel_base_window_expose_event (GtkWidget *widget,
if (!GTK_WIDGET_DRAWABLE (widget))
return result;
+ /* get the background color */
+ if (priv->bg_style == PANEL_BG_STYLE_COLOR)
+ color = &priv->bg_color;
+ else
+ color = &(widget->style->bg[GTK_STATE_NORMAL]);
+
/* create cairo context and set some default properties */
cr = gdk_cairo_create (widget->window);
panel_return_val_if_fail (cr != NULL, result);
@@ -344,13 +395,13 @@ panel_base_window_expose_event (GtkWidget *widget,
alpha = window->is_composited ? window->background_alpha : 1.00;
/* only do something with the background when compositing is enabled */
- if (G_UNLIKELY (alpha < 1.00))
+ if (G_UNLIKELY (alpha < 1.00
+ || priv->bg_style != PANEL_BG_STYLE_NONE))
{
/* clip the drawing area, but preserve the rectangle */
cairo_clip_preserve (cr);
/* make the background transparent */
- color = &(widget->style->bg[GTK_STATE_NORMAL]);
panel_util_set_source_rgba (cr, color, alpha);
cairo_fill (cr);
}
diff --git a/panel/panel-base-window.h b/panel/panel-base-window.h
index 78333e4..9e8a8cb 100644
--- a/panel/panel-base-window.h
+++ b/panel/panel-base-window.h
@@ -27,6 +27,7 @@ typedef struct _PanelBaseWindowClass PanelBaseWindowClass;
typedef struct _PanelBaseWindow PanelBaseWindow;
typedef struct _PanelBaseWindowPrivate PanelBaseWindowPrivate;
typedef enum _PanelBorders PanelBorders;
+typedef enum _PanelBgStyle PanelBgStyle;
#define PANEL_TYPE_BASE_WINDOW (panel_base_window_get_type ())
#define PANEL_BASE_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PANEL_TYPE_BASE_WINDOW, PanelBaseWindow))
@@ -44,6 +45,14 @@ enum _PanelBorders
PANEL_BORDER_BOTTOM = 1 << 3
};
+enum _PanelBgStyle
+{
+ PANEL_BG_STYLE_NONE,
+ PANEL_BG_STYLE_COLOR,
+ PANEL_BG_STYLE_IMAGE,
+ PANEL_BG_STYLE_THEME
+};
+
struct _PanelBaseWindowClass
{
GtkWindowClass __parent__;
diff --git a/panel/panel-preferences-dialog.c b/panel/panel-preferences-dialog.c
index cc7b0fe..cc08a69 100644
--- a/panel/panel-preferences-dialog.c
+++ b/panel/panel-preferences-dialog.c
@@ -359,6 +359,8 @@ panel_preferences_dialog_bindings_update (PanelPreferencesDialog *dialog)
panel_preferences_dialog_bindings_add (dialog, "enter-opacity", "value");
panel_preferences_dialog_bindings_add (dialog, "leave-opacity", "value");
panel_preferences_dialog_bindings_add (dialog, "composited", "visible");
+ panel_preferences_dialog_bindings_add (dialog, "background-style", "active");
+ panel_preferences_dialog_bindings_add (dialog, "background-color", "color");
/* get run mode of the driver (multiple screens or randr) */
display = gtk_widget_get_display (GTK_WIDGET (dialog->active));
More information about the Xfce4-commits
mailing list