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.
Bir yorum eklemek gönderiyi çarpıyor mu? Haydi! Sadece bunun için XLib kullanmaya geri dönmek istemiyorum: – CoffeeandCode