Я могу сделать окно X11 OpenGL способный после того, как он был создан?

Я хочу смочь представить к 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).

Таким образом, процесс идет:

  1. Создайте gtk виджет, который будет содержать Ваше окно OpenGL (DrawingArea является хорошим выбором - Вы не можете использовать, например, маркировка, поскольку он не будет иметь своего собственного xid),
  2. Получите gtk.gdk виджета. Окно (документы)
  3. Получите xid от gtk.gdk. Окно (называют это окно W1),
  4. Передайте его своему коду C/C++
  5. Создайте opengl способное окно (W2) как ребенка W1
  6. Пасуйте назад xid W2 к Python
  7. Используйте window_foreign_new с xid W2 для создания нового объекта gtk.gdk.window
  8. Каждый раз, когда Вы звоните, glXSwapBuffers на W2 gtk должен затем смочь реагировать для представления событий.

Один бит, который действительно бросил меня, - то, что, если W2 покрывает весь W1 затем, W1 не получит события, пока буферы W2 не будут подкачаны. Это особенно сбивает с толку, если W1 является окном верхнего уровня, поскольку может случиться так, что ничто не появляется на Вашем экране вообще (окно там, но это похоже на то, что находится позади него, пока это не красится к, которого не произойдет, пока это не получит выставить событие).

Также обратите внимание, что необходимо будет вручную справиться, изменение размеров W2 путем соединения с gtk изменяют размер событий. Можно сделать это путем соединения с этим сигналом, затем вызывания этой функции в обработчике и передачи результатов c/c ++ модуль, где можно изменить размер W2 соответственно. Это - хорошая идея запросить минимальный размер.

7
задан Kev 23 January 2011 в 15:22
поделиться

1 ответ

Вам не нужно создавать новое окно, вы передаете существующее окно в glXMakeCurrent().
В вашей текущей настройке вам нужно:

  1. XGetWindowAttributes() для получения визуала, с которым было создано окно
  2. glXCreateContext() с использованием этого визуала
  3. glXMakeCurrent() с использованием этого контекста и идентификатора окна

Однако это делает все наоборот, заставляя OpenGL использовать визуал, используемый для CreateWindow. Это часто работает, потому что визуал по умолчанию имеет нормальные свойства GLX, но правильное приложение будет glXChooseVisual с желаемыми свойствами GLX, а затем использовать этот визуал для создания окна.

6
ответ дан 7 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: