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 に相当するものを探しているので、発生した最後のイベントを使用する代わりに、直後にキューに入れられたイベントがあるかどうかをテストできますが、まだ失敗しています。
すでにこれを行っていて、この問題についてあなたの知恵を進んで伝えたい人はいますか?