[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