eggtrayicon.c File Reference

#include <string.h>
#include <gdk/gdkx.h>
#include "eggtrayicon.h"

Go to the source code of this file.

Defines

#define SYSTEM_TRAY_REQUEST_DOCK   0
#define SYSTEM_TRAY_BEGIN_MESSAGE   1
#define SYSTEM_TRAY_CANCEL_MESSAGE   2

Functions

GType egg_tray_icon_get_type (void)
EggTrayIconegg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name)
EggTrayIconegg_tray_icon_new (const gchar *name)
guint egg_tray_icon_send_message (EggTrayIcon *icon, gint timeout, const gchar *message, gint len)
void egg_tray_icon_cancel_message (EggTrayIcon *icon, guint id)


Define Documentation

#define SYSTEM_TRAY_BEGIN_MESSAGE   1

Definition at line 26 of file eggtrayicon.c.

Referenced by egg_tray_icon_send_message().

#define SYSTEM_TRAY_CANCEL_MESSAGE   2

Definition at line 27 of file eggtrayicon.c.

Referenced by egg_tray_icon_cancel_message().

#define SYSTEM_TRAY_REQUEST_DOCK   0

Definition at line 25 of file eggtrayicon.c.


Function Documentation

void egg_tray_icon_cancel_message ( EggTrayIcon icon,
guint  id 
)

Definition at line 332 of file eggtrayicon.c.

References EGG_IS_TRAY_ICON, and SYSTEM_TRAY_CANCEL_MESSAGE.

00334 {
00335   g_return_if_fail (EGG_IS_TRAY_ICON (icon));
00336   g_return_if_fail (id > 0);
00337   
00338   egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE,
00339                                       (Window)gtk_plug_get_id (GTK_PLUG (icon)),
00340                                       id, 0, 0);
00341 }

GType egg_tray_icon_get_type ( void   ) 

Definition at line 37 of file eggtrayicon.c.

00038 {
00039   static GType our_type = 0;
00040 
00041   if (our_type == 0)
00042     {
00043       static const GTypeInfo our_info =
00044       {
00045         sizeof (EggTrayIconClass),
00046         (GBaseInitFunc) NULL,
00047         (GBaseFinalizeFunc) NULL,
00048         (GClassInitFunc) egg_tray_icon_class_init,
00049         NULL, /* class_finalize */
00050         NULL, /* class_data */
00051         sizeof (EggTrayIcon),
00052         0,    /* n_preallocs */
00053         (GInstanceInitFunc) egg_tray_icon_init
00054       };
00055 
00056       our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0);
00057     }
00058 
00059   return our_type;
00060 }

EggTrayIcon* egg_tray_icon_new ( const gchar *  name  ) 

Definition at line 262 of file eggtrayicon.c.

References egg_tray_icon_new_for_xscreen().

Referenced by lkmonitor_create_tray_icon().

00263 {
00264   return egg_tray_icon_new_for_xscreen (DefaultScreenOfDisplay (gdk_display), name);
00265 }

EggTrayIcon* egg_tray_icon_new_for_xscreen ( Screen *  xscreen,
const char *  name 
)

Definition at line 199 of file eggtrayicon.c.

References EGG_TYPE_TRAY_ICON.

Referenced by egg_tray_icon_new().

00200 {
00201   EggTrayIcon *icon;
00202   char buffer[256];
00203   GdkWindow *root_window;
00204 
00205   g_return_val_if_fail (xscreen != NULL, NULL);
00206   
00207   icon = g_object_new (EGG_TYPE_TRAY_ICON, NULL);
00208   gtk_window_set_title (GTK_WINDOW (icon), name);
00209 
00210 #if HAVE_GTK_MULTIHEAD
00211   gtk_plug_construct_for_display (GTK_PLUG (icon),
00212                                   gdk_screen_get_display (screen), 0);
00213 #else
00214   gtk_plug_construct (GTK_PLUG (icon), 0);
00215 #endif
00216   
00217   gtk_widget_realize (GTK_WIDGET (icon));
00218 
00219   /* Now see if there's a manager window around */
00220   g_snprintf (buffer, sizeof (buffer),
00221               "_NET_SYSTEM_TRAY_S%d",
00222               XScreenNumberOfScreen (xscreen));
00223   
00224   icon->selection_atom = XInternAtom (DisplayOfScreen (xscreen),
00225                                       buffer, False);
00226   
00227   icon->manager_atom = XInternAtom (DisplayOfScreen (xscreen),
00228                                     "MANAGER", False);
00229   
00230   icon->system_tray_opcode_atom = XInternAtom (DisplayOfScreen (xscreen),
00231                                                "_NET_SYSTEM_TRAY_OPCODE", False);
00232 
00233   egg_tray_icon_update_manager_window (icon);
00234 
00235 #if HAVE_GTK_MULTIHEAD
00236   root_window = gdk_screen_get_root_window (screen);
00237 #else
00238   root_window = gdk_window_lookup (gdk_x11_get_default_root_xwindow ());
00239 #endif
00240   
00241   /* Add a root window filter so that we get changes on MANAGER */
00242   gdk_window_add_filter (root_window,
00243                          egg_tray_icon_manager_filter, icon);
00244                       
00245   return icon;
00246 }

guint egg_tray_icon_send_message ( EggTrayIcon icon,
gint  timeout,
const gchar *  message,
gint  len 
)

Definition at line 268 of file eggtrayicon.c.

References EGG_IS_TRAY_ICON, and SYSTEM_TRAY_BEGIN_MESSAGE.

00272 {
00273   guint stamp;
00274   
00275   g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0);
00276   g_return_val_if_fail (timeout >= 0, 0);
00277   g_return_val_if_fail (message != NULL, 0);
00278                      
00279   if (icon->manager_window == None)
00280     return 0;
00281 
00282   if (len < 0)
00283     len = strlen (message);
00284 
00285   stamp = icon->stamp++;
00286   
00287   /* Get ready to send the message */
00288   egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE,
00289                                       (Window)gtk_plug_get_id (GTK_PLUG (icon)),
00290                                       timeout, len, stamp);
00291 
00292   /* Now to send the actual message */
00293   gdk_error_trap_push ();
00294   while (len > 0)
00295     {
00296       XClientMessageEvent ev;
00297       Display *xdisplay;
00298 
00299 #if HAVE_GTK_MULTIHEAD
00300       xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
00301 #else
00302       xdisplay = gdk_display;
00303 #endif
00304       
00305       ev.type = ClientMessage;
00306       ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon));
00307       ev.format = 8;
00308       ev.message_type = XInternAtom (xdisplay,
00309                                      "_NET_SYSTEM_TRAY_MESSAGE_DATA", False);
00310       if (len > 20)
00311         {
00312           memcpy (&ev.data, message, 20);
00313           len -= 20;
00314           message += 20;
00315         }
00316       else
00317         {
00318           memcpy (&ev.data, message, len);
00319           len = 0;
00320         }
00321 
00322       XSendEvent (xdisplay,
00323                   icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev);
00324       XSync (xdisplay, False);
00325     }
00326   gdk_error_trap_pop ();
00327 
00328   return stamp;
00329 }


Generated on Sat Dec 2 11:27:52 2006 for lkmonitor by  doxygen 1.5.1