Для моей экранной клавиатуры требуется два действия:
1) Повесить какой-то обработчик, который будет вызываться при каждой смене раскладки клавиатуры. При этом окно клавиатуры само по себе никогда не получает фокус. Однако я через XRecord уже отлавливаю все нажатия клавиш (чтобы подсвечивать нажатые клавиши, а также определять изменение режима Caps Lock и Num Lock) и отслеживать глобально ещё какие-то события мне не составит труда.
2) Переключиться на следующую раскладку клавиатуры. То есть действие аналогичное нажатию Ctrl + Shift или какой-либо другой комбинации. Но не с помощью эмуляции соответствующих нажатий, а как-нибудь универсально (ведь вроде как можно иметь несколько раскладок, но не назначить комбинацию их смены и делать всё мышкой через виджет).
Сейчас я делаю это через DBus запросов к org.kde.keyboard и org.kde.KeyboardLayouts, но что-то мне подсказывает, что если запустить мою программу в другом DE, то это всё работать не будет. Хотелось бы более портабельный способ, использующий непосредственно API иксов.
Пробовал глобально ловить события KeymapNotify, но они почему-то не приходят (хотя KeyPress и KeyRelease я получаю, какому бы окну они не адресовались). Также читал, что такая встроенная фича Qt как QEvent::KeyboardLayoutChange не особо то работает.
Что ещё можно попробовать?