3

私は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: %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);

それはうまくいきます。これは既知の問題ですか?

4

1 に答える 1

2

はい、のマニュアルページにはXCheckWindowEvent明示的に次のように書かれています

XCheckWindowEvent()は、ClientMessage、MappingNotify、SelectionClear、SelectionNotify、またはSelectionRequestイベントを返すことができません。これらのイベントタイプは、定義上、マスクできないためです。

于 2012-04-13T08:29:30.537 に答える