Определить состояние блокировки прописных букв, измененное в асинхронном режиме c ++ Linux - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь обнаружить изменения в состоянии блокировки прописных букв и языке клавиатуры с помощью 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)

...