【问题标题】:X11/Xlib: Create "GlassPane"-WindowX11/Xlib:创建“GlassPane”-窗口
【发布时间】:2010-12-01 16:28:28
【问题描述】:

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

这在 X11 上是否可行?

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

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

如何仅使用 X11 / Xlib 做到这一点?如果不可能,我还需要什么?

感谢任何帮助!

PS:XineramaCompiz 都已激活,如果这带来问题,我可以停用它们。

【问题讨论】:

    标签: c++ x11 xlib glasspane


    【解决方案1】:

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

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

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

    需要一个合成窗口管理器才能使透明度起作用。

    【讨论】:

    • 对于事件,带有用于 ShapeInput 的空白区域的 XFixesSetWindowShapeRegion 有效。好点,谢谢!
    • 关于这个的另一个问题:我可以以任何方式拦截事件(得到通知)但不消费它,这意味着下面的窗口也接收事件吗?用 XFixesSetWindowShapeRegion() für ShapeInput 猜测,这可能行不通,对吧?谢谢!
    • 遗憾的是,据我所知,目前无法“窥探”事件。
    • 好的。如果我需要这些事件,我会设置另一个区域......没关系。谢谢!
    【解决方案2】:

    您需要在 X Server 中对此进行叠加视觉支持,否则性能绝对会很糟糕,因为您必须不断地映射/取消映射窗口和/或一直进行 get/putimage 舞蹈。

    您必须使主/根平面不叠加,并在其上创建叠加视觉效果。覆盖平面中清晰的所有内容都会通过“主屏幕”。

    关于如何在“plain 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 驱动程序/配置文件的文档中提到了它们,因此我认为它们仍然存在,并且仍然可以以这种方式使用。

    【讨论】:

      【解决方案3】:

      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);
        }
      

      【讨论】:

        猜你喜欢
        • 2011-05-19
        • 2010-11-15
        • 2018-11-30
        • 2022-11-13
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多