2

xcbイベントループで繰り返されるキーを無視する方法を見つけようとしてきましたが、これまでのところ次のようになっています:

extern xcb_connection_t *connection;

// looks like there's a leak, but in the finished product there isn't    
bool poll_event(/*my_event_type e*/){
    static xcb_generic_event_t *ev = nullptr;
    static xcb_key_press_event_t *last_key_ev = nullptr;

    if(!(ev = xcb_poll_for_event(connection)))
        return false;

    switch(ev->response_type & ~0x80){
        case XCB_KEY_PRESS:{
            xcb_key_press_event_t *kp = static_cast<decltype(kp)>(ev);                

            if(last_key_ev &&
                    ((last_key_ev->response_type & ~0x80) == XCB_KEY_RELEASE) &&
                    (last_key_ev->detail == kp->detail) &&
                    (last_key_ev->time == kp->time)
                ){
                std::free(last_key_ev);
                last_key_ev = kp;

                // is repeated key, ignore this event

                return false;
            }

            std::free(last_key_ev);
            last_key_ev = kp;
            return true;
        }

        case XCB_KEY_RELEASE:{
            /* same as KEY_PRESS but looking for KEY_PRESS in 'last_key_ev' */
        }

        default:
            std::free(ev);
            return true;
    }
}

XCB_KEY_RELEASEこれは、繰り返されるイベント ペア ( then XCB_KEY_PRESS)の後半のみを破棄するため機能しませXCB_KEY_RELEASEん。ただし、キュー自体を変更せずにキューにイベントがあるかどうかをテストするための関数が xcb にないようです。

xcb で XEventsQueued に相当するものを探しているので、発生した最後のイベントを使用する代わりに、直後にキューに入れられたイベントがあるかどうかをテストできますが、まだ失敗しています。

すでにこれを行っていて、この問題についてあなたの知恵を進んで伝えたい人はいますか?

4

1 に答える 1