同じことをGTK+2で書いてみる #1

Win32APIの代わりにGTK+2をトップレベルウインドウの作成に使う。
フレームワークを使うとコードがずいぶん短くなる。
ただし、処理的には同じことをしているのだが、
draw_hello()を直接には使っていない。
GTK+3ではexpose-eventシグナルがdrawシグナルに変更になっており、
cairoのグラフィックコンテクストを引数でもらえるのでさらに少し簡単になるようだ。

#include <gtk/gtk.h>

#define UNUSED_ARGUMENT(x) (void)(x)
#define WIDTH 860
#define HEIGHT 520

gboolean on_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data);

int main(int argc, char *argv[])
{
    GtkWidget *win;
    GtkWidget *da;

    gtk_init(&argc, &argv);
    win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    da = gtk_drawing_area_new();
    gtk_container_add(GTK_CONTAINER(win), da);
    gtk_window_resize(GTK_WINDOW(win), WIDTH, HEIGHT);
    gtk_window_set_title(GTK_WINDOW(win), "Hello");
    g_signal_connect(da, "expose-event", G_CALLBACK(on_expose), NULL);
    g_signal_connect(win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_widget_show_all(win);
    gtk_main();
    return 0;
}

gboolean on_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
    int i;
    cairo_t *cr;
    UNUSED_ARGUMENT(event);
    UNUSED_ARGUMENT(data);

    cr = gdk_cairo_create(widget->window);
    cairo_select_font_face(cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
    cairo_set_font_size(cr, 256.0);
    cairo_set_source_rgb(cr, 0.0, 0.0, 1.0);
    cairo_move_to(cr, 40.0, 220.0);
    cairo_text_path(cr, "HELLO");
    cairo_move_to(cr, 10.0, 440.0);
    cairo_text_path(cr, "WORLD");
    cairo_clip(cr);
    cairo_set_line_width(cr, 10.0);
    for (i = 0; i <= 440; i += 20) {
        cairo_move_to(cr, 0, i);
        cairo_line_to(cr, 900, i);
    }
    cairo_stroke(cr);
    cairo_destroy(cr);
    return FALSE;
}