static GdkFilterReturn na_tray_manager_handle_client_message_opcode (GdkXEvent *xev, GdkEvent *event, gpointer data) { XClientMessageEvent *xevent; NaTrayManager *manager; xevent = (XClientMessageEvent *) xev; manager = data; switch (xevent->data.l[1]) { case SYSTEM_TRAY_REQUEST_DOCK: /* Ignore this one since we don't know on which window this was received * and so we can't know for which screen this is. It will be handled * in na_tray_manager_window_filter() since we also receive it there */ break; case SYSTEM_TRAY_BEGIN_MESSAGE: na_tray_manager_handle_begin_message (manager, xevent); return GDK_FILTER_REMOVE; case SYSTEM_TRAY_CANCEL_MESSAGE: na_tray_manager_handle_cancel_message (manager, xevent); return GDK_FILTER_REMOVE; default: break; } return GDK_FILTER_CONTINUE; }
static GdkFilterReturn na_tray_manager_window_filter (GdkXEvent *xev, GdkEvent *event, gpointer data) { XEvent *xevent = (GdkXEvent *)xev; NaTrayManager *manager = data; if (xevent->type == ClientMessage) { /* We handle this client message here. See comment in * na_tray_manager_handle_client_message_opcode() for details */ if (xevent->xclient.message_type == manager->opcode_atom && xevent->xclient.data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { na_tray_manager_handle_dock_request (manager, (XClientMessageEvent *) xevent); return GDK_FILTER_REMOVE; } /* _NET_SYSTEM_TRAY_OPCODE: SYSTEM_TRAY_BEGIN_MESSAGE */ else if (xevent->xclient.message_type == manager->opcode_atom && xevent->xclient.data.l[1] == SYSTEM_TRAY_BEGIN_MESSAGE) { na_tray_manager_handle_begin_message (manager, (XClientMessageEvent *) event); return GDK_FILTER_REMOVE; } /* _NET_SYSTEM_TRAY_OPCODE: SYSTEM_TRAY_CANCEL_MESSAGE */ else if (xevent->xclient.message_type == manager->opcode_atom && xevent->xclient.data.l[1] == SYSTEM_TRAY_CANCEL_MESSAGE) { na_tray_manager_handle_cancel_message (manager, (XClientMessageEvent *) event); return GDK_FILTER_REMOVE; } /* _NET_SYSTEM_TRAY_MESSAGE_DATA */ else if (xevent->xclient.message_type == manager->message_data_atom) { na_tray_manager_handle_message_data (manager, (XClientMessageEvent *) event); return GDK_FILTER_REMOVE; } } else if (xevent->type == SelectionClear) { g_signal_emit (manager, manager_signals[LOST_SELECTION], 0); na_tray_manager_unmanage (manager); } return GDK_FILTER_CONTINUE; }