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