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

但不影响整个系统。

我已阅读 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++ - xcb 忽略重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31616651/

相关文章:

c++ - 为什么编译器不为返回类型为 classname& 的函数返回 this 指针而抛出错误

c++ - 如何使用 TinyXml 解析特定元素

c++ - 调试断言失败

centos - Wine InnoSetup CentOs

compiler-errors - 与涉及shared_ptr列表的表达式有关的编译器错误

c++ - 使用静态常量初始化 unique_ptr 时出现 undefined reference 错误

c++ - QT5 中的信号和插槽

C++:调用运算符和调用它的实现之间有区别吗

java - Netbeans 转发 X11 字体问题

c - 获取X11中的死键列表