Глобальная комбинация клавиш alt + space — странное поведение при фокусировке клавиатуры

Я хватаю Alt+Space глобальная горячая клавиша с помощью xcb_grab_key, следующее:

xcb_key_symbols_t *keysyms = xcb_key_symbols_alloc(c);
xcb_keycode_t *keycodes = xcb_key_symbols_get_keycode(keysyms, XK_space), keycode;

// add bindings for all screens
xcb_screen_iterator_t iter;
iter = xcb_setup_roots_iterator (xcb_get_setup (c));
for (; iter.rem; xcb_screen_next (&iter)) {
int i = 0;
while(keycodes[i] != XCB_NO_SYMBOL) {
keycode = keycodes[i];
xcb_grab_key(c, true, iter.data->root, XCB_MOD_MASK_ANY, keycode, XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_SYNC);
i += 1;
}
}

Затем в подклассе QAbstractNativeEventFilter я обрабатываю его и выдаю сигнал Qt, если ключ совпадает Alt+Space:

xcb_keycode_t *keycodes = xcb_key_symbols_get_keycode(keysyms, XK_space);
int i = 0;
bool found = false;
while(keycodes[i] != XCB_NO_SYMBOL) {
if(event->detail == keycodes[i]) {
if(event->state & GetModifier(c, keysyms, XK_Alt_L) || event->state & GetModifier(c, keysyms,  XK_Alt_R)) {
xcb_allow_events(c, XCB_ALLOW_ASYNC_KEYBOARD, event->time);
emit gotHotKey();
found = true;
} else {
xcb_allow_events(c, XCB_ALLOW_REPLAY_KEYBOARD, event->time);
}
break;
}
i += 1;
}
if(found) return true;

(GetModifier является скопировано из VLC но я думаю, что эта часть не имеет значения, так как Alt-key соответствует правильно)

У меня проблема в том, что после show()В главном окне при нажатии горячей клавиши клавиатура в большинстве случаев1 не сфокусирован должным образом. Я могу напечатать, но курсор не виден, граница ввода не выделена, и ярлык Ctrl+Q за то, что бросил не работать. Это можно обойти, перемещая окно или нажимая пробел — затем фокус восстанавливается — курсор + граница снова появляется и Ctrl+Q работает. Что может быть причиной такого поведения?

Я использую Qt 5.0.0 и xcb 1.8.1. Полное приложение можно скачать для компиляции из GitHub.

1 иногда это означает, что проблема не воспроизводима — фокус устанавливается правильно даже для повторных скрытых / показанных окон, но в других случаях это происходит несколько раз в ряду скрывающих / показывающих. Это происходит чаще, чем не в целом.

(Изменить: я реализовал (очень уродливый …) обходной путь, поэтому, чтобы воспроизвести проблему для проекта github, необходимо удалить следующий код)

#ifndef WIN32
// Very ugly workaround for the problem described at http://stackoverflow.com/questions/14553810/
// (just show and hide a modal dialog box, which for some reason restores proper keyboard focus)
hackDialog.setGeometry(0, 0, 0, 0);
hackDialog.setModal(true);
hackDialog.show();
QTimer::singleShot(100, &hackDialog, SLOT(reject()));
#endif

4

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]