2015-07-24 7 views
5

Ich versuche, wie man zu trainieren wiederholt Schlüssel zu ignorieren, wenn xcb für die Eingabe verwenden.xcb ignorieren wiederholt Tasten

Ich brauche so etwas wie dieses Übertragungskameras:

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

aber ohne das gesamte System zu beeinflussen.

Ich habe Ignore auto repeat in X11 applications gelesen, aber ich es XCB nicht übersetzen kann. Ich kann nämlich kein xcb finden, das XEventsQueued entspricht.

Wie gehe ich um dies zu tun?

+0

Hat das Hinzufügen ein Kommentar an den Pfosten stoßen? Komm schon! Ich möchte nicht einfach auf XLib zurückgreifen, nur dafür: / – CoffeeandCode

Antwort

2

Nach einer Benachrichtigung über diese Nachricht bekommen dachte ich erst vor kurzem würde ich hinzufügen, was meine Lösung schließlich war, als ich wieder auf das Problem kam.

ich meine eigene Ereigniswarteschlange und abgefragt dass für Veranstaltungen:

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

So kann ich die vorherigen und nächsten Ereignisse überprüfen konnten.

Next änderte ich meine Eingangsfunktion die neue Abfragefunktion zu verwenden und verändert, wie ich Tastendrücke Griff:

// 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; 
     } 
    } 
} 

, die eine etwas mühsam war, aber ich glaube, es ist ähnlich wie Xlib Griffe es Ereigniswarteschlange hinter den Kulissen.