如何同时使用 GTK 和 glut

How do I use GTK and glut together?

本文关键字:glut GTK 何同时      更新时间:2023-10-16

我知道为了编写一个 GTK 应用程序,我编写了一堆代码来描述主窗口中放置的内容,然后我调用:

gtk_main();

在此之后的任何代码语句都不会被执行。

现在让我们假设我希望我的 GTK 应用程序显示我用 glut 编写的内容,它本身包含一堆关于需要设置哪些图形等的语句,然后以语句结尾:

glutMainLoop();

在此之后的任何内容都不会执行。

所以我的问题是这两个陈述中的任何一个都阻止我调用另一个。

  1. 有没有办法在 GTK 小部件中执行 glut 主循环?
  2. 有没有办法编写一个代码,可以以某种方式同时调用 GTK 主循环和 glut 主循环(但从主程序调用并在单独的 X 窗口中呈现,而不是在小部件中(?我有一种感觉,这可以通过"线程"来完成......

你没有。通常没有意义。

GLUT是一个用于创建和管理OpenGL窗口的库。GTK已经有一个OpenGL窗口。如果您使用的是GTK,那么使用GLUT就没有意义了。这就像有两个向量数学库或其他东西。

您正在运行主循环。 gtk_main()一直运行到调用gtk_quit()

gtk_main(( 在 GTK.org

运行主循环,直到调用gtk_main_quit()。您可以将调用嵌套到 gtk_main((。在这种情况下,gtk_main_quit(( 将进行主循环返回的最内层调用。

此外,glutMainLoop()的工作方式相同,它会永远处理 GL 事件。

glutMainLoop(( at OpenGL.org

glutMainLoop()进入 GLUT 事件处理循环。此例程在 GLUT 程序中最多应调用一次。一旦调用,此例程将永远不会返回。它将根据需要调用已注册的任何回调。

所以

,你不想同时执行这两件事(我认为它们可能会相互干扰,所以你可能会得到意想不到的结果(,那么你将需要从内部调用gtk_main_iteration()

gtk_main_iteration(( 在 GTK.org

运行主循环的单个迭代。如果没有事件等待处理,GTK+ 将阻塞,直到注意到下一个事件。如果您不想阻止,请先查看 gtk_main_iteration_do(( 或检查是否有任何事件挂起 gtk_events_pending((。

现在。。GLUT没有等效的gtk_main_iteration()因此您需要注册GLUT回调。

您可以使用 GLUT 注册一个回调,该回调使用 glutIdleFunc(void (*func)(void)) 运行gtk_main_iteration(),它将为每个帧运行一个回调 - glutIdleFunc((。

或者你可以给glutTimerFunc(unsigned int msecs, void (*func)(int value), value)一个回调,每 200 毫秒左右调用并检查一次 gtk_main_iteration() 的返回值。

我可能会尝试两者,glutIdleFunc()可能并不总是经常被打电话以获得良好的响应能力。

不过,推动GTK的GL支持确实值得一看。