【问题标题】:Gtk+/X11: semitransparent windows with and without composite managers?Gtk+/X11:有和没有复合管理器的半透明窗口?
【发布时间】:2018-01-02 10:59:08
【问题描述】:
我需要一些代码来使我的窗口(最好是上面的所有小部件)半透明。
我知道我可以使用 gtk_window_set_opacity(),但它仅在复合管理器运行时才有效,但如果不是呢?
我用谷歌搜索了很多,发现很多代码大多甚至无法编译,不起作用或只是概念证明。没有令人满意的解决方案。我不想弄乱 X11 Xlib 糟糕的 API(我只是没有时间学习它)。
从哪里获得这样的库/代码 sn-p?
【问题讨论】:
标签:
c
gtk
transparency
x11
【解决方案1】:
对此没有好的答案(这是发明合成管理器的一个很好的部分)。如果你已经可以做到这一点,人们就不会发明整个合成管理器机制了。
在旧的“透明终端”等中使用的唯一一种答案是基于对窗口下方的内容进行屏幕截图,然后在您自己的窗口中绘制屏幕截图。这是一个涉及 Xlib 的混乱,很难大部分正确,不可能完全正确,而且效率低下。不过,你也许可以做到。看看支持透明度的终端的旧版本,我认为 VTE 曾经有这个代码,ZVT 小部件肯定有。例如启蒙终端也是如此。
但真正要走的路是回到没有 CM 的用户不透明的状态。
【解决方案2】:
虽然现代 X11 服务器确实支持 RGBA 视觉效果,但这并不意味着它们会进行 Alpha 混合。 X11 在模型上运行,窗口是单个共享帧缓冲区上的掩码。 Z 排序可能会剪切窗口的某些部分,因此根本不会绘制这些区域。
要启用透明度,合成管理器必须将窗口重定向到屏幕外渲染,然后从这些屏幕外渲染部分合成您在屏幕上看到的最终图像。 XDamage 扩展用于跟踪哪些窗口需要重新合成。