plugins/docklet/eggtrayicon.c

changeset 14231
bdae40bccd7f
parent 12600
7ecd4441fdc7
equal deleted inserted replaced
14230:82177a4e23ab 14231:bdae40bccd7f
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)

mercurial