Jak poprawnie użyć QX11Info::peekEventQueue do podglądu kolejnego eventu w kolejce na linuksie

0

Czołem Bracia i Siostry w kodzie

Chcę się podpytać jak prawidłowo użyć peekEventQueue do podglądania kolejki eventów na linuksie, bo coś chyba zmaściłem.

//gdzieś w QAbstractNativeEventFilterze, w reakcji na XCB_KEY_RELEASE
                xcb_flush(QX11Info::connection());
                QPair<unsigned int, xcb_keycode_t> timestampAndKey(0, kev->detail);//kev to xcb_key_press_event_t
                bool wasFound = QX11Info::peekEventQueue(queuePeeker, &timestampAndKey);

a tu kod podglądacza:

bool LinuxNativeEventFilter::queuePeeker(xcb_generic_event_t *event, void *peekerData)
{
    qDebug() << "event type: " << event->response_type;
    if (event->response_type == XCB_KEY_PRESS)
    {
        auto *timestampAndKey = (QPair<unsigned int, xcb_keycode_t>*)peekerData;
        auto kev = (xcb_key_press_event_t*)event;
        if (kev->detail == timestampAndKey->second)
        {
            timestampAndKey->first = kev->time;
            return true;
        }
    }

    return false;
}

Co potrzebuję, to po wciśnięciu i przytrzymaniu fizycznego klawisza klawiatury wyczaić następny nadchodzący XCB_KEY_PRESS, i jeśli ma taki sam detail(key code) to pobrać jego timestamp. Niestety, najwidoczniej czegoś istotnego o tej kolejce eventów, albo podglądaniu/wpuszczaniu w nią eventów, albo użyciu QX11Info nie wiem, bo powyższe kody nie działają jak bym chciał - często gęsto podglądacz nie jest wywoływany wcale mimo przytrzymania klawisza.

EDIT:
Rozwiązane, dzięki sugestii Brata @alagner
Na wypadek jakby jakiś nieborak poszukiwał tak wygląda poprawiony i działający kod:

                    usleep(200);//key press potrzebuje chwilki na dotarcie
                    xcb_flush(QX11Info::connection());
                    QPair<unsigned int, xcb_keycode_t> timestampAndKey(0, kev->detail);
                    bool incomingKeyPress = QX11Info::peekEventQueue(queuePeeker, &timestampAndKey);
                    if (incomingKeyPress)
                    {
                           //nadchodzący key press został odnaleziony w buforze, zrób coś z tą wiedzą
                    }
1

Na wyczucie nieco: a zacznie się podglądacz uruchamiać jak dasz chwilę sleepa przed jego wywołaniem? Może po prostu nowy event jeszcze nie zdąża nadejść?
W takim razie - może spróbuj cache’eować „poprzednie” release eventy i porównywać je w momencie nadejścia pressa?

0
alagner napisał(a):

W takim razie - może spróbuj cache’eować „poprzednie” release eventy i porównywać je w momencie nadejścia pressa?

No tak właśnie robię Bracie @alagner, tj podczas release'a zapamiętuję jego timestamp, i przy następnym pressie porównuję czy są te same. Jednak jest problem dla pierwszej pary press/release:

press1
release1 //ten release już należy do autorepeata, a jeszcze nie ma zchache'owanego timestampa bo dopiero teraz to zrobię
//żeby określić czy jest autorepeat, czy nie, to muszę podejrzeć następny press jaki siedzi w buforze - będą miały ten sam timestamp i keycode.
//No chyba że jest jakiś inny sposób na wykrycie autorepeata w linuksie.
press2//następny w kolejce key press, cache timestampa zrobiłem przy release1, i tu autorepeat jest wykryty poprawnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1