#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) |
EggTrayIcon * | egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name) |
EggTrayIcon * | egg_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 SYSTEM_TRAY_BEGIN_MESSAGE 1 |
#define SYSTEM_TRAY_CANCEL_MESSAGE 2 |
#define SYSTEM_TRAY_REQUEST_DOCK 0 |
Definition at line 25 of file eggtrayicon.c.
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 }