pygtkで遊ぼう(14ー2) 四角くないWindow(2)

先日の「四角くないWindow」、ソースコードを少し直しました。
といっても、あまり変わっていないんですが。。

変更点

・前回作ったWindowクラスの初期化関数にPNG画像のファイル名を渡すと、
 その形のウインドウになるようにしました。
・前回はsize-allocateシグナルを受けた時にウインドウにマスクを適応していましたが、
 size-allocateシグナルって結構頻繁に発生するので、初期化関数内で1度だけ
 処理するようにしました。

ソースコードはこんな感じです。

#-*- coding: utf-8 -*-

import math

import cairo
import gtk
from gtk import gdk

class ShapedWindow(gtk.Window):
    def __init__(self, imageName):
        gtk.Window.__init__(self)
        
        self.set_position(gtk.WIN_POS_CENTER)
        self.set_decorated(False)
        self.connect('delete-event', self.on_delete_event)

        img = gtk.Image()
        img.set_from_file(imageName)
        self.add(img)
        self.set_resizable(False)

        buff = img.get_pixbuf()

        self.bitmap = gtk.gdk.Pixmap(None,
                                     buff.get_width(),
                                     buff.get_height(),
                                     1)
        ca = self.bitmap.cairo_create()

        ca.set_source_rgb(0, 0, 0)
        ca.set_operator(cairo.OPERATOR_DEST_OUT)
        ca.paint()

        img = cairo.ImageSurface.create_from_png(imageName)
        ca.set_source_surface(img)
        ca.set_operator(cairo.OPERATOR_OVER)
        ca.paint()

        self.shape_combine_mask(self.bitmap, 0, 0)
    
    def on_delete_event(self, widget, event=None):
        print '-- quit --'
        gtk.main_quit()
#
#
if __name__ == '__main__':
    win = ShapedWindow('blender_logo.png')
    win.show_all()

    gtk.main()


上記を実行すると、以前作成したBlenderロゴの形のウインドウが
表示されます。

いや〜、面白いですね。