QT:没有在 X11EventFilter 中获取 XIDeviceEvent 数据
QT: Not getting XIDeviceEvent data in X11EventFilter
我有一个在 Ubuntu 14.04 和 Ubuntu 12 上运行良好的 Qt 应用程序。04.I 需要将触摸和按钮按下 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()
函数 returns 0 我认为是成功的 return 值。然后我有一个 overide 函数 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 上运行吗?
我需要调用 XGetEventData(QX11Info::display(),ev.xcookie)
才能获取事件数据。
这是我在进行一些挖掘后发现的。 cookie 只是每个事件的唯一 ID。 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;
事实证明,简单地检索事件会检索到数据指针为 NULL 的事件 cookie。 XGetEventData
必须调用才能实际声明 cookie。
我有一个在 Ubuntu 14.04 和 Ubuntu 12 上运行良好的 Qt 应用程序。04.I 需要将触摸和按钮按下 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()
函数 returns 0 我认为是成功的 return 值。然后我有一个 overide 函数 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 上运行吗?
我需要调用 XGetEventData(QX11Info::display(),ev.xcookie)
才能获取事件数据。
这是我在进行一些挖掘后发现的。 cookie 只是每个事件的唯一 ID。 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;
事实证明,简单地检索事件会检索到数据指针为 NULL 的事件 cookie。 XGetEventData
必须调用才能实际声明 cookie。