2010-12-01 76 views
6

我试着用C++ & X11创建一个完全透明的窗口。它不应该消耗任何事件,只是将它们转发到下面的窗口。某种GlassPane,因为它以Java-Windows而闻名,但是全屏。然后我想在这个窗口上画画。X11/Xlib:创建“GlassPane”-Window

这是X11的某种可能吗?

我的第一次尝试忽略了所有事件,只需使用XGetImage()从根窗口复制图像......但首先,这是非常缓慢的,因为窗口需要全屏显示。 XShmGetImage不幸的是这里不是一个选项。

当然,这个窗口不需要任何装饰,但这不是一个大问题。

如何仅使用X11/Xlib执行此操作?如果这是不可能的,我还需要什么?

任何帮助表示赞赏!

PS:Xinerama已激活以及Compiz,如果出现问题,我可能会停用它们。

回答

5

您可以通过将其输入形状设置为空来创建输出窗口窗口。

API是XFixesSetWindowShapeRegion(),您可以从ShapeBounding分开设置ShapeInputXFixesCreateRegion()用于获取的区域中通过。

然后,你需要的RGBA(具有-α-通道)视觉所以可以绘制的透明像素到最窗口。

A 合成窗口管理器将需要为了使透明度工作。

+0

至于事件,带有ShapeInput空白区域的XFixesSetWindowShapeRegion工作。好点,谢谢! – Atmocreations 2010-12-03 10:25:50

4

您需要在您的X服务器中为此覆盖可视化支持,否则性能将绝对糟糕,因为您必须不断地映射/取消映射窗口和/或始终进行get/putimage舞蹈。

您必须拥有主/根平面非叠加层,并在其上创建叠加层视觉效果。覆盖层平面中的所有内容都将通过“主屏幕”。如何做到这一点的“普通X”

文档是很稀疏,更简单的方法是通过OpenGL/GLX,http://www.opengl.org/sdk/docs/man/xhtml/glXChooseVisual.xml - 只需尝试:

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

,那么你应该能够清除窗口使“主根”可见,并将其用于掩饰它。在“旧时代”中,叠加层经常被要求为非RGB(颜色索引/ palettized)视觉,而色度键控用于透明部分。 OpenGL的RGBA应该支持通过alpha通道的透明度/混合,虽然...

我还没有尝试过,我目前的framebuffer不支持覆盖。 Nvidia在他们的X11驱动程序/他们的配置文件的文档中提到他们,因此我认为他们仍然在,并仍然可以用这种方式。