我想能够只给出它的id渲染到X Window.
在这种情况下,我有一个由gtk在python中创建的窗口.
我可以获取a的窗口ID gtk.Drawable并将其传递到我的C python模块中,但是我可以将OpenGL调用渲染到它吗?
我知道gtkglext,但如果可能的话宁愿不使用它.
更新1:
好吧,所以(现在很明显我已经看到了)你只需要XCreateWindow使用你得到的Window id的父级gtk.window.xid,使用opengl窗口的正确标志,然后嘿presto.
唯一的问题是如果窗口中没有多个小部件,我无法使其工作,否则似乎xid代表一个覆盖整个顶层窗口的窗口.不知道如何纠正这个问题.
更新2: 事实证明,如果你有一个与顶层大小相同的gl窗口,那么在gl窗口交换缓冲区之前,顶层窗口不会暴露事件.你只需要保持交换缓冲区,事情就好了.
更新3:
要回答@ babele的评论:
python gtk文档中的这个页面说明了如何从现有的xid创建一个gtk窗口.之后你只需记住继续为该窗口调用glXSwapBuffers(如果它是一个opengl缓冲窗口,否则它应该在你使用window_foreign_new时工作).
所以过程如下:
真正让我感到震惊的是,如果W2覆盖整个W1,那么W1将不会接收事件,直到W2的缓冲区被交换.如果W1是一个顶级窗口,这尤其令人困惑,因为它可能根本就没有任何东西出现在屏幕上(窗口就在那里,但它看起来就像它背后的任何东西,直到它被绘制,这不会发生,直到它得到曝光事件).
另请注意,您必须通过连接到gtk resize事件手动管理W2的大小调整.您可以通过连接到此信号,然后在处理程序中调用此函数并将结果传递到c/c ++模块来执行此操作,您可以在其中适当地调整W2的大小.请求最小尺寸是个好主意.
您不需要创建新窗口,将现有窗口传递给glXMakeCurrent().
在您当前的设置中,您需要:
但是,这是向后做的,迫使OpenGL使用CreateWindow使用的视觉效果.这通常有效,因为默认的视觉效果具有理智的GLX属性,但正确的应用程序将glXChooseVisual具有所需的GLX属性,然后使用该视觉创建窗口.