对于 3D 建模项目,我使用 SDL 并包含在 GTK 小部件中(感谢 [GTKSDL],http ://gtksdl.sourceforge.net “直接链接到 GTKSDL”)。
小部件只是使用 GTK 加载 .obj 文件并使用 OpenGL 对其进行建模,然后将其显示在 SDL 小部件中。到目前为止,一切正常。
当我尝试使用 SDL 事件移动小部件中的对象时,问题就出现了。在 GTK 中集成 SDL 窗口之前,事件可以正常工作。此外,一旦显示 3D 模型,我就无法与 GTK 交互,因为显然 SDL 的事件循环正在等待某些东西,而无论我做什么,它都没有得到它。
我曾想过分叉这两个事件循环,但似乎 GTK 和 SDL 试图同时访问 X 服务器,这会产生多个冲突。我试图删除 SDL 中的无限循环,但它也不起作用。
我在 Devian,我在互联网上搜索了“GTKSdl”的实现,但它似乎已经过时了,有什么想法可以修补它吗?
更新:
我已经在使用 SDLPollEvent 和 g_idle add。因此,在我选择了一个文件(使用 GTK)之后,我填充了 struct "t_stage" 并使用 g_idle_add :
g_idle_add((GSourceFunc) &mainloop, stage);
gboolean mainloop(t_stage *stage)
{
SDL_Event evt;
while (SDL_PollEvent(&evt) != 0)
{
if (evt.type == SDL_MOUSEBUTTONDOWN)
on_mouse_down(stage, &(evt.button));
else if (evt.type == SDL_MOUSEBUTTONUP)
on_mouse_up(stage, &(evt.button));
else if (evt.type == SDL_MOUSEMOTION)
on_mouse_move(stage, &(evt.motion));
else if (evt.type == SDL_KEYDOWN)
handle_key(stage, evt.key.keysym.sym, 1);
else if (evt.type == SDL_KEYUP)
handle_key(stage, evt.key.keysym.sym, 0);
}
apply_keys(stage);
draw(stage, 0);
return (1);
}
但事件仍未收到。有任何想法吗 ?