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。不会有"虚拟的";键向上消息。其他应用不受影响。
相关文章:
- 没有找到相关文章