From 4fcf804bda68c31e4fd64f8b06fb061d4a076442 Mon Sep 17 00:00:00 2001 From: Robert Love Date: Fri, 24 Feb 2006 16:48:35 +0000 Subject: [PATCH] 2006-02-24 Robert Love Patch from Dan Winship : * gnome/applet/eggtrayicon.c: Update EggTrayIcon code. Set the gdk area to transparent. git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1488 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 6 +++++ gnome/applet/eggtrayicon.c | 46 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/ChangeLog b/ChangeLog index ad7fdd45a3..3e2e7a371c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-02-24 Robert Love + + Patch from Dan Winship : + * gnome/applet/eggtrayicon.c: Update EggTrayIcon code. Set the gdk + area to transparent. + 2006-02-21 Dan Williams * gnome/applet/applet.[ch] diff --git a/gnome/applet/eggtrayicon.c b/gnome/applet/eggtrayicon.c index c52fa0722f..1d4427fb76 100644 --- a/gnome/applet/eggtrayicon.c +++ b/gnome/applet/eggtrayicon.c @@ -67,6 +67,9 @@ static void egg_tray_icon_get_property (GObject *object, static void egg_tray_icon_realize (GtkWidget *widget); static void egg_tray_icon_unrealize (GtkWidget *widget); +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); @@ -114,6 +117,7 @@ egg_tray_icon_class_init (EggTrayIconClass *klass) { GObjectClass *gobject_class = (GObjectClass *)klass; GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; + GtkContainerClass *container_class = (GtkContainerClass *)klass; parent_class = g_type_class_peek_parent (klass); @@ -122,6 +126,8 @@ egg_tray_icon_class_init (EggTrayIconClass *klass) 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", @@ -368,6 +374,36 @@ egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon) #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) { @@ -382,6 +418,8 @@ egg_tray_icon_realize (GtkWidget *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); xdisplay = gdk_x11_display_get_xdisplay (display); @@ -414,6 +452,14 @@ egg_tray_icon_realize (GtkWidget *widget) #endif } +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_screen (GdkScreen *screen, const char *name) {