QT: не получает данные XIDeviceEvent в X11EventFilter

У меня есть приложение Qt, которое отлично работает на Ubuntu 14.04 и Ubuntu 12.04. Мне нужно перенаправить Touch и нажатие кнопки XEvents для моего приложения.
Кусок кода, который делает это следующим образом:

XIEventMask eventmask;
eventmask.deviceid = XIAllMasterDevices;
eventmask.mask_len = XIMaskLen(XI_LASTEVENT);
eventmask.mask = (unsigned char*) calloc(eventmask.mask_len, sizeof(char));
XISetMask(eventmask.mask, XI_TouchBegin);
XISetMask(eventmask.mask, XI_TouchUpdate);
XISetMask(eventmask.mask, XI_TouchEnd);
XISetMask(eventmask.mask, XI_ButtonPress);
XISetMask(eventmask.mask, XI_ButtonRelease);
XISetMask(eventmask.mask, XI_Motion);
printf("Return value from XISelectevents: %d\n",XISelectEvents(QX11Info::display(), viewer->winId(), &eventmask, 1));

XISelectEvents() функция возвращает 0, которое я предполагаю, является возвращаемым значением для успеха. Тогда у меня есть функция oveeride bool MainApplication::x11EventFilter(XEvent *event) обрабатывать события.

XEvent ev = *event;
if (ev.xcookie.type == GenericEvent)
{
//printf("event: %d\n", ev.xcookie.evtype);
XIDeviceEvent* evData = (XIDeviceEvent*)(ev.xcookie.data);

int id = 0;
if(evData != 0)
id = evData->detail;
else{
printf("Device Event data not coming\n");
// return false;
}
...

Приведенный выше код прекрасно работает в Ubuntu, но в Debian 8 значение (XIDeviceEvent*)(ev.xcookie.data) равно 0. Есть ли причина, по которой это не должно работать в Debian 8?

1

Решение

Мне нужно было позвонить XGetEventData(QX11Info::display(),ev.xcookie) для того, чтобы получить данные о событии.
Это то, что я узнал после некоторых копаний. Файл cookie — это просто уникальный идентификатор для каждого события. XGenericEventCookie структура данных выглядит следующим образом

typedef struct
{
int            type;         /* of event. Always GenericEvent */
unsigned long  serial;       /* # of last request processed */
Bool           send_event;   /* true if from SendEvent request */
Display        *display;     /* Display the event was read from */
int            extension;    /* major opcode of extension that caused the event */
int            evtype;       /* actual event type. */
unsigned int   cookie;       /* unique event cookie */
void           *data;        /* actual event data */
} XGenericEventCookie;

Оказывается, просто извлекая событие, извлекает cookie-файл события с указателем данных NULL. XGetEventData должен быть вызван, чтобы фактически требовать куки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]