2015-07-24 20 views
5

Giriş için xcb kullanılırken yinelenen tuşları nasıl yok saymaya çalışacağım.xcb, yinelenen tuşları yok sayıyor

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

ama bütün sistemi etkilemeden: Bu acheives gibi

şey lazım.

Ignore auto repeat in X11 applications okudum, ancak xcb'ye çeviremiyorum. Yani, XEventsQueued için bir xcb eşdeğeri bulamıyorum.

Bunu yapmayı nasıl yaparım?

+0

Bir yorum eklemek gönderiyi çarpıyor mu? Haydi! Sadece bunun için XLib kullanmaya geri dönmek istemiyorum: – CoffeeandCode

cevap

2

Kısa bir süre önce bu yazı hakkında bir bildirim aldıktan sonra, problemle karşılaştığımda çözümümün nihayet olduğunu ekleyeceğimi düşündüm.

Kendi olay kuyruğu oluşturdu ve etkinlikler için bu ankete:
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; 
} 

yüzden önceki ve sonraki olayları kontrol edebilir edebilirsiniz.

Sonraki Yeni yoklama işlevini kullanmak benim giriş fonksiyonunu değişti ve ben tuşa basma nasıl idare değişti: Bir güçlük biraz oldu, ama Xlib o oluyor nasıl işleyeceğini benzer hayal

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

perde arkasında olay kuyruğu.

İlgili konular