Я хочу смочь представить к X Window, данному просто его идентификатор.
В этом случае мне создал окно в Python gtk.
Я могу получить окно ID a gtk.Drawable
и передайте его в мой модуль Python C, но я могу затем сделать рендеринг вызовов OpenGL к нему?
Я знаю о gtkglext, но не использовал бы его, если это возможно.
Обновление 1:
Хорошо, таким образом (скорее, очевидно теперь, когда я вижу его) Вы просто делаете XCreateWindow
с родителем идентификатора Окна, от которого Вы добираетесь gtk.window.xid
, использование корректных флагов для opengl окна, и эй престо.
Единственная проблема, я не могу заставить ее работать, если нет нескольких виджетов в окне, иначе кажется, что xid представляет окно, которое покрывает все окно верхнего уровня. Не уверенный, как исправить это.
Обновление 2: оказывается, что, если у Вас есть окно глоссария, которое является тем же размером как верхний уровень затем, окно верхнего уровня не доберется, выставляют события, пока окну глоссария не подкачали его буферы. Просто необходимо продолжать подкачивать буферы и вещи wil быть прекрасными.
Обновление 3:
Ответить на комментарий @babele:
Эта страница в Python gtk документы говорит, как сделать gtk окно из существующего xid. После этого Вы просто имеете к remeber, чтобы продолжать называть glXSwapBuffers для того окна (если это - буферизованное окно opengl, иначе это должно просто работать при использовании window_foreign_new).
Таким образом, процесс идет:
Один бит, который действительно бросил меня, - то, что, если W2 покрывает весь W1 затем, W1 не получит события, пока буферы W2 не будут подкачаны. Это особенно сбивает с толку, если W1 является окном верхнего уровня, поскольку может случиться так, что ничто не появляется на Вашем экране вообще (окно там, но это похоже на то, что находится позади него, пока это не красится к, которого не произойдет, пока это не получит выставить событие).
Также обратите внимание, что необходимо будет вручную справиться, изменение размеров W2 путем соединения с gtk изменяют размер событий. Можно сделать это путем соединения с этим сигналом, затем вызывания этой функции в обработчике и передачи результатов c/c ++ модуль, где можно изменить размер W2 соответственно. Это - хорошая идея запросить минимальный размер.
Вам не нужно создавать новое окно, вы передаете существующее окно в glXMakeCurrent().
В вашей текущей настройке вам нужно:
Однако это делает все наоборот, заставляя OpenGL использовать визуал, используемый для CreateWindow. Это часто работает, потому что визуал по умолчанию имеет нормальные свойства GLX, но правильное приложение будет glXChooseVisual с желаемыми свойствами GLX, а затем использовать этот визуал для создания окна.