У меня проблема с отправкой события, связанного с моей программой, с помощью XSendEvent ().Я настраиваю XEvent следующим образом и отправляю его:
XEvent evt;
evt.xclient.type = ClientMessage;
evt.xclient.serial = 0;
evt.xclient.send_event = true;
evt.xclient.message_type = XInternAtom(xconn, "_APP_EVT", false);
evt.xclient.format = 32;
evt.xclient.window = xwin;
evt.xclient.data.l[0] = XInternAtom(xconn, "_APP_EVT_PTR", false);
*reinterpet_cast<void**>(evt.xclient.data.l+1) = <pointer_value>
XSendEvent(xconn, xwin, false, NoEventMask, &evt);
Позже в цикле событий я пытаюсь прочитать отправленный указатель из полученного сообщения, но значение указателя чтения всегда плохое.До сих пор я понятия не имею, почему Xlib искажает массив evt.xclient.data.l, поскольку в документации по XLib сказано, что X вообще не будет обрабатывать данные.
for(;;) {
XEvent evt;
XNextEvent(xconn, &evt);
if(evt.type == ClientMessage) {
if(evt.xclient.message_type == XInternAtom(xconn, "_APP_EVT", false)) {
if(evt.xclient.data.l[0] == XInternAtom(xconn, "_APP_EVT_PTR", false)) {
// Prints pointers,
// that have only partially corrects bits in place:
printf("_APP_EVT_PTR:%p", *reinterpet_cast<void**>(evt.xclient.data.l+1));
}
}
}
Еще одна деталь заключается в том, чтосообщение отправляется из основного потока, а цикл сообщений находится в отдельном потоке графического интерфейса.Я вызываю XInitThreads () в программе, прежде чем делать что-либо еще с Xlib.