我试图找出如何在使用xcb输入时忽略重复键.
我需要这样的事情:
uint32_t mask = XCB_KB_AUTO_REPEAT_MODE; uint32_t values[] = {XCB_AUTO_REPEAT_MODE_OFF,None}; xcb_change_keyboard_control(xcb_connection,mask,values);
但不影响整个系统.
我已阅读Ignore auto repeat in X11 applications,但我无法将其翻译为xcb.也就是说,我找不到与XEventsQueued等效的xcb.
我该怎么做呢?
解决方法
刚收到关于这篇文章的通知后,我想我会在我再次遇到问题时添加我的解决方案.
我创建了自己的事件队列并对事件进行了轮询:
class event_queue{ public: ~event_queue(){ free(curr); free(prev); free(next); } xcb_generic_event_t *curr = nullptr,*prev = nullptr,*next = nullptr; }; namespace { event_queue internal_eventq; } xcb_generic_event_t *poll_event(xcb_connection_t *conn){ if(internal_eventq.curr){ free(internal_eventq.prev); internal_eventq.prev = internal_eventq.curr; } internal_eventq.curr = internal_eventq.next; internal_eventq.next = xcb_poll_event(conn); return internal_eventq.curr; }
所以我可以检查上一个和下一个事件.
接下来,我更改了输入功能以使用新的轮询功能,并更改了我按键操作的方式:
// in same scope as 'poll_event' void handle_events(xcb_connection_t *conn){ while(auto ev = poll_event(conn)){ switch(ev->response_type){ case /* xcb key press */:{ if( (internal_eventq.next == /* xcb key release */) && (internal_eventq.next->keysym == ev->keysym) && (internal_eventq.next->time == ev->time) ){ free(internal_eventq.next); internal_eventq.next = nullptr; // ignore release part of key repeat return; // ignore key repeat } break; } default: break; } } }
这有点麻烦,但我想它类似于Xlib如何在幕后处理它的事件队列.