Фокус ввода SDL2

В настоящее время я пытаюсь создать и запустить демонстрационное приложение 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-сервером, как уже было сказано здесь:

FocusIn/FocusOut не создан

После взлома X11_RaiseWindow() в SDL_x11windows.c добавлением:

X11_XSetInputFocus(дисплей, данные->xwindow, RevertToParent, CurrentTime); SDL_SetKeyboardFocus(данные->окно);

удалось, наконец, обработать события клавиатуры.

Верна ли приведенная выше оценка? Если да, то есть ли чистое решение? Я все еще копаюсь, но любое предложение будет очень признательно.

Спасибо


person dsm7    schedule 11.11.2014    source источник
comment
Я столкнулся с той же проблемой. Мне кажется, что это должно быть фактическим поведением в SDL, поэтому вы должны отправить им отчет об ошибке.   -  person Display Name    schedule 23.05.2015


Ответы (1)


Это оказалось ошибкой в ​​SDL, которую мы только что исправили:

https://hg.libsdl.org/SDL/rev/aa4e4768c6c1

Это исправление будет в SDL 2.0.4 и вскоре после этого должно появиться в Unreal.

person Ryan C. Gordon    schedule 31.05.2015