我希望能够仅给出窗口ID,即可渲染到一个X Window上。
在这种情况下,我已经通过gtk在python中创建了一个窗口。
我可以获得
我知道有gtkglext,但如果可能的话,我不想使用它。
更新1:
好吧,现在(显然)你只需使用正确的标志对具有父窗口ID的
唯一的问题是,如果窗口中没有多个小部件,则无法使其正常工作,否则似乎xid表示覆盖整个顶级窗口的窗口。 不确定如何纠正此问题。
更新2:
原来,如果您拥有与toplevel相同大小的gl窗口,则toplevel窗口将在gl窗口切换缓冲区之前不会接收到暴露事件。 您只需要不断交换缓冲区,问题就会得到解决。
更新3:
此外,请注意您必须手动管理W2的调整大小,方法是连接到gtk resize事件。您可以通过连接到 this signal,然后在处理程序中调用this function并将结果传递给您的c / c ++模块,在那里您可以相应地调整W2的大小。建议request a minimum size。
在这种情况下,我已经通过gtk在python中创建了一个窗口。
我可以获得
gtk.Drawable
的窗口ID,并将其传递到我的C Python模块中,但是我能否进行OpenGL调用来渲染它?我知道有gtkglext,但如果可能的话,我不想使用它。
更新1:
好吧,现在(显然)你只需使用正确的标志对具有父窗口ID的
XCreateWindow
进行操作,并呈现OpenGL调用。唯一的问题是,如果窗口中没有多个小部件,则无法使其正常工作,否则似乎xid表示覆盖整个顶级窗口的窗口。 不确定如何纠正此问题。
更新2:
原来,如果您拥有与toplevel相同大小的gl窗口,则toplevel窗口将在gl窗口切换缓冲区之前不会接收到暴露事件。 您只需要不断交换缓冲区,问题就会得到解决。
更新3:
回答@babele的评论:
这个页面在Python GTK文档中说明了如何从现有的xid创建一个GTK窗口。之后,您只需要记得为该窗口继续调用glXSwapBuffers(如果它是一个OpenGL缓冲窗口,否则当您使用window_foreign_new时它应该可以正常工作)。
因此,整个过程如下:
- 创建一个gtk小部件,其中包含您的OpenGL窗口(DrawingArea是一个不错的选择 - 您不能使用标签,因为它没有自己的xid)
- 获取小部件的gtk.gdk.Window(docs)
- 从gtk.gdk.Window获取xid(将此窗口称为W1)
- 将其传递给您的C / C ++代码
- 将支持opengl的窗口(W2)创建为W1的子项
- 将W2的xid传回python
- 使用W2的xid调用window_foreign_new以创建新的gtk.gdk.window对象
- 每次在W2上调用glXSwapBuffers时,gtk应该能够响应暴露事件。
此外,请注意您必须手动管理W2的调整大小,方法是连接到gtk resize事件。您可以通过连接到 this signal,然后在处理程序中调用this function并将结果传递给您的c / c ++模块,在那里您可以相应地调整W2的大小。建议request a minimum size。