C++ 忽略重复键
我正在尝试解决如何在使用xcb进行输入时忽略重复键 我需要这样的东西:C++ 忽略重复键,c++,x11,c++14,xcb,C++,X11,C++14,Xcb,我正在尝试解决如何在使用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); 但不会影响整个系统 我读过,但我不能把它翻译成xcb。也就是说,我找不到与XEventsQueued等效的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);
但不会影响整个系统
我读过,但我不能把它翻译成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在幕后处理其事件队列的方式类似。添加评论会影响帖子吗?来吧我不想仅仅为了这个原因而恢复使用XLib:/