2010-12-01 15 views
6

He intentado crear una ventana completamente transparente usando C++ & X11. No debería consumir ningún evento y simplemente reenviarlos a las ventanas a continuación. Algún tipo de GlassPane, como se lo conoce por Java-Windows, pero a pantalla completa. Entonces me gustaría dibujar en esta ventana.X11/Xlib: Crear "GlassPane" -Window

¿Esto de alguna manera es posible con X11?

Mi primer intento fue ignorar todos los eventos, simplemente copie la imagen de la ventana raíz usando XGetImage() ... Pero antes que nada, esto es bastante lento ya que la ventana debería estar a pantalla completa. XShmGetImage lamentablemente no es una opción aquí.

Por supuesto, esta ventana no necesitaría ninguna decoración, pero eso no es un gran problema.

¿Cómo hacer esto solo con X11/Xlib? Si no es posible, ¿qué más necesito?

¡Se agradece cualquier ayuda!

PS: Xinerama está activado, así como Compiz, si eso trae problemas podría vivir para desactivarlos.

Respuesta

5

Puede crear una ventana solo de salida configurando su forma de entrada como vacía.

La API es XFixesSetWindowShapeRegion() y puede establecer ShapeInput por separado desde ShapeBounding. XFixesCreateRegion() se utiliza para obtener una región que pasar en.

Luego hay una RGBA (con alfa-canal) visual para poder dibujar los píxeles transparentes en la mayor parte de la ventana.

A composición administrador de ventanas será necesario para que la transparencia funcione.

+0

en cuanto a los eventos, XFixesSetWindowShapeRegion con una región vacía para trabajos de ShapeInput. Buen punto, gracias! – Atmocreations

+0

Otra pregunta al respecto: ¿Puedo interceptar de alguna manera el evento (recibir notificaciones) pero no consumirlo, es decir, la ventana a continuación también recibe el evento? Adivina con XFixesSetWindowShapeRegion() para ShapeInput, esto puede no funcionar, ¿verdad? ¡Gracias! – Atmocreations

+1

no hay manera de "fisgonear" eventos en este momento hasta donde yo sé, por desgracia. –

4

Necesita soporte visual superpuesto para esto en su Servidor X, o de lo contrario el rendimiento será absolutamente abismal, ya que tendría que mapear/desasignar continuamente su ventana y/o hacer la danza get/putimage todo el tiempo.

Debe tener el plano principal/raíz no superpuesto y crear una superposición visual sobre eso. Todo lo que está claro en el plano de superposición pasará la "pantalla principal".

Documentación sobre cómo hacer esto de "plano X" es muy escasa, la manera más simple sería a través de OpenGL/GLX, http://www.opengl.org/sdk/docs/man/xhtml/glXChooseVisual.xml - simplemente tratar:

int query[] = { /* GLX_RGBA, */ GLX_LEVEL, 1, 0 }; 
overlayVisual = glXChooseVisual(mydisplay, DefaultScreen(mydisplay), query); 
myWindow = XCreateWindow(..., overlayVisual, ...); 

entonces debería ser capaz de limpiar la ventana para hacer visible la "raíz principal" y dibujar en ella para cubrirla. En los "tiempos antiguos" a menudo se requería que la superposición fuera una visual no RGB (color indexado/paletizado) y se utilizaba la incrustación de croma para las partes transparentes. OpenGL RGBA debería admitir transparencia/mezcla a través del canal alfa, aunque ...

No lo he intentado, mi framebuffer actual no admite superposiciones. Nvidia los menciona en la documentación de sus controladores de X11/sus archivos de configuración, por lo tanto, supongo que todavía están disponibles y aún se pueden usar de esta manera.