同じことをGTK+3で書いてみる

GTK+3用に書き直してみた。
以前書いたように、
廃されたexpose-eventシグナルの代わりに、
drawシグナルに対応させなければならない。

...snip
gboolean on_expose(GtkWidget *widget, cairo_t *cr, gpointer data);
...snip
    gtk_widget_modify_bg(da, GTK_STATE_NORMAL, WHITE);
    g_signal_connect(da, "draw", G_CALLBACK(on_expose), surf);
    g_signal_connect(win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
...snip
gboolean on_expose(GtkWidget *widget, cairo_t *cr, gpointer data)
{
    UNUSED_ARGUMENT(widget);

    cairo_set_source_surface(cr, (cairo_surface_t *)data, 0, 0);
    cairo_paint(cr);
    return FALSE;
}
...snip

drawシグナルに対応したコールバック関数には、
cairoのグラフィックコンテクストが引数で渡されるので、
gdk_cairo_create()やcairo_destroy()を自前で行う必要がなくなる。
イメージサーフェスを描画するという本質部分の処理のみになり非常にシンプルになる。

GTK+の公式ページではまだGTK+3のWindows版のバイナリ配布が始まっていないので、
MinGWによりビルドしたGTK+3で動作を確認している。
Windowsの場合はバイナリ配布が無いとあまり利用者が増えない気がする。
GTK+2がWindowsを含めたマルチプラットホーム的にはまだまだ主流であるのか?