RSS

GtkStatusIcon に文字を表示させる

Pythonでやったがどの言語でも似たような話。

GtkStatusIcon に画像は表示できるが直接文字を表示させられない。GtkWidget なら Cairo を使って文字を表示させるが GtkStatusIcon は GtkWidget のサブクラスではない。

ということで貼り付ける画像に文字を書き込んで画像を更新するということになる。ただ GtkStatusIconは Cairo で描いたものを渡すことはできない。受け取るのは Pixbuf。流れとしては背景となるPNGファイルから ImageSurface を作り CairoContext を使って文字を書き込む。そのあと ImageSurface を Pixbuf に変換して GtkStatusIcon に渡す。次のようなコードとなる。

        image = cairo.ImageSurface.create_from_png(ICON_PATH)
        width = pngimage.get_width()
        height = pngimage.get_height()
        cr = cairo.Context(image)
        cr.set_font_size(128)
        cr.move_to(0,128 )
        cr.show_text("1234")
        cr.move_to(0,256 )
        cr.show_text("ABC")
        pixbuf = Gdk.pixbuf_get_from_surface(pngimage,0,0,width,height)

        statusicon.set_from_pixbuf(pixbuf)

GtkStatusIcon は直接PNGファイルを渡すことができるので Cairo.ImageSurface.write_to_png ファイルに書き出してできないこともないがそんなことはやりたくなかった。StringIO を使ってできないかと思ったが Gtk.StatusIcon.set_from_file はファイルハンドラは受け取らずパスのみだったのでできず。