#include #include #include G_BEGIN_DECLS #define GTK_TYPE_TRAY_ICON (gtk_tray_icon_get_type ()) #define GTK_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TRAY_ICON, MyTrayIcon)) typedef struct _MyTrayIcon MyTrayIcon; typedef struct _MyTrayIconPrivate MyTrayIconPrivate; typedef struct _MyTrayIconClass MyTrayIconClass; struct _MyTrayIcon { GtkWindow parent_instance; MyTrayIconPrivate *priv; }; struct _MyTrayIconClass { GtkWindowClass parent_class; }; G_END_DECLS G_DEFINE_TYPE (MyTrayIcon, gtk_tray_icon, GTK_TYPE_WINDOW) static gboolean gtk_tray_icon_draw (GtkWidget *widget, cairo_t *cr) { gboolean retval = FALSE; /* Clear to transparent */ cairo_set_source_rgba (cr, 0, 0, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); if (GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->draw) retval = GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->draw (widget, cr); return retval; } static void gtk_tray_icon_class_init (MyTrayIconClass *class) { GtkWidgetClass *widget_class = (GtkWidgetClass *)class; widget_class->draw = gtk_tray_icon_draw; } static void gtk_tray_icon_init (MyTrayIcon *icon) { gtk_widget_set_app_paintable (GTK_WIDGET (icon), TRUE); } static gboolean timeout_cb(GtkWidget *window) { gtk_widget_set_size_request(window, 100, 100); return FALSE; } int main(void) { gtk_init(NULL, NULL); GtkWidget *image = gtk_image_new_from_stock(GTK_STOCK_OK, GTK_ICON_SIZE_LARGE_TOOLBAR); GtkWidget *tray = g_object_new (GTK_TYPE_TRAY_ICON, NULL); gtk_container_add(GTK_CONTAINER(tray), image); gtk_widget_show_all(tray); g_timeout_add(2000, timeout_cb, tray); gtk_main(); return 0; }