我需要一些代码来制作我的窗口(最好是所有小部件)半透明。我知道我可以使用gtk_window_set_opacity(),但只有在复合管理器运行时它才有效,但如果没有呢?我搜索过很多,发现很多代码甚至不能编译,不起作用或只是一个概念证明。没有充实的解决方案。我不想乱用X11 Xlib糟糕的API(我只是没时间学习它)。
从哪里获得这样的库/代码片段?
对此没有好的答案(这是合成管理者发明的一个很好的部分)。如果你已经可以做到这一点,人们就不会发明整个合成管理器机制。
在旧的“透明终端”等中使用的唯一答案是基于在窗口下方制作屏幕截图,然后在您自己的窗口中绘制屏幕截图。这是一个涉及Xlib的混乱,很难获得大部分正确,不可能完全正确,并且效率低下。不过,你也许可以这样做。看看支持透明度的终端的旧版本,我认为VTE曾经有过这个代码,ZVT小部件肯定做到了。例如,启蒙终端也是如此。
但真正的方法是回归到没有CM的用户没有透明度。
虽然现代X11服务器确实支持RGBA视觉效果,但这并不意味着它们会进行alpha混合。 X11在模型上运行,窗口是单个共享帧缓冲区的掩码。 Z排序可能会剪切窗口的某些部分,因此根本不会绘制这些区域。
要启用透明度,合成管理器必须将窗口重定向到离屏渲染,然后从屏幕外渲染的部分组合您在屏幕上看到的最终图像。 XDamage扩展用于跟踪哪些窗口需要重新合成。