В настоящее время я пытаюсь создать и запустить демонстрационное приложение UnrealEngine4, которое использует SDL2, на встроенной системе Linux armv7 с работающим X-сервером, но без оконного менеджера.
Я вижу, что приложение не реагирует на события клавиатуры, хотя мышь работает нормально.
Копая дальше, выясняется, что проблема в том, что UE4 игнорирует событие клавиатуры, если SDL_Event.key.windowID не соответствует идентификатору SDL_Window приложения. Я проверил это, вызвав SDL_GetKeyboardFocus(), и оказалось, что идентификатор окна для фокуса клавиатуры равен 0, тогда как идентификатор окна приложения равен 5.
Если копнуть глубже внутри SDL2, то окажется, что фокус клавиатуры устанавливается на определенное окно SDL после получения события focusIn от X-сервера. (см. X11_DispatchEvent() в SDL_x11events.c).
Похоже, если вы используете X11 без оконного менеджера, однако это событие focusIn никогда не генерируется X-сервером, как уже было сказано здесь:
После взлома X11_RaiseWindow() в SDL_x11windows.c добавлением:
X11_XSetInputFocus(дисплей, данные->xwindow, RevertToParent, CurrentTime); SDL_SetKeyboardFocus(данные->окно);
удалось, наконец, обработать события клавиатуры.
Верна ли приведенная выше оценка? Если да, то есть ли чистое решение? Я все еще копаюсь, но любое предложение будет очень признательно.
Спасибо