2015-07-24 7 views
5

मैं इनपुट के लिए xcb का उपयोग करते समय बार-बार कुंजी को अनदेखा करने का प्रयास करने का प्रयास कर रहा हूं।xcb बार-बार कुंजियों को अनदेखा कर रहा है

मैं कुछ की जरूरत है इस तरह acheives:

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

लेकिन पूरी व्यवस्था को प्रभावित किए बिना।

मैंने Ignore auto repeat in X11 applications पढ़ा है, लेकिन मैं इसे xcb में अनुवाद नहीं कर सकता। अर्थात्, मुझे XEventsQueued के बराबर एक एक्ससीबी नहीं मिल रहा है।

मैं यह करने के बारे में कैसे जा सकता हूं?

+0

कोई टिप्पणी जोड़ना पोस्ट को टक्कर देता है? आ जाओ! मैं इसके लिए XLib का उपयोग करने के लिए वापस नहीं लौटना चाहता हूं: / – CoffeeandCode

उत्तर

2

इस पोस्ट के बारे में अधिसूचना प्राप्त करने के बाद हाल ही में मैंने सोचा कि मैं जोड़ दूंगा कि आखिर में समस्या का सामना करने पर मेरा समाधान क्या था।

मैं अपने ही घटना कतार बनाया है और घटनाओं के लिए है कि सर्वेक्षण में शामिल:

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 संभालती यह है इसी तरह की है दृश्यों के पीछे घटना कतार।

संबंधित मुद्दे