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

но не влияя на всю систему.

я прочитал Игнорировать автоповтор в приложениях X11, но я не могу перевести его на xcb. А именно, я не могу найти XCB эквивалент XEventsQueued,

Как мне это сделать?

7

Решение

Недавно, получив уведомление об этом посте, я решил добавить свое решение, когда снова столкнусь с проблемой.

Я создал свою собственную очередь событий и опросил ее для событий:

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 обрабатывает свою очередь событий за кулисами.

2

Другие решения


По вопросам рекламы [email protected]