古いコンテンツの覚書のページ書き換えをヤルヤル詐欺していた。
放置しすぎてもう古さ全開なのでと先週から地味に整理中。
この年末年始休暇の内になんとか整理を終わらせたい。
ウインドウを作る – 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 なのでソッチで動かしてみる。

問題なく動く、こりゃココの整理は 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;
}
}

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 も削除しといたほうがいいのかも。