Vala GtkDrawingArea

古いコンテンツの覚書のページ書き換えをヤルヤル詐欺していた。
放置しすぎてもう古さ全開なのでと先週から地味に整理中。
この年末年始休暇の内になんとか整理を終わらせたい。

ウインドウを作る – L’Isola di Niente
ダイアログを作る – L’Isola di Niente

コレのために Glade を何年かぶりに入れたりしたけど特にネタも無かった。
Glade を使ったページは削除で済ませることにしよう。

次は DrawingArea を、PyGtk と共通点がゼロなんだよなココ。
expose-event が draw に変わって cairo_t を使えだもんな。

しかし困った、Fedora 17 では下記 PyGI コードが動かない。
というか draw のシグナルが発生しない。

原因判明、同一ディレクトリに cairo.py なんて名前のファイルを入れていたので上書き扱いになり cairo.Context が見つからず変換できないエラーでシグナルが作成できなかっただけだった…
消したら普通に動いた…

Python with GTK+3.0 Create GtkPixbuf | PaePoi

GTK+ 3.4 自体がおかしいのか gir がおかしいのかな。
Boxes 上の仮想 Ubuntu は GTK+3.6 なのでソッチで動かしてみる。

gtk3_6

問題なく動く、こりゃココの整理は Fedora 18 待ちか。
せっかくなので Vala で同じコードを書いてみた。

PyGI では入れていなかった画像が無かった場合の例外処理も入れて。
以前書いた MessageBox.Show() の使い方サンプルも兼ねて。

using Gtk;
using Gdk; //Pixbuf

/*
 * build command
 * valac --pkg gtk+-3.0 test.vala
 * `--pkg gdk-2.0` Not required
 */

public class Win : Gtk.Window {

    private Pixbuf pixbuf;
    private DrawingArea drawing_area;

    public Win () {
        this.set_title("draw test");
        this.destroy.connect (Gtk.main_quit);
        // DrawingArea
        drawing_area = new DrawingArea();
        drawing_area.draw.connect(on_drawing_area_draw);
        try {
            pixbuf = new Pixbuf.from_file("madoka.jpg");
        } catch (Error e) {
            MessageBox.Show(e.message);
        }
        this.add(drawing_area);
        this.show_all();
    }

    private bool on_drawing_area_draw(Cairo.Context cr) {
        // set picture
        if (pixbuf != null)
            Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0);
        // Arc
        int width = drawing_area.get_allocated_width();
        int height = drawing_area.get_allocated_height();
        cr.arc( width / 2.0,
                height / 2.0,
                int.min(width, height) / 2.0,
                0,
                2 * Math.PI);
        cr.fill();
        return false;
    }
 
    public static int main (string[] args) {
        Gtk.init(ref args);
        new Win();
        Gtk.main();
        return 0;
    }
}

public class MessageBox {
    public static ResponseType Show (string text) {
        var dlg = new MessageDialog(
                null,
                DialogFlags.MODAL,
                MessageType.ERROR,
                ButtonsType.OK,
                text );
        dlg.set_title("Message");  
        var res = dlg.run();
        dlg.destroy();
        return (ResponseType)res;
    }
}

gtk3_4_vala

Vala では GdkPixbuf.Pixbuf ではなく Gdk.Pixbuf なんだね。
gir って実はよく解っていないけど動的と静的で違うのか。
PyGI では GLib.PI だったのが GLib.Math.PI だったりとか思ったより迷う。
min 関数は int.min() とかって何だよ…
ほとんど同じだけど実は細かく違うのね。

このコードは PyGI っぽくハンドラを書いたけどハンドラに GtkWidget 部を入れられないのでクラス変数を使うしかなく少し面倒、公式サンプルのように書いた方がローカル変数が使えて楽かと。
pkg 指定が Gtk+-3.0 だけでイケたのがちょっと奇妙。

とりあえず GTK+ 3.4 環境でも Vala なら問題なく draw シグナルが使えるってことですね。

しかし古いページはたった三年前に書いたとは思えない古臭さだ。
又あと三年たったら…考えないようにしよう。
最近の Linux は進化が早すぎて怖い。

アプリケーションの.NET Framework 4.5への移行: 廃止された型と新しい型

とはいえ .NET に比べたら楽なもんだ。
969 の新しい public 型なんて吐き気しかしない、Linux へ早めに逃げて良かった。
.NET 関連の tips も削除しといたほうがいいのかも。