2012-04-13 86 views
2

我与Xlib的玩弄,和我有这样的事情来检查事件窗口/子窗口的基础上:XCheckWindowEvent不返回ClientMessage事件

// 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: %i\n", 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); 

由于某种原因,我从来没有看到任何ClientMessage事件出现在队列中。如果我检查这样的事情(这不会让我通过窗口过滤):

if (!XPending(xwin->xconn->dpy)) { 
    return false; 
} 

XNextEvent(xwin->xconn->dpy, &event); 

它通过就好了。这是一个已知的问题?

回答

2

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

XCheckWindowEvent()不能返回ClientMessage,MappingNotify, SelectionClear,SelectionNotify,或因为 这些事件类型被定义无屏蔽SelectionRequest事件。

+0

该死的,我一直在阅读文档http://tinyurl.com/7ywhvbn,这显然是不完整的,谢谢! – 2012-04-14 16:46:57