我尝试使用C ++& amp;创建一个完全透明的窗口。 X11。它不应该消耗任何事件,只是将它们转发到下面的窗口。某种类型的GlassPane,因为它以Java-Windows而闻名,但是全屏。然后我想在这个窗口画画。
X11在某种程度上是否可行?
我的第一次尝试是忽略所有事件,只需使用XGetImage()
从根窗口复制图像......但首先,这是非常慢的,因为窗口需要全屏。遗憾的是,XShmGetImage
不是此选项。
当然,这个窗口不需要任何装饰,但这不是一个大问题。
如何仅使用X11 / Xlib执行此操作?如果不可能,我还需要什么呢?
感谢任何帮助!
PS:Xinerama
已激活,Compiz
已激活,如果出现问题,我可以将其停用。
答案 0 :(得分:5)
您可以通过将其输入形状设置为空来创建仅输出窗口。
API为XFixesSetWindowShapeRegion()
,您可以将ShapeInput
与ShapeBounding
分开设置。 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驱动程序/他们的配置文件的文档中提到了它们,因此我假设它们仍然存在,并且仍然可以这种方式使用。