Tray icons can send "opcodes" to
the system tray. These are X client messages, sent with
NoEventMask, a
message_type of
_NET_SYSTEM_TRAY_OPCODE, and format 32.
The first data field in the message is a timestamp (the stamp
of the current event, if available, otherwise CurrentTime).
The second data field is an integer indicating the op code
of the message:
#define SYSTEM_TRAY_REQUEST_DOCK 0
#define SYSTEM_TRAY_BEGIN_MESSAGE 1
#define SYSTEM_TRAY_CANCEL_MESSAGE 2
The content remaining three data fields depends on the type of message being sent. If they are unused by a particular message, they should always be set to 0.
Here is an example of how to send a client message:
#include <X11/Xlib.h>
void send_message(
Display* dpy, /* display */
Window w, /* sender (tray icon window) */
long message, /* message opcode */
long data1 /* message data 1 */
long data2 /* message data 2 */
long data3 /* message data 3 */
){
XEvent ev;
memset(&ev, 0, sizeof(ev));
ev.xclient.type = ClientMessage;
ev.xclient.window = w;
ev.xclient.message_type = XInternAtom (dpy, "_NET_SYSTEM_TRAY_OPCODE", False );
ev.xclient.format = 32;
ev.xclient.data.l[0] = x_time;
ev.xclient.data.l[1] = message;
ev.xclient.data.l[2] = data1;
ev.xclient.data.l[3] = data2;
ev.xclient.data.l[4] = data3;
trap_errors();
XSendEvent(dpy, w, False, NoEventMask, &ev);
XSync(dpy, False);
if (untrap_errors()) {
/* Handle failure */
}
}