freebsd-ports/sysutils/gapcmon/files/patch-src:eggtrayicon.c
Martin Wilke 3a55b21964 - Update to 0.8.4
PR:		ports/107402
Submitted by:	Jason E. Hale <bsdkaffee@gmail.com> (maintainer)
2007-01-03 15:05:59 +00:00

90 lines
2.9 KiB
C

--- src/eggtrayicon.c.orig Fri May 12 10:54:17 2006
+++ src/eggtrayicon.c Mon Jan 1 12:46:03 2007
@@ -61,6 +61,9 @@
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);
+
static void egg_tray_icon_update_manager_window(EggTrayIcon * icon,
gboolean dock_if_realized);
static void egg_tray_icon_manager_window_destroyed(EggTrayIcon * icon);
@@ -101,6 +104,7 @@
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
+ GtkContainerClass *container_class = (GtkContainerClass *)klass;
parent_class = g_type_class_peek_parent(klass);
@@ -109,6 +113,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",
@@ -298,6 +304,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_manager_window_destroyed(EggTrayIcon * icon)
{
GdkWindow *gdkwin;
@@ -327,6 +363,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);
@@ -352,6 +390,14 @@
/* Add a root window filter so that we get changes on MANAGER */
gdk_window_add_filter(root_window, 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_screen(GdkScreen * screen, const char *name)