【问题标题】:Embedding SDL into GTK+将 SDL 嵌入 GTK+
【发布时间】:2011-11-16 02:12:11
【问题描述】:

我有一个应用程序使用 GTK+ 显示一些不错的 GUI,但我使用 SDL 在 GTK+ 中显示一个小的 RGB 帧缓冲区

我使用以下代码将 SDL 导入 GTK+:

char SDL_windowhack[32];
sprintf(SDL_windowhack, "SDL_WINDOWID=%ld", GDK_WINDOW_XWINDOW(deviceWindow->window));
putenv(SDL_windowhack);

不幸的是,我也将 SDL 用于键盘和鼠标事件。使用 SDL 更新图像的主线程产生以下线程:

void *SDLEvent(void *arg)
{
    SDL_Event event;

    while (1) {
        fprintf(stderr, "Test\n");
        SDL_WaitEvent(&event);
        switch (event.type) {
            /* ... */
        }
    }
}

我看到打印语句执行了两次,然后没有。一旦我终止 SDL 用来更新屏幕(显示)的线程,SDLEvent 中的循环就会再次开始快速执行。

在我将 SDL 集成到 GTK+ 之前,这段代码可以正常工作,所以我认为 GTK+ 可能会在某些方面阻止 SDL?

请问大家有什么建议吗?

非常感谢!

【问题讨论】:

    标签: c sdl gtk


    【解决方案1】:

    虽然我没有使用 SDL,但是当您正在寻找事件时,您似乎正在运行两个事件循环。 Gtk 运行它自己的事件循环来处理来自鼠标和键盘的事件。我认为你需要找到一种方法来整合两者。一些谷歌搜索导致以下link 在“双事件循环问题”部分中,您的问题已得到解决(我认为)。尝试按照link 中的建议使用g_idle_addSDLEvent 函数添加为闲置函数,看看它是否有效。
    希望这会有所帮助!

    【讨论】:

    • 谢谢,这看起来是一个很棒的解决方案!它还没有完全工作,但我会摆弄它,非常感谢!
    • 我在你给我的链接上使用了“SDL_WINDOWID hack”。我刚刚看到:“您没有收到此解决方案的常见 SDL 事件。”。我想我不走运:(
    • @Jary:嗯,太糟糕了。不能使用 Gtk 事件循环中的键盘和鼠标事件吗?
    • 是的,我可以,但我有一个缺点。它涉及一些重写。主要问题是鼠标事件:SDL 是它自己的窗口,当发生鼠标单击时,我知道我可以直接读取 x 和 y 值。使用 GTK,我必须确保我在 SDL 窗口内,然后执行一些额外的计算来计算 x 和 y 值,就好像我只是在 SDL 窗口内一样。这是获得与 SDL 窗口相关的 x-y 值的主要障碍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多