Я пытаюсь обнаружить изменения в состоянии блокировки прописных букв и языке клавиатуры с помощью c ++ в Linux с использованием XLib. Я уже знаю, что это возможно таким образом:
void eventCatcher()
{
XEvent e;
Display *d;
if (!(d = XOpenDisplay(nullptr)))
return;
XKeysymToKeycode(d, XK_F1);
int xkbEventType;
XkbQueryExtension(d, 0, &xkbEventType, 0, 0, 0);
XkbSelectEvents(d, XkbUseCoreKbd, XkbAllEventsMask, XkbAllEventsMask);
XSync(d, False);
while (true)
{
XNextEvent(d, &e);
if (e.type == xkbEventType)
{
XkbEvent* xkbEvent = (XkbEvent*) &e;
if (xkbEvent->any.xkb_type == XkbStateNotify)
{
cout << "caps lock or keyboard language may change!";
}
}
}
}
Но так я столкнулся с двумя следующими проблемами:
1 - поток всегда должен запускать этот l oop и проверять вещи! (занят ожиданием)
2- Не только в случае изменения состояния блокировки заглавных букв и языка клавиатуры, но и в некоторых других случаях, таких как прокрутка, я попадаю в строку печати.
Поэтому мой вопрос заключается в том, что Есть ли какой-нибудь асин c способ обнаружения этих двух? как установить обратный вызов для события? (Я не настаиваю на использовании XLib)