我已经尝试使用C++ & X11创建一个完全透明的窗口。它不应该使用任何事件,而只是将它们转发到下面的窗口。某种类型的GlassPane,因为它是Java-视窗,但全屏。那我想在这个窗子上画画。
使用X11,这是不是可能的?
我的第一个尝试是忽略所有事件,只需使用XGetImage()从根窗口复制图像...但首先,这是相当慢的,因为窗口需要全屏显示。不幸的是,XShmGetImage在这里不是一个选择。
当然,这个窗口不需要任何装饰,但这不是一个大问题。
如何仅使用X11 / Xlib来完成此操作?如果不可能,我还需要什么?
如有任何帮助,我们不胜感激!
PS:Xinerama和Compiz都被激活了,如果这带来了问题,我可以停用它们。
发布于 2010-12-02 03:01:56
可以通过将窗口的输入形状设置为空来创建仅输出窗口。
接口为XFixesSetWindowShapeRegion(),可以单独设置ShapeInput和ShapeBounding。XFixesCreateRegion()用于获取要传入的地域。
然后你需要一个RGBA (with-alpha-channel)视觉效果,这样你就可以在大部分窗口中绘制透明的像素。
为了使透明度正常工作,需要一个合成窗口管理器。
发布于 2010-12-02 01:13:39
您需要在您的X Server中提供覆盖可视化支持,否则性能将非常糟糕,因为您必须不断地映射/取消映射窗口和/或一直执行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驱动程序/配置文件的文档中提到了它们,因此我认为它们仍然存在,并且仍然可以以这种方式使用。
发布于 2021-09-16 01:47:04
Xlib/X11有一个原子可以很好地执行这个任务:"_NET_WM_WINDOW_OPACITY“
void ApplyAlpha (Display* display, Window window, byte Alpha)
{
int Alpha_;
//
Alpha_ = Alpha | Alpha << 8 | Alpha << 16 | Alpha << 24;
if (Alpha == 0xFF)
XDeleteProperty (display, window, XInternAtom (display, "_NET_WM_WINDOW_OPACITY", 0));
else
XChangeProperty (display, window, XInternAtom (display, "_NET_WM_WINDOW_OPACITY", 0),
XA_CARDINAL, 32, PropModeReplace, (byte *) &Alpha_, 1);
}https://stackoverflow.com/questions/4326534
复制相似问题