我目前正在尝试在运行X服务器但没有窗口管理器的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-server生成,如下所示:
FocusIn/FocusOut not generated
通过添加以下内容在SDL_x11windows.c中攻击X11_RaiseWindow()之后:
X11_XSetInputFocus(display,data-> xwindow,RevertToParent,CurrentTime); SDL_SetKeyboardFocus(DATA->窗口);
能够最终处理键盘事件。
上述评估听起来是否正确?如果是这样,有一个干净的解决方案吗?我还在四处寻找,但任何建议都会受到高度赞赏。
由于
答案 0 :(得分:0)
这证明是SDL中的一个错误,我们只是推动了修复:
https://hg.libsdl.org/SDL/rev/aa4e4768c6c1
此修复程序将在SDL 2.0.4中,并且此后不久就应该冒泡到Unreal。