4

我正在尝试编写一个 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环境下尝试了我的应用程序,透明工作。

4

0 回答 0