c – 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);

但不影响整个系统.

我已阅读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如何在幕后处理它的事件队列.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...