如何编写透明的WebKit GTK应用程序

时间:2012-08-10 08:03:07

标签: webkit gtk xfce

我正在尝试编写一个GTK应用程序,其中只包含一个GTK WebKit视图。我希望WebKit视图是透明的,因此可以查看下面的窗口,这个功能是有意的。

我发现“Is it possible to render web content over a clear background using WebKit?”中的答案适用于我的一台PC,它运行带有compiz的Ubuntu,但不适用于使用xfwm4运行Debian的另一台机器人。在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()

此应用程序显示带有红色边框的透明块。所以,我猜我的Debian with Xfwm4(版本4.8.3-1)应该支持合成。

有人知道为什么我的GTK应用程序不透明吗?

===============

更新: 我发现问题出在libwebkit中,而不是在窗口管理器中。这两个系统中的libwebkit版本是不同的,我尝试了我的应用程序另一个xfwm4环境,透明度有效。

0 个答案:

没有答案