XCB忽略重复的键

xcb ignoring repeated keys

本文关键字:XCB      更新时间:2023-10-16

我想知道如何在使用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);

但不影响整个系统

我已经阅读忽略自动重复在X11应用程序,但我不能翻译它到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在幕后处理事件队列的方式相似。

没有文档说明。但你需要的一切都在XCB中。

  • 确保链接到xcb &xcb-xkb
  • #include <xcb/xcb.h> &<xcb/xkb.h>
  • 连接到服务器后,执行以下操作:
<>之前 //Initialize the X Keyboard (xkb) support extention xcb_xkb_use_extension(conn, XCB_XKB_MAJOR_VERSION, XCB_XKB_MINOR_VERSION); //Set the per client detectable auto repeat flag xcb_xkb_per_client_flags(conn, XCB_XKB_ID_USE_CORE_KBD, XCB_XKB_PER_CLIENT_FLAG_DETECTABLE_AUTO_REPEAT, 1,0,0,0); 之前

这将使关键消息的行为像Windows。不会有"虚拟的";键向上消息。其他应用不受影响。

相关文章:
  • 没有找到相关文章