static void na_tray_manager_handle_cancel_message (NaTrayManager *manager, XClientMessageEvent *xevent) { GList *p; GtkSocket *socket; /* Check if the message is in the queue and remove it if so */ for (p = manager->messages; p; p = p->next) { PendingMessage *msg = p->data; if (xevent->window == msg->window && xevent->data.l[4] == msg->id) { pending_message_free (msg); manager->messages = g_list_remove_link (manager->messages, p); g_list_free_1 (p); break; } } socket = g_hash_table_lookup (manager->socket_table, GINT_TO_POINTER (xevent->window)); if (socket) { g_signal_emit (manager, manager_signals[MESSAGE_CANCELLED], 0, socket, xevent->data.l[2]); } }
static void egg_tray_manager_handle_begin_message (EggTrayManager *manager, XClientMessageEvent *xevent) { GList *p; PendingMessage *msg; /* Check if the same message is * already in the queue and remove it if so */ for (p = manager->messages; p; p = p->next) { PendingMessage *msg = p->data; if (xevent->window == msg->window && xevent->data.l[4] == msg->id) { /* Hmm, we found it, now remove it */ pending_message_free (msg); manager->messages = g_list_remove_link (manager->messages, p); break; } } /* Now add the new message to the queue */ msg = g_new0 (PendingMessage, 1); msg->window = xevent->window; msg->timeout = xevent->data.l[2]; msg->len = xevent->data.l[3]; msg->id = xevent->data.l[4]; msg->remaining_len = msg->len; msg->str = g_malloc (msg->len + 1); msg->str[msg->len] = '\0'; manager->messages = g_list_prepend (manager->messages, msg); }
static void na_tray_manager_handle_begin_message (NaTrayManager *manager, XClientMessageEvent *xevent) { GtkSocket *socket; GList *p; PendingMessage *msg; long timeout; long len; long id; socket = g_hash_table_lookup (manager->socket_table, GINT_TO_POINTER (xevent->window)); /* we don't know about this tray icon, so ignore the message */ if (!socket) return; /* Check if the same message is already in the queue and remove it if so */ for (p = manager->messages; p; p = p->next) { PendingMessage *pmsg = p->data; if (xevent->window == pmsg->window && xevent->data.l[4] == pmsg->id) { /* Hmm, we found it, now remove it */ pending_message_free (pmsg); manager->messages = g_list_remove_link (manager->messages, p); g_list_free_1 (p); break; } } timeout = xevent->data.l[2]; len = xevent->data.l[3]; id = xevent->data.l[4]; if (len == 0) { g_signal_emit (manager, manager_signals[MESSAGE_SENT], 0, socket, "", id, timeout); } else { /* Now add the new message to the queue */ msg = g_new0 (PendingMessage, 1); msg->window = xevent->window; msg->timeout = timeout; msg->len = len; msg->id = id; msg->remaining_len = msg->len; msg->str = g_malloc (msg->len + 1); msg->str[msg->len] = '\0'; manager->messages = g_list_prepend (manager->messages, msg); } }
static GdkFilterReturn na_tray_manager_handle_client_message_message_data (GdkXEvent *xev, GdkEvent *event, gpointer data) { XClientMessageEvent *xevent; NaTrayManager *manager; GList *p; int len; xevent = (XClientMessageEvent *) xev; manager = data; /* Try to see if we can find the pending message in the list */ for (p = manager->messages; p; p = p->next) { PendingMessage *msg = p->data; if (xevent->window == msg->window) { /* Append the message */ len = MIN (msg->remaining_len, 20); memcpy ((msg->str + msg->len - msg->remaining_len), &xevent->data, len); msg->remaining_len -= len; if (msg->remaining_len == 0) { GtkSocket *socket; socket = g_hash_table_lookup (manager->socket_table, GINT_TO_POINTER (msg->window)); if (socket) g_signal_emit (manager, manager_signals[MESSAGE_SENT], 0, socket, msg->str, msg->id, msg->timeout); pending_message_free (msg); manager->messages = g_list_remove_link (manager->messages, p); g_list_free_1 (p); } break; } } return GDK_FILTER_REMOVE; }
static void egg_tray_manager_handle_message_data (EggTrayManager *manager, XClientMessageEvent *xevent) { GList *p; int len; /* Try to see if we can find the * pending message in the list */ for (p = manager->messages; p; p = p->next) { PendingMessage *msg = p->data; if (xevent->window == msg->window) { /* Append the message */ len = MIN (msg->remaining_len, 20); memcpy ((msg->str + msg->len - msg->remaining_len), &xevent->data, len); msg->remaining_len -= len; if (msg->remaining_len == 0) { GtkSocket *socket; socket = g_hash_table_lookup (manager->socket_table, GINT_TO_POINTER (msg->window)); if (socket) { g_signal_emit (manager, manager_signals[MESSAGE_SENT], 0, socket, msg->str, msg->id, msg->timeout); } manager->messages = g_list_remove_link (manager->messages, p); pending_message_free (msg); } return; } } }