Я тоже боролся за эту тему некоторое время назад.
Посмотрите на http://marc.info/?l=freedesktop-xcb&m=129381953404497.
Ключ заключается в том, чтобы сохранить cookie для WM_DELETE_WINDOW в отдельном cookie ...
xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(c, 0, 16, "WM_DELETE_WINDOW");
xcb_intern_atom_reply_t* reply2 = xcb_intern_atom_reply(c, cookie2, 0);
и в цикле событий сравните client_message с cookie2
case XCB_CLIENT_MESSAGE:
{
if((*(xcb_client_message_event_t*)event).data.data32[0] == (*reply2).atom) ...
}