X11 / Xlib:创建“GlassPane”-Window

时间:2010-12-01 16:28:29

标签: c++ x11 xlib glasspane

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

X11在某种程度上是否可行?

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

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

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

感谢任何帮助!

PS:Xinerama已激活,Compiz已激活,如果出现问题,我可以将其停用。

2 个答案:

答案 0 :(得分:5)

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

API为XFixesSetWindowShapeRegion(),您可以将ShapeInputShapeBounding分开设置。 XFixesCreateRegion()用于获取要传入的区域。

然后你需要一个RGBA(带有-α通道) visual ,这样你就可以在大部分窗口中绘制透明像素。

为了使透明度有效,将需要合成窗口管理器。

答案 1 :(得分: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(颜色索引/调色)视觉,并且色度键控用于透明部分。 OpenGL RGBA应该通过alpha通道支持透明度/混合,但是......

我还没试过,我目前的帧缓冲不支持叠加。 Nvidia在他们的X11驱动程序/他们的配置文件的文档中提到了它们,因此我假设它们仍然存在,并且仍然可以这种方式使用。