2010-02-11 14 views
7

Quiero ser capaz de renderizar en una ventana X solo con su ID.¿Puedo hacer que una ventana X11 sea compatible con OpenGL después de haber sido creada?

En este caso tengo una ventana creada en python por gtk.

Puedo obtener la identificación de la ventana de gtk.Drawable y pasarla a mi módulo C python, pero ¿puedo entonces hacer que las llamadas OpenGL le rindan?

Conozco gtkglext, pero preferiría no usarlo si es posible.

Actualización 1:

Ok, así que (y no, obviamente, ahora que lo veo) Usted acaba de hacer un XCreateWindow con un padre de la ventana Identificación del que se obtiene de gtk.window.xid, usando las banderas correctas para un OpenGL ventana, y listo.

El único problema es que no puedo hacer que funcione si no hay varios widgets en la ventana, de lo contrario, parece que el xid representa una ventana que cubre toda la ventana de nivel superior. No estoy seguro de cómo rectificar esto.

Actualización 2: Resulta que si usted tiene una ventana gl que es del mismo tamaño que el de nivel superior y luego la ventana de nivel superior no conseguirá exponer los acontecimientos hasta que la ventana gl tiene sus tampones intercambiado. Solo tienes que seguir intercambiando los buffers y las cosas estarán bien.

Actualización 3:

Para contestar el comentario de @ babele:

This page en el pitón docs GTK decir cómo hacer que una ventana GTK de un XID existente. Después de eso, solo tienes que recordar que sigas llamando al glXSwapBuffers para esa ventana (si es una ventana abierta de OpenGL, de lo contrario, debería funcionar cuando uses window_foreign_new).

Así que el proceso va:

  1. crear un widget GTK que contendrá la ventana de OpenGL (un DrawingArea es una buena opción - no se puede utilizar por ejemplo una etiqueta, ya que no tendrá su propio XID)
  2. Obtener el widget de gtk.gdk.Window (docs)
  3. Obtener el XID del gtk.gdk.Window (llamar esta ventana W1)
  4. pasarlo a la carpeta C/C++ código
  5. Crear el opengl viento capaz ow (W2) como hijo de W1
  6. Pase el XID de W2 de nuevo a pitón
  7. Use window_foreign_new con XID de W2 para crear el nuevo objeto gtk.gdk.Window
  8. Cada vez que llame glXSwapBuffers en GTK W2 debe luego, ser capaz de reaccionar para exponer eventos.

Un bit que realmente me impresionó es que si W2 cubre la totalidad de W1, W1 no recibirá eventos hasta que los búferes de W2 se intercambien. Esto es particularmente confuso si W1 es una ventana de nivel superior, ya que es posible que no aparezca nada en la pantalla (la ventana está allí, pero se ve como lo que está detrás de ella hasta que se pinta, lo que no sucederá hasta que obtiene un evento de exposición).

También tenga en cuenta que deberá gestionar manualmente el redimensionamiento de W2 conectándose a los eventos de redimensionamiento gtk. Puede hacerlo conectándose al this signal, luego llamando al this function en el controlador y pasando los resultados a su módulo c/C++ donde puede cambiar el tamaño de W2 de manera apropiada. Es una buena idea para request a minimum size.

+0

"He encontrado la manera de hacer que gtk administre una ventana que se creó manualmente usando XCreateWindow" ... POR FAVOR, ¿puede explicarme un poco más cómo hacerlo? Estoy buscando un fragmento similar pero no puedo encontrar nada. Solo una descripción aproximada :) THX! –

Respuesta

6

No es necesario crear una nueva ventana, se pasa una ventana existente a glXMakeCurrent().
En su configuración actual que había necesidad de:

  1. XGetWindowAttributes() para recuperar el visual de la ventana fue creada con
  2. glXCreateContext() el uso de esta visual
  3. glXMakeCurrent() usando este contexto y la ID de ventana

Sin embargo, esto lo está haciendo hacia atrás, forzando a OpenGL a usar el visual usado para CreateWindow. Esto a menudo funciona porque la vista por defecto tiene propiedades sanas de GLX, pero una aplicación correcta mostrará glXChooseVisual con las propiedades deseadas de GLX, y luego usará esa vista para crear la ventana.

+0

¿Qué pasa con XSetWindowAttributes para cambiar Visual de la ventana a una OpenGL adecuada? Funcionaría eso ? – Loomchild

+0

Quise decir XChangeWindowAttributes, por supuesto. – Loomchild

+1

XChangeWindowAttributes no puede cambiar Visual de una ventana. Necesita crear la ventana el Visual deseado. –

Cuestiones relacionadas