| 52 GParamSpec *pspec); |
52 GParamSpec *pspec); |
| 53 |
53 |
| 54 static void egg_tray_icon_realize (GtkWidget *widget); |
54 static void egg_tray_icon_realize (GtkWidget *widget); |
| 55 static void egg_tray_icon_unrealize (GtkWidget *widget); |
55 static void egg_tray_icon_unrealize (GtkWidget *widget); |
| 56 |
56 |
| |
57 static void egg_tray_icon_add (GtkContainer *container, |
| |
58 GtkWidget *widget); |
| |
59 |
| 57 static void egg_tray_icon_update_manager_window (EggTrayIcon *icon, |
60 static void egg_tray_icon_update_manager_window (EggTrayIcon *icon, |
| 58 gboolean dock_if_realized); |
61 gboolean dock_if_realized); |
| 59 static void egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon); |
62 static void egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon); |
| 60 |
63 |
| 61 GType |
64 GType |
| 107 static void |
110 static void |
| 108 egg_tray_icon_class_init (EggTrayIconClass *klass) |
111 egg_tray_icon_class_init (EggTrayIconClass *klass) |
| 109 { |
112 { |
| 110 GObjectClass *gobject_class = (GObjectClass *)klass; |
113 GObjectClass *gobject_class = (GObjectClass *)klass; |
| 111 GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; |
114 GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; |
| |
115 GtkContainerClass *container_class = (GtkContainerClass *)klass; |
| 112 |
116 |
| 113 parent_class = g_type_class_peek_parent (klass); |
117 parent_class = g_type_class_peek_parent (klass); |
| 114 |
118 |
| 115 gobject_class->get_property = egg_tray_icon_get_property; |
119 gobject_class->get_property = egg_tray_icon_get_property; |
| 116 |
120 |
| 117 widget_class->realize = egg_tray_icon_realize; |
121 widget_class->realize = egg_tray_icon_realize; |
| 118 widget_class->unrealize = egg_tray_icon_unrealize; |
122 widget_class->unrealize = egg_tray_icon_unrealize; |
| |
123 |
| |
124 container_class->add = egg_tray_icon_add; |
| 119 |
125 |
| 120 g_object_class_install_property (gobject_class, |
126 g_object_class_install_property (gobject_class, |
| 121 PROP_ORIENTATION, |
127 PROP_ORIENTATION, |
| 122 g_param_spec_enum ("orientation", |
128 g_param_spec_enum ("orientation", |
| 123 _("Orientation"), |
129 _("Orientation"), |
| 372 icon->manager_window = None; |
378 icon->manager_window = None; |
| 373 |
379 |
| 374 egg_tray_icon_update_manager_window (icon, TRUE); |
380 egg_tray_icon_update_manager_window (icon, TRUE); |
| 375 } |
381 } |
| 376 |
382 |
| |
383 static gboolean |
| |
384 transparent_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) |
| |
385 { |
| |
386 gdk_window_clear_area (widget->window, event->area.x, event->area.y, |
| |
387 event->area.width, event->area.height); |
| |
388 return FALSE; |
| |
389 } |
| |
390 |
| |
391 static void |
| |
392 make_transparent_again (GtkWidget *widget, GtkStyle *previous_style, |
| |
393 gpointer user_data) |
| |
394 { |
| |
395 gdk_window_set_back_pixmap(widget->window, NULL, TRUE); |
| |
396 } |
| |
397 |
| |
398 static void |
| |
399 make_transparent (GtkWidget *widget, gpointer user_data) |
| |
400 { |
| |
401 if (GTK_WIDGET_NO_WINDOW (widget) || GTK_WIDGET_APP_PAINTABLE (widget)) |
| |
402 return; |
| |
403 |
| |
404 gtk_widget_set_app_paintable (widget, TRUE); |
| |
405 gtk_widget_set_double_buffered (widget, FALSE); |
| |
406 gdk_window_set_back_pixmap (widget->window, NULL, TRUE); |
| |
407 g_signal_connect (widget, "expose_event", |
| |
408 G_CALLBACK (transparent_expose_event), NULL); |
| |
409 g_signal_connect_after (widget, "style_set", |
| |
410 G_CALLBACK (make_transparent_again), NULL); |
| |
411 } |
| |
412 |
| 377 static void |
413 static void |
| 378 egg_tray_icon_realize (GtkWidget *widget) |
414 egg_tray_icon_realize (GtkWidget *widget) |
| 379 { |
415 { |
| 380 EggTrayIcon *icon = EGG_TRAY_ICON (widget); |
416 EggTrayIcon *icon = EGG_TRAY_ICON (widget); |
| 381 gint screen; |
417 gint screen; |
| 384 GdkWindow *root_window; |
420 GdkWindow *root_window; |
| 385 |
421 |
| 386 if (GTK_WIDGET_CLASS (parent_class)->realize) |
422 if (GTK_WIDGET_CLASS (parent_class)->realize) |
| 387 GTK_WIDGET_CLASS (parent_class)->realize (widget); |
423 GTK_WIDGET_CLASS (parent_class)->realize (widget); |
| 388 |
424 |
| |
425 make_transparent (widget, NULL); |
| |
426 |
| 389 #if GTK_CHECK_VERSION(2,1,0) |
427 #if GTK_CHECK_VERSION(2,1,0) |
| 390 screen = gdk_screen_get_number (gtk_widget_get_screen (widget)); |
428 screen = gdk_screen_get_number (gtk_widget_get_screen (widget)); |
| 391 xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (widget)); |
429 xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (widget)); |
| 392 #else |
430 #else |
| 393 screen = XScreenNumberOfScreen (DefaultScreenOfDisplay (gdk_display)); |
431 screen = XScreenNumberOfScreen (DefaultScreenOfDisplay (gdk_display)); |
| 421 #endif |
459 #endif |
| 422 |
460 |
| 423 /* Add a root window filter so that we get changes on MANAGER */ |
461 /* Add a root window filter so that we get changes on MANAGER */ |
| 424 gdk_window_add_filter (root_window, |
462 gdk_window_add_filter (root_window, |
| 425 egg_tray_icon_manager_filter, icon); |
463 egg_tray_icon_manager_filter, icon); |
| |
464 } |
| |
465 |
| |
466 static void |
| |
467 egg_tray_icon_add (GtkContainer *container, GtkWidget *widget) |
| |
468 { |
| |
469 g_signal_connect (widget, "realize", |
| |
470 G_CALLBACK (make_transparent), NULL); |
| |
471 GTK_CONTAINER_CLASS (parent_class)->add (container, widget); |
| 426 } |
472 } |
| 427 |
473 |
| 428 #if GTK_CHECK_VERSION(2,1,0) |
474 #if GTK_CHECK_VERSION(2,1,0) |
| 429 EggTrayIcon * |
475 EggTrayIcon * |
| 430 egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name) |
476 egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name) |