我目前正在尝试在没有窗口管理器的Linux armv7嵌入式系统上运行使用SDL2的UnrealEngine4演示应用程序。
我发现该应用程序对于键盘事件不响应,但鼠标可以正常工作。进一步研究后发现问题在于,如果SDL_Event.key.windowID与应用程序的SDL_Window的ID不匹配,UE4会忽略键盘事件。通过调用SDL_GetKeyboardFocus()进行验证,得知键盘焦点的窗口ID为0,而应用程序窗口的ID为5。
在SDL2内部进一步深入研究后,发现在从X服务器接收到focusIn事件后,键盘焦点被设置为特定的SDL窗口(请参见SDL_x11events.c中的X11_DispatchEvent())。
然而,如果您在没有窗口管理器的情况下运行X11,则此focusIn事件永远不会由X服务器生成,如此处所述: FocusIn/FocusOut not generated 在SDL_x11windows.c中添加X11_RaiseWindow()后,问题得以解决。
我发现该应用程序对于键盘事件不响应,但鼠标可以正常工作。进一步研究后发现问题在于,如果SDL_Event.key.windowID与应用程序的SDL_Window的ID不匹配,UE4会忽略键盘事件。通过调用SDL_GetKeyboardFocus()进行验证,得知键盘焦点的窗口ID为0,而应用程序窗口的ID为5。
在SDL2内部进一步深入研究后,发现在从X服务器接收到focusIn事件后,键盘焦点被设置为特定的SDL窗口(请参见SDL_x11events.c中的X11_DispatchEvent())。
然而,如果您在没有窗口管理器的情况下运行X11,则此focusIn事件永远不会由X服务器生成,如此处所述: FocusIn/FocusOut not generated 在SDL_x11windows.c中添加X11_RaiseWindow()后,问题得以解决。
X11_XSetInputFocus(显示器,数据->xwindow,RevertToParent,CurrentTime); SDL_SetKeyboardFocus(data->window);
现在可以最终处理键盘事件。
以上评估是否正确?如果是,是否有干净的解决方案?我仍在探索中,但任何建议都将不胜感激。
谢谢