Changeset 6333
- Timestamp:
- 05/16/06 10:51:48 (3 years ago)
- Location:
- trunk/src
- Files:
-
- 2 modified
-
eggtrayicon.c (modified) (27 diffs)
-
eggtrayicon.h (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/eggtrayicon.c
r1063 r6333 1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */2 1 /* eggtrayicon.c 3 2 * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org> … … 19 18 */ 20 19 21 //#include <config.h>22 20 #include <string.h> 21 #include <glib/gi18n.h> 23 22 #include <libintl.h> 24 23 25 24 #include "eggtrayicon.h" 26 25 26 #include <gdkconfig.h> 27 #if defined (GDK_WINDOWING_X11) 27 28 #include <gdk/gdkx.h> 28 29 #include <X11/Xatom.h> 29 30 /*#ifndef EGG_COMPILATION 30 #elif defined (GDK_WINDOWING_WIN32) 31 #include <gdk/gdkwin32.h> 32 #endif 33 34 #ifndef EGG_COMPILATION 31 35 #ifndef _ 32 #define _(x) dgettext ( 'gajim', x)36 #define _(x) dgettext (GETTEXT_PACKAGE, x) 33 37 #define N_(x) x 34 38 #endif … … 37 41 #define N_(x) x 38 42 #endif 39 */ 43 40 44 #define SYSTEM_TRAY_REQUEST_DOCK 0 41 45 #define SYSTEM_TRAY_BEGIN_MESSAGE 1 … … 49 53 PROP_ORIENTATION 50 54 }; 51 55 52 56 static GtkPlugClass *parent_class = NULL; 53 57 … … 60 64 GParamSpec *pspec); 61 65 66 static void egg_tray_icon_add (GtkContainer *container, GtkWidget *widget); 67 62 68 static void egg_tray_icon_realize (GtkWidget *widget); 63 69 static void egg_tray_icon_unrealize (GtkWidget *widget); 64 70 65 static void egg_tray_icon_update_manager_window (EggTrayIcon *icon); 71 #ifdef GDK_WINDOWING_X11 72 static void egg_tray_icon_update_manager_window (EggTrayIcon *icon, 73 gboolean dock_if_realized); 74 static void egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon); 75 #endif 66 76 67 77 GType … … 96 106 icon->stamp = 1; 97 107 icon->orientation = GTK_ORIENTATION_HORIZONTAL; 98 108 99 109 gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK); 100 110 } … … 105 115 GObjectClass *gobject_class = (GObjectClass *)klass; 106 116 GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; 117 GtkContainerClass *container_class = (GtkContainerClass *)klass; 107 118 108 119 parent_class = g_type_class_peek_parent (klass); … … 112 123 widget_class->realize = egg_tray_icon_realize; 113 124 widget_class->unrealize = egg_tray_icon_unrealize; 125 126 container_class->add = egg_tray_icon_add; 114 127 115 128 g_object_class_install_property (gobject_class, 116 129 PROP_ORIENTATION, 117 130 g_param_spec_enum ("orientation", 118 "Orientation", 119 "The orientation of the tray.", 120 // _("Orientation"), 121 // _("The orientation of the tray."), 131 _("Orientation"), 132 _("The orientation of the tray."), 122 133 GTK_TYPE_ORIENTATION, 123 134 GTK_ORIENTATION_HORIZONTAL, 124 135 G_PARAM_READABLE)); 136 137 #if defined (GDK_WINDOWING_X11) 138 /* Nothing */ 139 #elif defined (GDK_WINDOWING_WIN32) 140 g_warning ("Port eggtrayicon to Win32"); 141 #else 142 g_warning ("Port eggtrayicon to this GTK+ backend"); 143 #endif 125 144 } 126 145 … … 143 162 } 144 163 } 164 165 #ifdef GDK_WINDOWING_X11 145 166 146 167 static void … … 159 180 160 181 g_assert (icon->manager_window != None); 161 182 162 183 xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); 163 184 … … 206 227 xev->xclient.data.l[1] == icon->selection_atom) 207 228 { 208 egg_tray_icon_update_manager_window (icon );229 egg_tray_icon_update_manager_window (icon, TRUE); 209 230 } 210 231 else if (xev->xany.window == icon->manager_window) … … 217 238 if (xev->xany.type == DestroyNotify) 218 239 { 219 egg_tray_icon_ update_manager_window(icon);240 egg_tray_icon_manager_window_destroyed (icon); 220 241 } 221 242 } 222 223 243 return GDK_FILTER_CONTINUE; 224 244 } 225 245 246 #endif 247 226 248 static void 227 249 egg_tray_icon_unrealize (GtkWidget *widget) 228 250 { 251 #ifdef GDK_WINDOWING_X11 229 252 EggTrayIcon *icon = EGG_TRAY_ICON (widget); 230 253 GdkWindow *root_window; … … 246 269 if (GTK_WIDGET_CLASS (parent_class)->unrealize) 247 270 (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); 248 } 271 #endif 272 } 273 274 #ifdef GDK_WINDOWING_X11 249 275 250 276 static void … … 258 284 XClientMessageEvent ev; 259 285 Display *display; 260 286 261 287 ev.type = ClientMessage; 262 288 ev.window = window; … … 270 296 271 297 display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); 272 298 273 299 gdk_error_trap_push (); 274 300 XSendEvent (display, … … 289 315 290 316 static void 291 egg_tray_icon_update_manager_window (EggTrayIcon *icon) 317 egg_tray_icon_update_manager_window (EggTrayIcon *icon, 318 gboolean dock_if_realized) 292 319 { 293 320 Display *xdisplay; 294 321 322 if (icon->manager_window != None) 323 return; 324 295 325 xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); 296 297 if (icon->manager_window != None) 298 { 299 GdkWindow *gdkwin; 300 301 gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), 302 icon->manager_window); 303 304 gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); 305 } 306 326 307 327 XGrabServer (xdisplay); 308 328 309 329 icon->manager_window = XGetSelectionOwner (xdisplay, 310 330 icon->selection_atom); … … 316 336 XUngrabServer (xdisplay); 317 337 XFlush (xdisplay); 318 338 319 339 if (icon->manager_window != None) 320 340 { … … 323 343 gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), 324 344 icon->manager_window); 325 345 326 346 gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon); 327 347 328 /* Send a request that we'd like to dock */329 egg_tray_icon_send_dock_request (icon);348 if (dock_if_realized && GTK_WIDGET_REALIZED (icon)) 349 egg_tray_icon_send_dock_request (icon); 330 350 331 351 egg_tray_icon_get_orientation_property (icon); … … 333 353 } 334 354 355 static gboolean 356 transparent_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) 357 { 358 gdk_window_clear_area (widget->window, event->area.x, event->area.y, 359 event->area.width, event->area.height); 360 return FALSE; 361 } 362 363 static void 364 make_transparent_again (GtkWidget *widget, GtkStyle *previous_style, 365 gpointer user_data) 366 { 367 gdk_window_set_back_pixmap (widget->window, NULL, TRUE); 368 } 369 370 static void 371 make_transparent (GtkWidget *widget, gpointer user_data) 372 { 373 if (GTK_WIDGET_NO_WINDOW (widget) || GTK_WIDGET_APP_PAINTABLE (widget)) 374 return; 375 376 gtk_widget_set_app_paintable (widget, TRUE); 377 gtk_widget_set_double_buffered (widget, FALSE); 378 gdk_window_set_back_pixmap (widget->window, NULL, TRUE); 379 g_signal_connect (widget, "expose_event", 380 G_CALLBACK (transparent_expose_event), NULL); 381 g_signal_connect_after (widget, "style_set", 382 G_CALLBACK (make_transparent_again), NULL); 383 } 384 385 static void 386 egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon) 387 { 388 GdkWindow *gdkwin; 389 390 g_return_if_fail (icon->manager_window != None); 391 392 gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), 393 icon->manager_window); 394 395 gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); 396 397 icon->manager_window = None; 398 399 egg_tray_icon_update_manager_window (icon, TRUE); 400 } 401 402 #endif 403 335 404 static void 336 405 egg_tray_icon_realize (GtkWidget *widget) 337 406 { 407 #ifdef GDK_WINDOWING_X11 338 408 EggTrayIcon *icon = EGG_TRAY_ICON (widget); 339 409 GdkScreen *screen; … … 346 416 GTK_WIDGET_CLASS (parent_class)->realize (widget); 347 417 418 make_transparent (widget, NULL); 419 348 420 screen = gtk_widget_get_screen (widget); 349 421 display = gdk_screen_get_display (screen); … … 356 428 357 429 icon->selection_atom = XInternAtom (xdisplay, buffer, False); 358 430 359 431 icon->manager_atom = XInternAtom (xdisplay, "MANAGER", False); 360 432 361 433 icon->system_tray_opcode_atom = XInternAtom (xdisplay, 362 434 "_NET_SYSTEM_TRAY_OPCODE", … … 367 439 False); 368 440 369 egg_tray_icon_update_manager_window (icon); 441 egg_tray_icon_update_manager_window (icon, FALSE); 442 egg_tray_icon_send_dock_request (icon); 370 443 371 444 root_window = gdk_screen_get_root_window (screen); 372 445 373 446 /* Add a root window filter so that we get changes on MANAGER */ 374 447 gdk_window_add_filter (root_window, 375 448 egg_tray_icon_manager_filter, icon); 449 #endif 450 } 451 452 static void 453 egg_tray_icon_add (GtkContainer *container, GtkWidget *widget) 454 { 455 g_signal_connect (widget, "realize", 456 G_CALLBACK (make_transparent), NULL); 457 GTK_CONTAINER_CLASS (parent_class)->add (container, widget); 376 458 } 377 459 … … 397 479 { 398 480 guint stamp; 399 481 400 482 g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0); 401 483 g_return_val_if_fail (timeout >= 0, 0); 402 484 g_return_val_if_fail (message != NULL, 0); 403 485 486 #ifdef GDK_WINDOWING_X11 404 487 if (icon->manager_window == None) 405 488 return 0; 489 #endif 406 490 407 491 if (len < 0) … … 409 493 410 494 stamp = icon->stamp++; 411 495 496 #ifdef GDK_WINDOWING_X11 412 497 /* Get ready to send the message */ 413 498 egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE, … … 423 508 424 509 xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); 425 510 426 511 ev.type = ClientMessage; 427 512 ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon)); … … 446 531 } 447 532 gdk_error_trap_pop (); 533 #endif 448 534 449 535 return stamp; … … 456 542 g_return_if_fail (EGG_IS_TRAY_ICON (icon)); 457 543 g_return_if_fail (id > 0); 458 544 #ifdef GDK_WINDOWING_X11 459 545 egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE, 460 546 (Window)gtk_plug_get_id (GTK_PLUG (icon)), 461 547 id, 0, 0); 548 #endif 462 549 } 463 550 -
trunk/src/eggtrayicon.h
r1063 r6333 23 23 24 24 #include <gtk/gtkplug.h> 25 #ifdef GDK_WINDOWING_X11 25 26 #include <gdk/gdkx.h> 27 #endif 26 28 27 29 G_BEGIN_DECLS … … 33 35 #define EGG_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON)) 34 36 #define EGG_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) 35 37 36 38 typedef struct _EggTrayIcon EggTrayIcon; 37 39 typedef struct _EggTrayIconClass EggTrayIconClass; … … 42 44 43 45 guint stamp; 44 46 47 #ifdef GDK_WINDOWING_X11 45 48 Atom selection_atom; 46 49 Atom manager_atom; … … 48 51 Atom orientation_atom; 49 52 Window manager_window; 50 53 #endif 51 54 GtkOrientation orientation; 52 55 }; … … 72 75 73 76 GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon); 74 77 75 78 G_END_DECLS 76 79
