r14502 - in /packages/unstable/gdesklets/debian: changelog patches/02_trayicon-transparency.patch

lool at users.alioth.debian.org lool at users.alioth.debian.org
Mon Feb 11 17:30:41 UTC 2008


Author: lool
Date: Mon Feb 11 17:30:40 2008
New Revision: 14502

URL: http://svn.debian.org/wsvn/pkg-gnome/?sc=1&rev=14502
Log:
New patch, 02_trayicon-transparency, make the applet use the background
pixmap as to not break transparent panels; from Ubuntu.

Added:
    packages/unstable/gdesklets/debian/patches/02_trayicon-transparency.patch
Modified:
    packages/unstable/gdesklets/debian/changelog

Modified: packages/unstable/gdesklets/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/gdesklets/debian/changelog?rev=14502&op=diff
==============================================================================
--- packages/unstable/gdesklets/debian/changelog (original)
+++ packages/unstable/gdesklets/debian/changelog Mon Feb 11 17:30:40 2008
@@ -39,6 +39,8 @@
   * Add a python-pyorbit (>= 2.0.1) dep.
   * Drop config.guess and .sub from the relibtoolizing patch, 70_relibtoolize.
   * Bump up Debhelper compatibility level to 6.
+  * New patch, 02_trayicon-transparency, make the applet use the background
+    pixmap as to not break transparent panels; from Ubuntu.
 
  -- Deng Xiyue <manphiz-guest at users.alioth.debian.org>  Wed, 06 Feb 2008 13:49:53 +0800
 

Added: packages/unstable/gdesklets/debian/patches/02_trayicon-transparency.patch
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/gdesklets/debian/patches/02_trayicon-transparency.patch?rev=14502&op=file
==============================================================================
--- packages/unstable/gdesklets/debian/patches/02_trayicon-transparency.patch (added)
+++ packages/unstable/gdesklets/debian/patches/02_trayicon-transparency.patch Mon Feb 11 17:30:40 2008
@@ -1,0 +1,586 @@
+diff -Nur gdesklets-0.35.3/utils/eggtrayicon.c gdesklets-0.35.3.new/utils/eggtrayicon.c
+--- gdesklets-0.35.3/utils/eggtrayicon.c	2006-05-09 22:23:56.000000000 +0300
++++ gdesklets-0.35.3.new/utils/eggtrayicon.c	2006-05-09 22:29:55.000000000 +0300
+@@ -18,11 +18,28 @@
+  * Boston, MA 02111-1307, USA.
+  */
+ 
++#include <config.h>
++#include <string.h>
++#include <libintl.h>
++
+ #include "eggtrayicon.h"
+ 
++#include <gdk/gdkx.h>
+ #include <X11/Xatom.h>
+ 
++#ifndef EGG_COMPILATION
++#ifndef _
++#define _(x) dgettext (GETTEXT_PACKAGE, x)
++#define N_(x) x
++#endif
++#else
++#define _(x) x
++#define N_(x) x
++#endif
++
+ #define SYSTEM_TRAY_REQUEST_DOCK    0
++#define SYSTEM_TRAY_BEGIN_MESSAGE   1
++#define SYSTEM_TRAY_CANCEL_MESSAGE  2
+ 
+ #define SYSTEM_TRAY_ORIENTATION_HORZ 0
+ #define SYSTEM_TRAY_ORIENTATION_VERT 1
+@@ -31,25 +48,56 @@
+   PROP_0,
+   PROP_ORIENTATION
+ };
++         
++static GtkPlugClass *parent_class = NULL;
+ 
+-G_DEFINE_TYPE (EggTrayIcon, egg_tray_icon, GTK_TYPE_PLUG);
++static void egg_tray_icon_init (EggTrayIcon *icon);
++static void egg_tray_icon_class_init (EggTrayIconClass *klass);
+ 
+ static void egg_tray_icon_get_property (GObject    *object,
+-                                        guint       prop_id,
+-                                        GValue     *value,
+-                                        GParamSpec *pspec);
++					guint       prop_id,
++					GValue     *value,
++					GParamSpec *pspec);
+ 
+ static void egg_tray_icon_realize   (GtkWidget *widget);
+ static void egg_tray_icon_unrealize (GtkWidget *widget);
+ 
+ static void egg_tray_icon_update_manager_window (EggTrayIcon *icon);
+ 
++static void egg_tray_icon_add (GtkContainer *container, GtkWidget    *widget);
++
++GType
++egg_tray_icon_get_type (void)
++{
++  static GType our_type = 0;
++
++  if (our_type == 0)
++    {
++      static const GTypeInfo our_info =
++      {
++	sizeof (EggTrayIconClass),
++	(GBaseInitFunc) NULL,
++	(GBaseFinalizeFunc) NULL,
++	(GClassInitFunc) egg_tray_icon_class_init,
++	NULL, /* class_finalize */
++	NULL, /* class_data */
++	sizeof (EggTrayIcon),
++	0,    /* n_preallocs */
++	(GInstanceInitFunc) egg_tray_icon_init
++      };
++
++      our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0);
++    }
++
++  return our_type;
++}
++
+ static void
+ egg_tray_icon_init (EggTrayIcon *icon)
+ {
+   icon->stamp = 1;
+   icon->orientation = GTK_ORIENTATION_HORIZONTAL;
+-
++  
+   gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK);
+ }
+ 
+@@ -58,28 +106,32 @@
+ {
+   GObjectClass *gobject_class = (GObjectClass *)klass;
+   GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
++  GtkContainerClass *container_class = (GtkContainerClass *)klass;
++
++  parent_class = g_type_class_peek_parent (klass);
+ 
+   gobject_class->get_property = egg_tray_icon_get_property;
+ 
+   widget_class->realize   = egg_tray_icon_realize;
+   widget_class->unrealize = egg_tray_icon_unrealize;
+ 
+-  g_object_class_install_property (gobject_class,
+-                                   PROP_ORIENTATION,
+-                                   g_param_spec_enum ("orientation",
+-                                                      "Orientation",
+-                                                      "The orientation of the tray.",
+-                                                      GTK_TYPE_ORIENTATION,
+-                                                      GTK_ORIENTATION_HORIZONTAL,
+-                                                      G_PARAM_READABLE));
++  container_class->add = egg_tray_icon_add;
+ 
++  g_object_class_install_property (gobject_class,
++				   PROP_ORIENTATION,
++				   g_param_spec_enum ("orientation",
++						      _("Orientation"),
++						      _("The orientation of the tray."),
++						      GTK_TYPE_ORIENTATION,
++						      GTK_ORIENTATION_HORIZONTAL,
++						      G_PARAM_READABLE));
+ }
+ 
+ static void
+ egg_tray_icon_get_property (GObject    *object,
+-                            guint       prop_id,
+-                            GValue     *value,
+-                            GParamSpec *pspec)
++			    guint       prop_id,
++			    GValue     *value,
++			    GParamSpec *pspec)
+ {
+   EggTrayIcon *icon = EGG_TRAY_ICON (object);
+ 
+@@ -101,26 +153,26 @@
+   Atom type;
+   int format;
+   union {
+-        gulong *prop;
+-        guchar *prop_ch;
++	gulong *prop;
++	guchar *prop_ch;
+   } prop = { NULL };
+   gulong nitems;
+   gulong bytes_after;
+   int error, result;
+ 
+   g_assert (icon->manager_window != None);
+-
++  
+   xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+ 
+   gdk_error_trap_push ();
+   type = None;
+   result = XGetWindowProperty (xdisplay,
+-                               icon->manager_window,
+-                               icon->orientation_atom,
+-                               0, G_MAXLONG, FALSE,
+-                               XA_CARDINAL,
+-                               &type, &format, &nitems,
+-                               &bytes_after, &(prop.prop_ch));
++			       icon->manager_window,
++			       icon->orientation_atom,
++			       0, G_MAXLONG, FALSE,
++			       XA_CARDINAL,
++			       &type, &format, &nitems,
++			       &bytes_after, &(prop.prop_ch));
+   error = gdk_error_trap_pop ();
+ 
+   if (error || result != Success)
+@@ -131,15 +183,15 @@
+       GtkOrientation orientation;
+ 
+       orientation = (prop.prop [0] == SYSTEM_TRAY_ORIENTATION_HORZ) ?
+-                                        GTK_ORIENTATION_HORIZONTAL :
+-                                        GTK_ORIENTATION_VERTICAL;
++					GTK_ORIENTATION_HORIZONTAL :
++					GTK_ORIENTATION_VERTICAL;
+ 
+       if (icon->orientation != orientation)
+-        {
+-          icon->orientation = orientation;
++	{
++	  icon->orientation = orientation;
+ 
+-          g_object_notify (G_OBJECT (icon), "orientation");
+-        }
++	  g_object_notify (G_OBJECT (icon), "orientation");
++	}
+     }
+ 
+   if (prop.prop)
+@@ -161,16 +213,16 @@
+   else if (xev->xany.window == icon->manager_window)
+     {
+       if (xev->xany.type == PropertyNotify &&
+-          xev->xproperty.atom == icon->orientation_atom)
+-        {
+-          egg_tray_icon_get_orientation_property (icon);
+-        }
++	  xev->xproperty.atom == icon->orientation_atom)
++	{
++	  egg_tray_icon_get_orientation_property (icon);
++	}
+       if (xev->xany.type == DestroyNotify)
+-        {
+-          egg_tray_icon_update_manager_window (icon);
+-        }
++	{
++	  egg_tray_icon_update_manager_window (icon);
++	}
+     }
+-
++  
+   return GDK_FILTER_CONTINUE;
+ }
+ 
+@@ -194,21 +246,21 @@
+ 
+   gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon);
+ 
+-  if (GTK_WIDGET_CLASS (egg_tray_icon_parent_class)->unrealize)
+-    (* GTK_WIDGET_CLASS (egg_tray_icon_parent_class)->unrealize) (widget);
++  if (GTK_WIDGET_CLASS (parent_class)->unrealize)
++    (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+ }
+ 
+ static void
+ egg_tray_icon_send_manager_message (EggTrayIcon *icon,
+-                                    long         message,
+-                                    Window       window,
+-                                    long         data1,
+-                                    long         data2,
+-                                    long         data3)
++				    long         message,
++				    Window       window,
++				    long         data1,
++				    long         data2,
++				    long         data3)
+ {
+   XClientMessageEvent ev;
+   Display *display;
+-
++  
+   ev.type = ClientMessage;
+   ev.window = window;
+   ev.message_type = icon->system_tray_opcode_atom;
+@@ -220,10 +272,10 @@
+   ev.data.l[4] = data3;
+ 
+   display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+-
++  
+   gdk_error_trap_push ();
+   XSendEvent (display,
+-              icon->manager_window, False, NoEventMask, (XEvent *)&ev);
++	      icon->manager_window, False, NoEventMask, (XEvent *)&ev);
+   XSync (display, False);
+   gdk_error_trap_pop ();
+ }
+@@ -232,48 +284,48 @@
+ egg_tray_icon_send_dock_request (EggTrayIcon *icon)
+ {
+   egg_tray_icon_send_manager_message (icon,
+-                                      SYSTEM_TRAY_REQUEST_DOCK,
+-                                      icon->manager_window,
+-                                      gtk_plug_get_id (GTK_PLUG (icon)),
+-                                      0, 0);
++				      SYSTEM_TRAY_REQUEST_DOCK,
++				      icon->manager_window,
++				      gtk_plug_get_id (GTK_PLUG (icon)),
++				      0, 0);
+ }
+ 
+ static void
+ egg_tray_icon_update_manager_window (EggTrayIcon *icon)
+ {
+   Display *xdisplay;
+-
++  
+   xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+-
++  
+   if (icon->manager_window != None)
+     {
+       GdkWindow *gdkwin;
+ 
+       gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),
+-                                              icon->manager_window);
+-
++					      icon->manager_window);
++      
+       gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon);
+     }
+-
++  
+   XGrabServer (xdisplay);
+-
++  
+   icon->manager_window = XGetSelectionOwner (xdisplay,
+-                                             icon->selection_atom);
++					     icon->selection_atom);
+ 
+   if (icon->manager_window != None)
+     XSelectInput (xdisplay,
+-                  icon->manager_window, StructureNotifyMask|PropertyChangeMask);
++		  icon->manager_window, StructureNotifyMask|PropertyChangeMask);
+ 
+   XUngrabServer (xdisplay);
+   XFlush (xdisplay);
+-
++  
+   if (icon->manager_window != None)
+     {
+       GdkWindow *gdkwin;
+ 
+       gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),
+-                                              icon->manager_window);
+-
++					      icon->manager_window);
++      
+       gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon);
+ 
+       /* Send a request that we'd like to dock */
+@@ -283,6 +335,36 @@
+     }
+ }
+ 
++static gboolean
++transparent_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
++{
++  gdk_window_clear_area (widget->window, event->area.x, event->area.y,
++			 event->area.width, event->area.height);
++  return FALSE;
++}
++
++static void
++make_transparent_again (GtkWidget *widget, GtkStyle *previous_style,
++			gpointer user_data)
++{
++  gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
++}
++
++static void
++make_transparent (GtkWidget *widget, gpointer user_data)
++{
++  if (GTK_WIDGET_NO_WINDOW (widget) || GTK_WIDGET_APP_PAINTABLE (widget))
++    return;
++
++  gtk_widget_set_app_paintable (widget, TRUE);
++  gtk_widget_set_double_buffered (widget, FALSE);
++  gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
++  g_signal_connect (widget, "expose_event",
++		    G_CALLBACK (transparent_expose_event), NULL);
++  g_signal_connect_after (widget, "style_set",
++			  G_CALLBACK (make_transparent_again), NULL);
++}	
++
+ static void
+ egg_tray_icon_realize (GtkWidget *widget)
+ {
+@@ -293,8 +375,10 @@
+   char buffer[256];
+   GdkWindow *root_window;
+ 
+-  if (GTK_WIDGET_CLASS (egg_tray_icon_parent_class)->realize)
+-    GTK_WIDGET_CLASS (egg_tray_icon_parent_class)->realize (widget);
++  if (GTK_WIDGET_CLASS (parent_class)->realize)
++    GTK_WIDGET_CLASS (parent_class)->realize (widget);
++
++  make_transparent (widget, NULL);
+ 
+   screen = gtk_widget_get_screen (widget);
+   display = gdk_screen_get_display (screen);
+@@ -302,28 +386,56 @@
+ 
+   /* Now see if there's a manager window around */
+   g_snprintf (buffer, sizeof (buffer),
+-              "_NET_SYSTEM_TRAY_S%d",
+-              gdk_screen_get_number (screen));
++	      "_NET_SYSTEM_TRAY_S%d",
++	      gdk_screen_get_number (screen));
+ 
+   icon->selection_atom = XInternAtom (xdisplay, buffer, False);
+-
++  
+   icon->manager_atom = XInternAtom (xdisplay, "MANAGER", False);
+-
++  
+   icon->system_tray_opcode_atom = XInternAtom (xdisplay,
+-                                               "_NET_SYSTEM_TRAY_OPCODE",
+-                                               False);
++						   "_NET_SYSTEM_TRAY_OPCODE",
++						   False);
+ 
+   icon->orientation_atom = XInternAtom (xdisplay,
+-                                        "_NET_SYSTEM_TRAY_ORIENTATION",
+-                                        False);
++					"_NET_SYSTEM_TRAY_ORIENTATION",
++					False);
+ 
+   egg_tray_icon_update_manager_window (icon);
+ 
+   root_window = gdk_screen_get_root_window (screen);
+-
++  
+   /* Add a root window filter so that we get changes on MANAGER */
+   gdk_window_add_filter (root_window,
+-                         egg_tray_icon_manager_filter, icon);
++			 egg_tray_icon_manager_filter, icon);
++}
++
++static void
++egg_tray_icon_add (GtkContainer *container, GtkWidget *widget)
++{
++  g_signal_connect (widget, "realize",
++		    G_CALLBACK (make_transparent), NULL);
++  GTK_CONTAINER_CLASS (parent_class)->add (container, widget);
++}
++
++EggTrayIcon *
++egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name)
++{
++  GdkDisplay *display;
++  GdkScreen *screen;
++
++  display = gdk_x11_lookup_xdisplay (DisplayOfScreen (xscreen));
++  screen = gdk_display_get_screen (display, XScreenNumberOfScreen (xscreen));
++
++  return egg_tray_icon_new_for_screen (screen, name);
++}
++
++EggTrayIcon *
++egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name)
++{
++  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
++
++  return g_object_new (EGG_TYPE_TRAY_ICON, "screen", screen, "title", name, NULL);
+ }
+ 
+ EggTrayIcon*
+@@ -332,6 +444,78 @@
+   return g_object_new (EGG_TYPE_TRAY_ICON, "title", name, NULL);
+ }
+ 
++guint
++egg_tray_icon_send_message (EggTrayIcon *icon,
++			    gint         timeout,
++			    const gchar *message,
++			    gint         len)
++{
++  guint stamp;
++  
++  g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0);
++  g_return_val_if_fail (timeout >= 0, 0);
++  g_return_val_if_fail (message != NULL, 0);
++		     
++  if (icon->manager_window == None)
++    return 0;
++
++  if (len < 0)
++    len = strlen (message);
++
++  stamp = icon->stamp++;
++  
++  /* Get ready to send the message */
++  egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE,
++				      (Window)gtk_plug_get_id (GTK_PLUG (icon)),
++				      timeout, len, stamp);
++
++  /* Now to send the actual message */
++  gdk_error_trap_push ();
++  while (len > 0)
++    {
++      XClientMessageEvent ev;
++      Display *xdisplay;
++
++      xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
++      
++      ev.type = ClientMessage;
++      ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon));
++      ev.format = 8;
++      ev.message_type = XInternAtom (xdisplay,
++				     "_NET_SYSTEM_TRAY_MESSAGE_DATA", False);
++      if (len > 20)
++	{
++	  memcpy (&ev.data, message, 20);
++	  len -= 20;
++	  message += 20;
++	}
++      else
++	{
++	  memcpy (&ev.data, message, len);
++	  len = 0;
++	}
++
++      XSendEvent (xdisplay,
++		  icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev);
++      XSync (xdisplay, False);
++    }
++  gdk_error_trap_pop ();
++
++  return stamp;
++}
++
++void
++egg_tray_icon_cancel_message (EggTrayIcon *icon,
++			      guint        id)
++{
++  g_return_if_fail (EGG_IS_TRAY_ICON (icon));
++  g_return_if_fail (id > 0);
++  
++  egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE,
++				      (Window)gtk_plug_get_id (GTK_PLUG (icon)),
++				      id, 0, 0);
++}
++
+ GtkOrientation
+ egg_tray_icon_get_orientation (EggTrayIcon *icon)
+ {
+@@ -339,4 +523,3 @@
+ 
+   return icon->orientation;
+ }
+-
+diff -Nur gdesklets-0.35.3/utils/eggtrayicon.h gdesklets-0.35.3.new/utils/eggtrayicon.h
+--- gdesklets-0.35.3/utils/eggtrayicon.h	2006-05-09 22:23:56.000000000 +0300
++++ gdesklets-0.35.3.new/utils/eggtrayicon.h	2006-05-09 22:29:35.000000000 +0300
+@@ -26,14 +26,14 @@
+ 
+ G_BEGIN_DECLS
+ 
+-#define EGG_TYPE_TRAY_ICON              (egg_tray_icon_get_type ())
+-#define EGG_TRAY_ICON(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon))
+-#define EGG_TRAY_ICON_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
+-#define EGG_IS_TRAY_ICON(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON))
+-#define EGG_IS_TRAY_ICON_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON))
+-#define EGG_TRAY_ICON_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
+-
+-typedef struct _EggTrayIcon       EggTrayIcon;
++#define EGG_TYPE_TRAY_ICON		(egg_tray_icon_get_type ())
++#define EGG_TRAY_ICON(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon))
++#define EGG_TRAY_ICON_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
++#define EGG_IS_TRAY_ICON(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON))
++#define EGG_IS_TRAY_ICON_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON))
++#define EGG_TRAY_ICON_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
++	
++typedef struct _EggTrayIcon	  EggTrayIcon;
+ typedef struct _EggTrayIconClass  EggTrayIconClass;
+ 
+ struct _EggTrayIcon
+@@ -41,7 +41,7 @@
+   GtkPlug parent_instance;
+ 
+   guint stamp;
+-
++  
+   Atom selection_atom;
+   Atom manager_atom;
+   Atom system_tray_opcode_atom;
+@@ -58,10 +58,20 @@
+ 
+ GType        egg_tray_icon_get_type       (void);
+ 
++EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen   *screen,
++					   const gchar *name);
++
+ EggTrayIcon *egg_tray_icon_new            (const gchar *name);
+ 
+-GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon);
++guint        egg_tray_icon_send_message   (EggTrayIcon *icon,
++					   gint         timeout,
++					   const char  *message,
++					   gint         len);
++void         egg_tray_icon_cancel_message (EggTrayIcon *icon,
++					   guint        id);
+ 
++GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon);
++					    
+ G_END_DECLS
+ 
+ #endif /* __EGG_TRAY_ICON_H__ */




More information about the pkg-gnome-commits mailing list