我为SDL2文本事件处理编写了一个测试程序,当我专注于SDL2创建的窗口时,无法打开输入法。
我正在使用Xfce桌面和Fcitx输入法引擎在Linux上进行测试。
代码很简单:
#include <SDL.h>
int main(int argc, char** argv)
{
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_EVENTS);
SDL_Window* window = SDL_CreateWindow("sdl text test", 50, 50, 400, 400, SDL_WINDOW_OPENGL);
SDL_StartTextInput();
while (1)
{
// process events
SDL_Event event{};
bool should_exit = false;
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
should_exit = true;
break;
case SDL_TEXTEDITING:
printf("text edit: %s %d %d\n", event.edit.text, event.edit.start, event.edit.length);
break;
case SDL_TEXTINPUT:
printf("text input: %s\n", event.text.text);
break;
}
}
if (should_exit) break;
SDL_Delay(20);
}
SDL_StopTextInput();
}
我简要介绍了SDL2的文档,但未能找到与键盘抓取相关的任何内容。
答案 0 :(得分:1)
尝试删除
SDL_windowskeyboard.c的函数videodata->ime_uilesss = UILess_SetupSinks(videodata);
中的 IME_Init
。
这很难看,但很有效。
如果videodata->ime_uiless
== SDL_False
,
然后windows将显示输入法
否则sdl2将呈现并显示输入法。
答案 1 :(得分:1)
我正在使用Windows 10 + SDL并且正在考虑在Windows下对IME的SDL支持,并且不知道考虑到在SDL代码库中永远不会调用IME_Render / IME_Present函数它是如何工作的。
使用#define编译SDL SDL_windowskeyboard.c中的SDL_DISABLE_WINDOWS_IME为我修复了它(xwang的建议将导致类似的结果)。
答案 2 :(得分:1)
我不知道为什么,但是它可以解决问题:自己构建SDL2 。
我曾经使用过Ubuntu apt repo libsdl2-dev/bionic-updates,now 2.0.8+dfsg1-1ubuntu1.18.04.1 amd64
附带的SDL2。无法显示或切换IME。
在我用自己构建的SDL2 lib(相同的版本2.0.8)替换后,IME运行良好。