XCheckWindowEvent 不返回 ClientMessage 事件

XCheckWindowEvent doesn't return ClientMessage events

本文关键字:事件 ClientMessage 返回 XCheckWindowEvent      更新时间:2023-10-16

我正在玩xlib,我有这样的东西来检查窗口/子窗口的事件:

// Dispatch X11 events in a more friendly format
static inline bool xwin_event(xwin_t *xwin, event_t *evt) {
    XEvent event;
    if (!XCheckWindowEvent(xwin->xconn->dpy, xwin->window, 0xFFFFFFFF, &event)) {
        return false;
    }
    if (event.type == ClientMessage) {
        printf("Got event, wid: %in", event.xany.window);
    }
}

我在循环中调用。 我正在这样建造我的窗口:

// Define events we want
XSelectInput(xconn->dpy, xwin->window,
             KeyPressMask        | 
             ButtonPressMask     | ButtonReleaseMask |
             EnterWindowMask     | LeaveWindowMask   |
             PointerMotionMask   | ExposureMask      |
             StructureNotifyMask | SubstructureNotifyMask);
// Grab some window manager events
xwin->proto = XInternAtom(xconn->dpy, "WM_PROTOCOLS",     1);
xwin->close = XInternAtom(xconn->dpy, "WM_DELETE_WINDOW", 0);
XSetWMProtocols(xconn->dpy, xwin->window, &xwin->close, 1);

出于某种原因,我从未看到任何客户端消息事件从队列中出来。 如果我检查这样的东西(不允许我按窗口过滤):

if (!XPending(xwin->xconn->dpy)) {
    return false;
}
XNextEvent(xwin->xconn->dpy, &event);

它通过得很好。 这是一个已知问题吗?

是的,XCheckWindowEvent的手册页明确指出

XCheckWindowEvent() 无法返回 ClientMessage, MappingNotify, 选择清除、选择通知或选择请求事件,因为 根据定义,这些事件类型是不可屏蔽的。