--- gnome-bluetooth-0.7.0/libegg/libegg/tray/eggtrayicon.c.transparency 2006-05-15 14:12:44.000000000 +0200 +++ gnome-bluetooth-0.7.0/libegg/libegg/tray/eggtrayicon.c 2006-05-15 14:16:36.000000000 +0200 @@ -24,8 +24,13 @@ #include "eggtrayicon.h" +#include <gdkconfig.h> +#if defined (GDK_WINDOWING_X11) #include <gdk/gdkx.h> #include <X11/Xatom.h> +#elif defined (GDK_WINDOWING_WIN32) +#include <gdk/gdkwin32.h> +#endif #ifndef EGG_COMPILATION #ifndef _ @@ -62,7 +67,14 @@ 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); + +#ifdef GDK_WINDOWING_X11 +static void egg_tray_icon_update_manager_window (EggTrayIcon *icon, + gboolean dock_if_realized); +static void egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon); +#endif GType egg_tray_icon_get_type (void) @@ -104,6 +116,7 @@ { GObjectClass *gobject_class = (GObjectClass *)klass; GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; + GtkContainerClass *container_class = (GtkContainerClass *)klass; parent_class = g_type_class_peek_parent (klass); @@ -112,6 +125,8 @@ widget_class->realize = egg_tray_icon_realize; widget_class->unrealize = egg_tray_icon_unrealize; + container_class->add = egg_tray_icon_add; + g_object_class_install_property (gobject_class, PROP_ORIENTATION, g_param_spec_enum ("orientation", @@ -120,6 +135,14 @@ GTK_TYPE_ORIENTATION, GTK_ORIENTATION_HORIZONTAL, G_PARAM_READABLE)); + +#if defined (GDK_WINDOWING_X11) + /* Nothing */ +#elif defined (GDK_WINDOWING_WIN32) + g_warning ("Port eggtrayicon to Win32"); +#else + g_warning ("Port eggtrayicon to this GTK+ backend"); +#endif } static void @@ -141,6 +164,8 @@ } } +#ifdef GDK_WINDOWING_X11 + static void egg_tray_icon_get_orientation_property (EggTrayIcon *icon) { @@ -203,7 +228,7 @@ xev->xclient.message_type == icon->manager_atom && xev->xclient.data.l[1] == icon->selection_atom) { - egg_tray_icon_update_manager_window (icon); + egg_tray_icon_update_manager_window (icon, TRUE); } else if (xev->xany.window == icon->manager_window) { @@ -214,16 +239,18 @@ } if (xev->xany.type == DestroyNotify) { - egg_tray_icon_update_manager_window (icon); + egg_tray_icon_manager_window_destroyed (icon); } } - return GDK_FILTER_CONTINUE; } +#endif + static void egg_tray_icon_unrealize (GtkWidget *widget) { +#ifdef GDK_WINDOWING_X11 EggTrayIcon *icon = EGG_TRAY_ICON (widget); GdkWindow *root_window; @@ -243,8 +270,11 @@ if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); +#endif } +#ifdef GDK_WINDOWING_X11 + static void egg_tray_icon_send_manager_message (EggTrayIcon *icon, long message, @@ -286,21 +316,15 @@ } static void -egg_tray_icon_update_manager_window (EggTrayIcon *icon) +egg_tray_icon_update_manager_window (EggTrayIcon *icon, + gboolean dock_if_realized) { Display *xdisplay; - xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); - if (icon->manager_window != None) - { - GdkWindow *gdkwin; + return; - gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), - icon->manager_window); - - gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); - } + xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); XGrabServer (xdisplay); @@ -323,16 +347,66 @@ gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon); - /* Send a request that we'd like to dock */ - egg_tray_icon_send_dock_request (icon); + if (dock_if_realized && GTK_WIDGET_REALIZED (icon)) + egg_tray_icon_send_dock_request (icon); egg_tray_icon_get_orientation_property (icon); } } static void +egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon) +{ + GdkWindow *gdkwin; + + g_return_if_fail (icon->manager_window != None); + + gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), + icon->manager_window); + + gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); + + icon->manager_window = None; + + egg_tray_icon_update_manager_window (icon, TRUE); +} + +#endif + +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) { +#ifdef GDK_WINDOWING_X11 EggTrayIcon *icon = EGG_TRAY_ICON (widget); GdkScreen *screen; GdkDisplay *display; @@ -343,6 +417,8 @@ 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); xdisplay = gdk_x11_display_get_xdisplay (display); @@ -364,25 +440,23 @@ "_NET_SYSTEM_TRAY_ORIENTATION", False); - egg_tray_icon_update_manager_window (icon); + egg_tray_icon_update_manager_window (icon, FALSE); + egg_tray_icon_send_dock_request (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); +#endif } -EggTrayIcon * -egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name) +static void +egg_tray_icon_add (GtkContainer *container, GtkWidget *widget) { - 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); + g_signal_connect (widget, "realize", + G_CALLBACK (make_transparent), NULL); + GTK_CONTAINER_CLASS (parent_class)->add (container, widget); } EggTrayIcon * @@ -411,14 +485,17 @@ g_return_val_if_fail (timeout >= 0, 0); g_return_val_if_fail (message != NULL, 0); +#ifdef GDK_WINDOWING_X11 if (icon->manager_window == None) return 0; +#endif if (len < 0) len = strlen (message); stamp = icon->stamp++; +#ifdef GDK_WINDOWING_X11 /* 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)), @@ -455,6 +532,7 @@ XSync (xdisplay, False); } gdk_error_trap_pop (); +#endif return stamp; } @@ -465,10 +543,11 @@ { g_return_if_fail (EGG_IS_TRAY_ICON (icon)); g_return_if_fail (id > 0); - +#ifdef GDK_WINDOWING_X11 egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE, (Window)gtk_plug_get_id (GTK_PLUG (icon)), id, 0, 0); +#endif } GtkOrientation --- gnome-bluetooth-0.7.0/libegg/libegg/tray/eggtrayicon.h.transparency 2006-05-15 14:16:57.000000000 +0200 +++ gnome-bluetooth-0.7.0/libegg/libegg/tray/eggtrayicon.h 2006-05-15 14:17:02.000000000 +0200 @@ -22,7 +22,9 @@ #define __EGG_TRAY_ICON_H__ #include <gtk/gtkplug.h> +#ifdef GDK_WINDOWING_X11 #include <gdk/gdkx.h> +#endif G_BEGIN_DECLS @@ -42,12 +44,13 @@ guint stamp; +#ifdef GDK_WINDOWING_X11 Atom selection_atom; Atom manager_atom; Atom system_tray_opcode_atom; Atom orientation_atom; Window manager_window; - +#endif GtkOrientation orientation; };