4

GTKWebKitビューを含むGTKアプリケーションを作成しようとしています。WebKitビューが透明であることを願っています。そのため、下のウィンドウを表示できます。この機能は意図されています。

「 WebKitを使用してクリアな背景にWebコンテンツをレンダリングすることは可能ですか? 」で答えを見つけました。compizでUbuntuを実行しているPCのいずれかで動作しますが、xfwm4でDebianを実行している別の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にあることがわかりました。これら2つのシステムのlibwebkitのバージョンは異なり、アプリケーションを別のxfwm4環境で試しましたが、透過性が機能します。

4

0 に答える 0