+void dnd_message(XClientMessageEvent *e)
+{
+ Panel *panel = get_panel(e->window);
+ int x, y, mapX, mapY;
+ Window child;
+ x = (e->data.l[2] >> 16) & 0xFFFF;
+ y = e->data.l[2] & 0xFFFF;
+ XTranslateCoordinates(server.dsp, server.root_win, e->window, x, y, &mapX, &mapY, &child);
+ Task* task = click_task(panel, mapX, mapY);
+ if (task) {
+ if (task->desktop != server.desktop )
+ set_desktop (task->desktop);
+ window_action(task, TOGGLE);
+ }
+
+ // send XdndStatus event to get more XdndPosition events
+ XClientMessageEvent se;
+ se.type = ClientMessage;
+ se.window = e->data.l[0];
+ se.message_type = server.atom.XdndStatus;
+ se.format = 32;
+ se.data.l[0] = e->window; // XID of the target window
+ se.data.l[1] = 0; // bit 0: accept drop bit 1: send XdndPosition events if inside rectangle
+ se.data.l[2] = 0; // Rectangle x,y for which no more XdndPosition events
+ se.data.l[3] = (1 << 16) | 1; // Rectangle w,h for which no more XdndPosition events
+ se.data.l[4] = None; // None = drop will not be accepted
+ XSendEvent(server.dsp, e->data.l[0], False, NoEventMask, (XEvent*)&se);
+}
+
+