无法在SDL2创建的窗口上打开输入法

时间:2015-07-04 10:02:36

标签: sdl-2 ime

我为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的文档,但未能找到与键盘抓取相关的任何内容。

3 个答案:

答案 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运行良好。