我正在尝试编写一个 GTK 应用程序,其中只包含一个 GTK WebKit 视图。我希望 WebKit 的视图是透明的,所以下面的窗口可以看到,这个功能是有意的。
我在“ Is it possible to render web content over a clear background using WebKit? ”中找到了答案,它可以在我的一台运行 Ubuntu 和 compiz 的 PC 上运行,但不能在另一台运行 Debian 和 xfwm4 的 PC 上运行。在 xfwm4 上,它只是在调用时显示灰色背景webkit_web_view_set_transparent
,当我没有调用时webkit_web_view_set_transparent
,它只是显示白色背景。测试 HTML 文件在 Ubuntu 和 Debian 上是相同的。
据我了解,要使 WebKit 视图透明,我必须设置一个合成窗口管理器。
为了检查我的 xfwm4 是否支持合成,我尝试了以下代码:
import gtk
import cairo
class MainWindow(gtk.Window):
__gsignals__ = {
'expose-event': 'override'
}
def __init__(self):
super(MainWindow, self).__init__()
self.set_app_paintable(True)
# no window border
self.set_decorated(False)
# see if we can do transparency
screen = self.get_screen()
alphamap = screen.get_rgba_colormap()
rgbmap = screen.get_rgb_colormap()
if alphamap is not None:
self.set_colormap(alphamap)
else:
self.set_colormap(rgbmap)
print 'sorry, no alpha channel available :('
self.set_size_request(300, 200)
def do_expose_event(self, event):
# we're going to draw on a temporary surface
# then copy to the window surface
# you can also draw directly on the window
width, height = self.get_size()
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
ctx = cairo.Context(surface)
# background is gray and transparent
ctx.set_source_rgba(.7, .7, .7, 0.75)
ctx.paint()
# red border
ctx.set_line_width(3.0)
ctx.rectangle(0, 0, width, height)
ctx.set_source_rgba(1.0, 0.0, 0.0, .75)
ctx.stroke()
# now copy to our window surface
dest_ctx = self.window.cairo_create()
# only update what needs to be drawn
dest_ctx.rectangle(event.area.x, event.area.y,
event.area.width, event.area.height)
dest_ctx.clip()
# source operator means replace, don't draw on top of
dest_ctx.set_operator(cairo.OPERATOR_SOURCE)
dest_ctx.set_source_surface(surface, 0, 0)
dest_ctx.paint()
if __name__ == "__main__":
w = MainWindow()
w.show()
gtk.main()
此应用程序显示一个带有红色边框的透明方块。所以,我猜我的带有 Xfwm4(版本 4.8.3-1)的 Debian 应该支持合成。
有人知道为什么我的 GTK 应用程序不能透明吗?
================
更新:我发现问题出在 libwebkit 中,而不是在窗口管理器中。这两个系统中的libwebkit版本不同,我在另一个xfwm4环境下尝试了我的应用程序,透明工作。