[Xfce4-commits] <xfce4-panel:devel> * Partly fix background alpa in remote plugins.

Nick Schermer nick at xfce.org
Tue Aug 11 20:22:16 CEST 2009


Updating branch refs/heads/devel
         to 5b1cb8e6eccde167e6e7f1ed9865b29324a78ea5 (commit)
       from 6f857b4daa7863eeee51aa370b58ce7e1382064b (commit)

commit 5b1cb8e6eccde167e6e7f1ed9865b29324a78ea5
Author: Nick Schermer <nick at xfce.org>
Date:   Fri Jun 20 23:17:51 2008 +0200

    * Partly fix background alpa in remote plugins.

 libxfce4panel/xfce-panel-plugin-provider.c |   11 --
 libxfce4panel/xfce-panel-plugin-provider.h |   17 +--
 libxfce4panel/xfce-panel-plugin.c          |   14 --
 panel/panel-application.c                  |   12 ++-
 panel/panel-plugin-external.c              |   80 +++++++++--
 panel/panel-plugin-external.h              |    2 +
 panel/panel-window.c                       |   25 +++-
 plugins/clock/clock.desktop.in.in          |    2 +-
 plugins/systray/systray.desktop.in.in      |    2 +-
 plugins/tasklist/tasklist.desktop.in.in    |    2 +-
 wrapper/main.c                             |    2 +-
 wrapper/wrapper-plug.c                     |  211 +++++++++++++++++-----------
 12 files changed, 238 insertions(+), 142 deletions(-)

diff --git a/libxfce4panel/xfce-panel-plugin-provider.c b/libxfce4panel/xfce-panel-plugin-provider.c
index 7395a13..44a8a6a 100644
--- a/libxfce4panel/xfce-panel-plugin-provider.c
+++ b/libxfce4panel/xfce-panel-plugin-provider.c
@@ -176,17 +176,6 @@ xfce_panel_plugin_provider_set_screen_position (XfcePanelPluginProvider *provide
 
 
 void
-xfce_panel_plugin_provider_set_opacity (XfcePanelPluginProvider *provider,
-                                        gdouble                  opacity)
-{
-  panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
-
-  (*XFCE_PANEL_PLUGIN_PROVIDER_GET_IFACE (provider)->set_opacity) (provider, opacity);
-}
-
-
-
-void
 xfce_panel_plugin_provider_save (XfcePanelPluginProvider *provider)
 {
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
diff --git a/libxfce4panel/xfce-panel-plugin-provider.h b/libxfce4panel/xfce-panel-plugin-provider.h
index 0f99b3c..286d396 100644
--- a/libxfce4panel/xfce-panel-plugin-provider.h
+++ b/libxfce4panel/xfce-panel-plugin-provider.h
@@ -35,11 +35,6 @@ typedef XfcePanelPluginProvider *(*PluginConstructFunc) (const gchar  *name,
 
 typedef void (*PluginRegisterTypesFunc) (XfcePanelModule *module);
 
-#define XFCE_TYPE_PANEL_PLUGIN_PROVIDER           (xfce_panel_plugin_provider_get_type ())
-#define XFCE_PANEL_PLUGIN_PROVIDER(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFCE_TYPE_PANEL_PLUGIN_PROVIDER, XfcePanelPluginProvider))
-#define XFCE_IS_PANEL_PLUGIN_PROVIDER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFCE_TYPE_PANEL_PLUGIN_PROVIDER))
-#define XFCE_PANEL_PLUGIN_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), XFCE_TYPE_PANEL_PLUGIN_PROVIDER, XfcePanelPluginProviderIface))
-
 enum _XfcePanelPluginMessage
 {
   MESSAGE_EXPAND_CHANGED,
@@ -51,10 +46,17 @@ enum _XfcePanelPluginMessage
   MESSAGE_SET_SCREEN_POSITION,
   MESSAGE_SET_PLUG_ID,
   MESSAGE_SET_SENSITIVE,
+  MESSAGE_SET_BACKGROUND_ALPHA,
+  MESSAGE_SAVE,
   MESSAGE_REMOVE,
   MESSAGE_QUIT
 };
 
+#define XFCE_TYPE_PANEL_PLUGIN_PROVIDER           (xfce_panel_plugin_provider_get_type ())
+#define XFCE_PANEL_PLUGIN_PROVIDER(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFCE_TYPE_PANEL_PLUGIN_PROVIDER, XfcePanelPluginProvider))
+#define XFCE_IS_PANEL_PLUGIN_PROVIDER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFCE_TYPE_PANEL_PLUGIN_PROVIDER))
+#define XFCE_PANEL_PLUGIN_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), XFCE_TYPE_PANEL_PLUGIN_PROVIDER, XfcePanelPluginProviderIface))
+
 struct _XfcePanelPluginProviderIface
 {
   /*< private >*/
@@ -69,8 +71,6 @@ struct _XfcePanelPluginProviderIface
                                        GtkOrientation           orientation);
   void         (*set_screen_position) (XfcePanelPluginProvider *provider,
                                        XfceScreenPosition       screen_position);
-  void         (*set_opacity)         (XfcePanelPluginProvider *provider,
-                                       gdouble                  opacity);
   void         (*save)                (XfcePanelPluginProvider *provider);
 };
 
@@ -89,9 +89,6 @@ void         xfce_panel_plugin_provider_set_orientation     (XfcePanelPluginProv
 void         xfce_panel_plugin_provider_set_screen_position (XfcePanelPluginProvider *provider,
                                                              XfceScreenPosition       screen_position);
 
-void         xfce_panel_plugin_provider_set_opacity         (XfcePanelPluginProvider *provider,
-                                                             gdouble                  opacity);
-
 void         xfce_panel_plugin_provider_save                (XfcePanelPluginProvider *provider);
 
 G_END_DECLS
diff --git a/libxfce4panel/xfce-panel-plugin.c b/libxfce4panel/xfce-panel-plugin.c
index 9caff29..ceb2de4 100644
--- a/libxfce4panel/xfce-panel-plugin.c
+++ b/libxfce4panel/xfce-panel-plugin.c
@@ -63,8 +63,6 @@ static void         xfce_panel_plugin_set_orientation      (XfcePanelPluginProvi
                                                             GtkOrientation                orientation);
 static void         xfce_panel_plugin_set_screen_position  (XfcePanelPluginProvider      *provider,
                                                             XfceScreenPosition            screen_position);
-static void         xfce_panel_plugin_set_opacity          (XfcePanelPluginProvider      *provider,
-                                                            gdouble                       opacity);
 static void         xfce_panel_plugin_save                 (XfcePanelPluginProvider      *provider);
 static void         xfce_panel_plugin_take_window_notify   (gpointer                      data,
                                                             GObject                      *where_the_object_was);
@@ -373,7 +371,6 @@ xfce_panel_plugin_provider_init (XfcePanelPluginProviderIface *iface)
   iface->set_size = xfce_panel_plugin_set_size;
   iface->set_orientation = xfce_panel_plugin_set_orientation;
   iface->set_screen_position = xfce_panel_plugin_set_screen_position;
-  iface->set_opacity = xfce_panel_plugin_set_opacity;
   iface->save = xfce_panel_plugin_save;
 }
 
@@ -923,17 +920,6 @@ xfce_panel_plugin_set_screen_position (XfcePanelPluginProvider *provider,
 
 
 static void
-xfce_panel_plugin_set_opacity (XfcePanelPluginProvider *provider,
-                               gdouble                  opacity)
-{
-  //XfcePanelPlugin *plugin = XFCE_PANEL_PLUGIN (provider);
-
-  //panel_return_if_fail (XFCE_IS_PANEL_PLUGIN (provider));
-}
-
-
-
-static void
 xfce_panel_plugin_save (XfcePanelPluginProvider *provider)
 {
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN (provider));
diff --git a/panel/panel-application.c b/panel/panel-application.c
index 5162b3a..178f976 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -40,6 +40,7 @@
 #include <panel/panel-item-dialog.h>
 #include <panel/panel-dialogs.h>
 #include <panel/panel-glue.h>
+#include <panel/panel-plugin-external.h>
 
 #define PANEL_CONFIG_PATH "xfce4" G_DIR_SEPARATOR_S "panel" G_DIR_SEPARATOR_S "panels.new.xml"
 #define AUTOSAVE_INTERVAL (10 * 60)
@@ -337,7 +338,7 @@ expand_handle (GtkWidget *plugin,
 {
   GtkWidget *itembar;
 
-  panel_return_if_fail (XFCE_IS_PANEL_PLUGIN (plugin));
+  panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (plugin));
   panel_return_if_fail (PANEL_IS_WINDOW (window));
 
   /* get the itembar */
@@ -439,13 +440,18 @@ panel_application_insert_plugin (PanelApplication  *application,
       /* add the item to the panel */
       panel_itembar_insert (PANEL_ITEMBAR (itembar), GTK_WIDGET (provider), position);
 
-      /* show the plugin */
-      gtk_widget_show (GTK_WIDGET (provider));
+      /* set the background alpha if the plugin is external */
+      if (PANEL_IS_PLUGIN_EXTERNAL (provider))
+        panel_plugin_external_set_background_alpha (PANEL_PLUGIN_EXTERNAL (provider), panel_window_get_background_alpha (window));
 
+      /* send plugin information */
       xfce_panel_plugin_provider_set_orientation (provider, panel_window_get_orientation (window));
       xfce_panel_plugin_provider_set_screen_position (provider, panel_glue_get_screen_position (window));
       xfce_panel_plugin_provider_set_size (provider, panel_window_get_size (window));
 
+      /* show the plugin */
+      gtk_widget_show (GTK_WIDGET (provider));
+
       /* we've succeeded */
       succeed = TRUE;
     }
diff --git a/panel/panel-plugin-external.c b/panel/panel-plugin-external.c
index c9e6c5e..ea54df1 100644
--- a/panel/panel-plugin-external.c
+++ b/panel/panel-plugin-external.c
@@ -44,6 +44,7 @@ static gboolean     panel_plugin_external_plug_removed        (GtkSocket
 static void         panel_plugin_external_send_message        (PanelPluginExternal          *external,
                                                                XfcePanelPluginMessage        message,
                                                                glong                         value);
+static void         panel_plugin_external_free_queue          (PanelPluginExternal          *external);
 static void         panel_plugin_external_flush_queue         (PanelPluginExternal          *external);
 static const gchar *panel_plugin_external_get_name            (XfcePanelPluginProvider      *provider);
 static const gchar *panel_plugin_external_get_id              (XfcePanelPluginProvider      *provider);
@@ -53,6 +54,7 @@ static void         panel_plugin_external_set_orientation     (XfcePanelPluginPr
                                                                GtkOrientation                orientation);
 static void         panel_plugin_external_set_screen_position (XfcePanelPluginProvider      *provider,
                                                                XfceScreenPosition            screen_position);
+static void         panel_plugin_external_save                (XfcePanelPluginProvider      *provider);
 static void         panel_plugin_external_set_sensitive       (PanelPluginExternal          *external);
 
 
@@ -145,6 +147,7 @@ panel_plugin_external_provider_init (XfcePanelPluginProviderIface *iface)
   iface->set_size = panel_plugin_external_set_size;
   iface->set_orientation = panel_plugin_external_set_orientation;
   iface->set_screen_position = panel_plugin_external_set_screen_position;
+  iface->save = panel_plugin_external_save;
 }
 
 
@@ -154,12 +157,13 @@ panel_plugin_external_finalize (GObject *object)
 {
   PanelPluginExternal *external = PANEL_PLUGIN_EXTERNAL (object);
 
-  panel_return_if_fail (external->queue == NULL);
-
   /* cleanup */
   g_free (external->id);
   g_strfreev (external->arguments);
 
+  /* free the queue if needed */
+  panel_plugin_external_free_queue (external);
+
   /* release the module */
   g_object_unref (G_OBJECT (external->module));
 
@@ -383,6 +387,29 @@ panel_plugin_external_send_message (PanelPluginExternal    *external,
 
 
 static void
+panel_plugin_external_free_queue (PanelPluginExternal *external)
+{
+  GSList *li;
+
+  panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external));
+
+  if (external->queue != NULL)
+    {
+      /* cleanup all the queue data */
+      for (li = external->queue; li != NULL; li = li->next)
+        g_slice_free (QueueData, li->data);
+
+      /* free the list */
+      g_slist_free (external->queue);
+
+      /* set to null */
+      external->queue = NULL;
+    }
+}
+
+
+
+static void
 panel_plugin_external_flush_queue (PanelPluginExternal *external)
 {
   GSList    *li;
@@ -391,25 +418,17 @@ panel_plugin_external_flush_queue (PanelPluginExternal *external)
   panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external));
   panel_return_if_fail (external->plug_window_id != 0);
 
-  if (external->queue != NULL)
+  if (G_LIKELY (external->queue != NULL))
     {
-      /* free all message */
+      /* send all messages in the queue */
       for (li = external->queue; li != NULL; li = li->next)
         {
           data = li->data;
-
-          /* send message */
           panel_plugin_external_send_message (external, data->message, data->value);
-
-          /* cleanup */
-          g_slice_free (QueueData, data);
         }
 
-      /* cleanup */
-      g_slist_free (external->queue);
-
-      /* set to null */
-      external->queue = NULL;
+      /* free the queue */
+      panel_plugin_external_free_queue (external);
     }
 }
 
@@ -441,6 +460,9 @@ static void
 panel_plugin_external_set_size (XfcePanelPluginProvider *provider,
                                 gint                     size)
 {
+  panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (provider));
+  panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
+
   /* send the signal to the wrapper */
   panel_plugin_external_send_message (PANEL_PLUGIN_EXTERNAL (provider), MESSAGE_SET_SIZE, size);
 }
@@ -451,6 +473,9 @@ static void
 panel_plugin_external_set_orientation (XfcePanelPluginProvider *provider,
                                        GtkOrientation           orientation)
 {
+  panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (provider));
+  panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
+
   /* send the signal to the wrapper */
   panel_plugin_external_send_message (PANEL_PLUGIN_EXTERNAL (provider), MESSAGE_SET_ORIENTATION, orientation);
 }
@@ -461,6 +486,9 @@ static void
 panel_plugin_external_set_screen_position (XfcePanelPluginProvider *provider,
                                            XfceScreenPosition       screen_position)
 {
+  panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (provider));
+  panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
+
   /* send the signal to the wrapper */
   panel_plugin_external_send_message (PANEL_PLUGIN_EXTERNAL (provider), MESSAGE_SET_SCREEN_POSITION, screen_position);
 }
@@ -468,6 +496,18 @@ panel_plugin_external_set_screen_position (XfcePanelPluginProvider *provider,
 
 
 static void
+panel_plugin_external_save (XfcePanelPluginProvider *provider)
+{
+  panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (provider));
+  panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
+
+  /* send the signal to the wrapper */
+  panel_plugin_external_send_message (PANEL_PLUGIN_EXTERNAL (provider), MESSAGE_SAVE, 0);
+}
+
+
+
+static void
 panel_plugin_external_set_sensitive (PanelPluginExternal *external)
 {
   panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external));
@@ -501,3 +541,15 @@ panel_plugin_external_new (PanelModule  *module,
   return XFCE_PANEL_PLUGIN_PROVIDER (external);
 }
 
+
+
+void
+panel_plugin_external_set_background_alpha (PanelPluginExternal *external,
+                                            gint                 percentage)
+{
+  panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external));
+  panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (external));
+
+  /* send the signal to the wrapper */
+  panel_plugin_external_send_message (PANEL_PLUGIN_EXTERNAL (external), MESSAGE_SET_BACKGROUND_ALPHA, percentage);
+}
diff --git a/panel/panel-plugin-external.h b/panel/panel-plugin-external.h
index d98d09a..db93aef 100644
--- a/panel/panel-plugin-external.h
+++ b/panel/panel-plugin-external.h
@@ -39,6 +39,8 @@ GType panel_plugin_external_get_type (void) G_GNUC_CONST;
 
 XfcePanelPluginProvider *panel_plugin_external_new (PanelModule *module, const gchar *name, const gchar *id, gchar **arguments);
 
+void panel_plugin_external_set_background_alpha (PanelPluginExternal *external, gint percentage);
+
 G_END_DECLS
 
 #endif /* !__PANEL_PLUGIN_EXTERNAL_H__ */
diff --git a/panel/panel-window.c b/panel/panel-window.c
index 8a77e92..b705278 100644
--- a/panel/panel-window.c
+++ b/panel/panel-window.c
@@ -30,6 +30,7 @@
 #include <panel/panel-window.h>
 #include <panel/panel-glue.h>
 #include <panel/panel-application.h>
+#include <panel/panel-plugin-external.h>
 
 #define HANDLE_SIZE       (8)
 #define HANDLE_SPACING    (2)
@@ -1880,12 +1881,26 @@ panel_window_get_background_alpha (PanelWindow *window)
 }
 
 
+static void
+panel_window_set_plugin_background_alpha (GtkWidget *widget,
+                                          gpointer   user_data)
+{
+  panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (widget));
+  panel_return_if_fail (PANEL_IS_WINDOW (user_data));
+
+  /* we only have to send the alpha to external plugins */
+  if (PANEL_IS_PLUGIN_EXTERNAL (widget))
+    panel_plugin_external_set_background_alpha (PANEL_PLUGIN_EXTERNAL (widget), panel_window_get_background_alpha (PANEL_WINDOW (user_data)));
+}
+
+
 
 void
 panel_window_set_background_alpha (PanelWindow *window,
                                    gint         alpha)
 {
-  gdouble value;
+  gdouble    value;
+  GtkWidget *itembar;
 
   panel_return_if_fail (PANEL_IS_WINDOW (window));
   panel_return_if_fail (alpha >= 0 && alpha <= 100);
@@ -1897,8 +1912,14 @@ panel_window_set_background_alpha (PanelWindow *window,
       /* set new alpha value */
       window->background_alpha = value;
 
-      /* redraw */
+      /* redraw the window */
       gtk_widget_queue_draw (GTK_WIDGET (window));
+
+      /* get the itembar */
+      itembar = gtk_bin_get_child (GTK_BIN (window));
+
+      /* walk the plugins */
+      gtk_container_foreach (GTK_CONTAINER (itembar), panel_window_set_plugin_background_alpha, window);
     }
 }
 
diff --git a/plugins/clock/clock.desktop.in.in b/plugins/clock/clock.desktop.in.in
index 896bd32..8e31354 100644
--- a/plugins/clock/clock.desktop.in.in
+++ b/plugins/clock/clock.desktop.in.in
@@ -6,4 +6,4 @@ _Comment=What time is it?
 Icon=x-office-calendar
 X-XFCE-Module=clock
 X-XFCE-Module-Path=@libdir@/xfce4/panel-plugins
-X-XFCE-External=FALSE
+X-XFCE-External=TRUE
diff --git a/plugins/systray/systray.desktop.in.in b/plugins/systray/systray.desktop.in.in
index e4cdc7d..32b7dc4 100644
--- a/plugins/systray/systray.desktop.in.in
+++ b/plugins/systray/systray.desktop.in.in
@@ -6,4 +6,4 @@ _Comment=Area where notification icons appear
 Icon=applications-system
 X-XFCE-Module=systray
 X-XFCE-Module-Path=@libdir@/xfce4/panel-plugins
-X-XFCE-External=FALSE
+X-XFCE-External=TRUE
diff --git a/plugins/tasklist/tasklist.desktop.in.in b/plugins/tasklist/tasklist.desktop.in.in
index ebb3a1f..767da5e 100644
--- a/plugins/tasklist/tasklist.desktop.in.in
+++ b/plugins/tasklist/tasklist.desktop.in.in
@@ -6,4 +6,4 @@ _Comment=Show all running applications
 Icon=xfwm4
 X-XFCE-Module=tasklist
 X-XFCE-Module-Path=@libdir@/xfce4/panel-plugins
-X-XFCE-External=FALSE
+X-XFCE-External=TRUE
diff --git a/wrapper/main.c b/wrapper/main.c
index 1c9e4e7..19882d6 100644
--- a/wrapper/main.c
+++ b/wrapper/main.c
@@ -114,7 +114,7 @@ main (gint argc, gchar **argv)
           gtk_container_add (GTK_CONTAINER (plug), GTK_WIDGET (provider));
           gtk_widget_show (plug);
 
-          /* show the plugin */
+          /* realize the plugin */
           gtk_widget_show (GTK_WIDGET (provider));
 
           /* everything worked fine */
diff --git a/wrapper/wrapper-plug.c b/wrapper/wrapper-plug.c
index 20d945b..b9ddef8 100644
--- a/wrapper/wrapper-plug.c
+++ b/wrapper/wrapper-plug.c
@@ -20,6 +20,7 @@
 #endif
 
 #include <gdk/gdk.h>
+#include <panel/panel-private.c>
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4panel/libxfce4panel.h>
 #include <libxfce4panel/xfce-panel-plugin-provider.h>
@@ -43,52 +44,80 @@ struct _WrapperPlugClass
 struct _WrapperPlug
 {
   GtkPlug __parent__;
-  
+
   /* the panel plugin */
   XfcePanelPluginProvider *provider;
-  
+
   /* socket id of panel window */
   GdkNativeWindow          socket_id;
-  
+
   /* the message atom */
   GdkAtom                  atom;
+
+  /* background alpha */
+  gdouble                  background_alpha;
 };
 
 
 
 G_DEFINE_TYPE (WrapperPlug, wrapper_plug, GTK_TYPE_PLUG);
 
-//~ static gboolean
-//~ wrapper_plug_expose_event (GtkWidget      *widget,
-                           //~ GdkEventExpose *event)
-//~ {
-  //~ cairo_t  *cr;
-    //~ GtkStyle *style;
-    //~ double    r,g,b;
-//~ 
-    //~ cr = gdk_cairo_create (widget->window);	
-//~ 
-    //~ cairo_rectangle (cr, event->area.x,
-                     //~ event->area.y,
-                     //~ event->area.width,
-                     //~ event->area.height);
-    //~ cairo_clip (cr);
-//~ 
-    //~ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
-//~ 
-    //~ /* fully transparent */
-    //~ style = gtk_widget_get_style (widget);
-    //~ r = (double) style->bg[widget->state].red / (double) 65535;
-    //~ g = (double) style->bg[widget->state].green / (double) 65535;
-    //~ b = (double) style->bg[widget->state].blue / (double) 65535;
-    //~ cairo_set_source_rgba (cr, r, g, b, 0.50);
-    //~ cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
-    //~ cairo_paint (cr);
-		//~ 
-    //~ cairo_destroy (cr);
-
-    //~ return GTK_WIDGET_CLASS(wrapper_plug_parent_class)->expose_event(widget, event);
-//~ }
+
+
+static gboolean
+wrapper_plug_expose_event (GtkWidget      *widget,
+                           GdkEventExpose *event)
+{
+  WrapperPlug *plug = WRAPPER_PLUG (widget);
+  cairo_t     *cr;
+  GdkColor    *color;
+
+  if (GTK_WIDGET_DRAWABLE (widget) && plug->background_alpha < 1.00)
+    {
+      /* create the cairo context */
+      cr = gdk_cairo_create (widget->window);
+
+      /* get the background gdk color */
+      color = &(widget->style->bg[GTK_STATE_NORMAL]);
+
+      /* set the cairo source color */
+      _set_source_rgba (cr, color, plug->background_alpha);
+
+      /* create retangle */
+      cairo_rectangle (cr, event->area.x, event->area.y,
+                       event->area.width, event->area.height);
+
+      /* draw on source */
+      cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+
+      /* paint rectangle */
+      cairo_fill (cr);
+
+      /* destroy cairo context */
+      cairo_destroy (cr);
+    }
+
+
+  //~ cairo_rectangle (cr, event->area.x,
+                   //~ event->area.y,
+                   //~ event->area.width,
+                   //~ event->area.height);
+  //~ cairo_clip (cr);
+//~
+  //~ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+//~
+  //~ style = gtk_widget_get_style (widget);
+  //~ r = (double) style->bg[widget->state].red / (double) 65535;
+  //~ g = (double) style->bg[widget->state].green / (double) 65535;
+  //~ b = (double) style->bg[widget->state].blue / (double) 65535;
+  //~ cairo_set_source_rgba (cr, r, g, b, 0.50);
+  //~ cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
+  //~ cairo_paint (cr);
+//~
+  //~ cairo_destroy (cr);
+
+    return GTK_WIDGET_CLASS(wrapper_plug_parent_class)->expose_event(widget, event);
+}
 
 
 
@@ -100,10 +129,10 @@ wrapper_plug_class_init (WrapperPlugClass *klass)
 
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = wrapper_plug_finalize;
-  
+
   gtkwidget_class = GTK_WIDGET_CLASS (klass);
   gtkwidget_class->client_event = wrapper_plug_client_event;
-  //gtkwidget_class->expose_event = wrapper_plug_expose_event;
+  gtkwidget_class->expose_event = wrapper_plug_expose_event;
 }
 
 
@@ -113,26 +142,27 @@ wrapper_plug_init (WrapperPlug *plug)
 {
   plug->socket_id = 0;
   plug->atom = panel_atom_intern ("XFCE_PANEL_PLUGIN");
-  
-  //~ GdkScreen   *screen;
-  //~ GdkColormap *colormap;
-  //~ GtkWidget   *widget = GTK_WIDGET (plug);
-  //~ 
-  //~ /* try to set the rgba colormap */
-  //~ screen = gtk_window_get_screen (GTK_WINDOW (plug));
-  //~ if (gdk_screen_is_composited (screen))
-    //~ {
-      //~ /* try to get the rgba colormap */
-      //~ colormap = gdk_screen_get_rgba_colormap (screen);
-//~ 
-      //~ if (G_LIKELY (colormap))
-        //~ {
-          //~ /* set the colormap */
-          //~ gtk_widget_set_colormap (widget, colormap);
-        //~ }
-    //~ }
-    
-    //gtk_widget_set_app_paintable (GTK_WIDGET (plug), TRUE);
+  plug->background_alpha = 1.00;
+
+  GdkScreen   *screen;
+  GdkColormap *colormap;
+  GtkWidget   *widget = GTK_WIDGET (plug);
+
+  /* try to set the rgba colormap */
+  screen = gtk_window_get_screen (GTK_WINDOW (plug));
+  if (gdk_screen_is_composited (screen))
+    {
+      /* try to get the rgba colormap */
+      colormap = gdk_screen_get_rgba_colormap (screen);
+
+      if (G_LIKELY (colormap))
+        {
+          /* set the colormap */
+          gtk_widget_set_colormap (widget, colormap);
+        }
+    }
+
+  gtk_widget_set_app_paintable (GTK_WIDGET (plug), TRUE);
 }
 
 
@@ -147,56 +177,69 @@ wrapper_plug_finalize (GObject *object)
 
 
 
-static gboolean 
-wrapper_plug_client_event (GtkWidget      *widget, 
+static gboolean
+wrapper_plug_client_event (GtkWidget      *widget,
                            GdkEventClient *event)
 {
   WrapperPlug            *plug = WRAPPER_PLUG (widget);
   XfcePanelPluginMessage  message;
   glong                   value;
-  
+
   /* check if this is a panel client event */
   if (G_LIKELY (event->message_type == plug->atom))
     {
       /* get message and value */
       message = event->data.l[0];
       value = event->data.l[1];
-      
+
       switch (message)
         {
           case MESSAGE_SET_SENSITIVE:
             /* set the sensitivity of the plug */
             gtk_widget_set_sensitive (widget, !!(value == 1));
             break;
-          
+
           case MESSAGE_SET_SIZE:
             /* set the new plugin size */
             xfce_panel_plugin_provider_set_size (plug->provider, value);
             break;
-          
+
           case MESSAGE_SET_ORIENTATION:
             /* set the plugin orientation */
             xfce_panel_plugin_provider_set_orientation (plug->provider, value);
             break;
-          
+
           case MESSAGE_SET_SCREEN_POSITION:
             /* set the plugin screen position */
             xfce_panel_plugin_provider_set_screen_position (plug->provider, value);
             break;
-            
+
+          case MESSAGE_SET_BACKGROUND_ALPHA:
+            /* set the background alpha */
+            plug->background_alpha = CLAMP (value, 0, 100) / 100.00;
+
+            /* redraw the window */
+            gtk_widget_queue_draw (widget);
+            break;
+
+          case MESSAGE_SAVE:
+            /* save the plugin */
+            xfce_panel_plugin_provider_save (plug->provider);
+            break;
+
           case MESSAGE_QUIT:
             /* don't send messages */
             plug->socket_id = 0;
-            
+
             /* quit the main loop (destroy plugin) */
             gtk_main_quit ();
             break;
-          
+
           default:
             g_message ("The wrapper received an unknown message: %d", message);
             break;
         }
-      
+
       /* we handled the event */
       return TRUE;
     }
@@ -216,9 +259,9 @@ wrapper_plug_send_message (WrapperPlug            *plug,
                            glong                   value)
 {
   GdkEventClient event;
-  
+
   panel_return_if_fail (WRAPPER_IS_PLUG (plug));
-  
+
   if (G_LIKELY (plug->socket_id > 0))
     {
       /* setup the event */
@@ -230,16 +273,16 @@ wrapper_plug_send_message (WrapperPlug            *plug,
       event.data.l[0] = message;
       event.data.l[1] = value;
       event.data.l[2] = 0;
-      
+
       /* don't crash on x errors */
       gdk_error_trap_push ();
-      
+
       /* send the event to the wrapper */
       gdk_event_send_client_message_for_display (gdk_display_get_default (), (GdkEvent *) &event, plug->socket_id);
-      
+
       /* flush the x output buffer */
       gdk_flush ();
-      
+
       /* pop the push */
       gdk_error_trap_pop ();
     }
@@ -254,7 +297,7 @@ wrapper_plug_message_expand_changed (XfcePanelPluginProvider *provider,
 {
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
   panel_return_if_fail (WRAPPER_IS_PLUG (plug));
-  
+
   /* send signal */
   wrapper_plug_send_message (plug, MESSAGE_EXPAND_CHANGED, expand ? 1 : 0);
 }
@@ -267,7 +310,7 @@ wrapper_plug_message_move_item (XfcePanelPluginProvider *provider,
 {
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
   panel_return_if_fail (WRAPPER_IS_PLUG (plug));
-  
+
   /* send signal */
   wrapper_plug_send_message (plug, MESSAGE_MOVE_ITEM, 0);
 }
@@ -280,7 +323,7 @@ wrapper_plug_message_add_new_items (XfcePanelPluginProvider *provider,
 {
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
   panel_return_if_fail (WRAPPER_IS_PLUG (plug));
-  
+
   /* send signal */
   wrapper_plug_send_message (plug, MESSAGE_ADD_NEW_ITEMS, 0);
 }
@@ -293,7 +336,7 @@ wrapper_plug_message_customize_panel (XfcePanelPluginProvider *provider,
 {
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
   panel_return_if_fail (WRAPPER_IS_PLUG (plug));
-  
+
   /* send signal */
   wrapper_plug_send_message (plug, MESSAGE_CUSTOMIZE_PANEL, 0);
 }
@@ -311,7 +354,7 @@ wrapper_plug_message_remove (XfcePanelPluginProvider *provider,
     {
       /* send signal */
       wrapper_plug_send_message (plug, MESSAGE_REMOVE, 0);
-      
+
       /* quit the wrapper */
       gtk_main_quit ();
     }
@@ -324,26 +367,26 @@ wrapper_plug_new (GdkNativeWindow          socket_id,
                   XfcePanelPluginProvider *provider)
 {
   WrapperPlug *plug;
-  
+
   /* create new object */
   plug = g_object_new (WRAPPER_TYPE_PLUG, NULL);
-  
+
   /* store info */
   plug->socket_id = socket_id;
   plug->provider = provider;
-  
+
   /* monitor changes in the provider */
   g_signal_connect (G_OBJECT (provider), "expand-changed", G_CALLBACK (wrapper_plug_message_expand_changed), plug);
   g_signal_connect (G_OBJECT (provider), "move-item", G_CALLBACK (wrapper_plug_message_move_item), plug);
   g_signal_connect (G_OBJECT (provider), "add-new-items", G_CALLBACK (wrapper_plug_message_add_new_items), plug);
   g_signal_connect (G_OBJECT (provider), "customize-panel", G_CALLBACK (wrapper_plug_message_customize_panel), plug);
   g_signal_connect (G_OBJECT (provider), "destroy", G_CALLBACK (wrapper_plug_message_remove), plug);
-  
+
   /* contruct the plug */
   gtk_plug_construct (GTK_PLUG (plug), socket_id);
-  
+
   /* send the plug id back to the panel */
   wrapper_plug_send_message (plug, MESSAGE_SET_PLUG_ID, gtk_plug_get_id (GTK_PLUG (plug)));
-  
+
   return GTK_WIDGET (plug);
 }



More information about the Xfce4-commits mailing list