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, ×tampAndKey);
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, ×tampAndKey);
if (incomingKeyPress)
{
//nadchodzący key press został odnaleziony w buforze, zrób coś z tą wiedzą
}