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

cairotest5.cでは背景の色を白にするために、
make_offscreen()内でイメージサーフェスを矩形で塗り潰してから、
draw_hello()へサーフェスを渡すという面倒なことを行っている。
しかし、これはもっと簡単に実現できる。
gtk_widget_modify_bg()でGtkDrawingAreaの背景色を変更すれば済む。

--- cairotest5.c        #
+++ cairotest6.c        #
@@ -13,6 +13,7 @@
     GtkWidget *win;
     GtkWidget *da;
     cairo_surface_t *surf = make_offscreen();
+    GdkColor WHITE[] = {{0, 65535, 65535, 65535}};
 
     gtk_init(&argc, &argv);
     win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
@@ -20,6 +21,7 @@
     gtk_container_add(GTK_CONTAINER(win), da);
     gtk_window_resize(GTK_WINDOW(win), WIDTH, HEIGHT);
     gtk_window_set_title(GTK_WINDOW(win), "Hello");
+    gtk_widget_modify_bg(da, GTK_STATE_NORMAL, WHITE);
     g_signal_connect(da, "expose-event", G_CALLBACK(on_expose), surf);
     g_signal_connect(win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
     gtk_widget_show_all(win);
@@ -31,11 +33,6 @@
 cairo_surface_t *make_offscreen(void)
 {
     cairo_surface_t *surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT);
-    cairo_t *cr = cairo_create(surf);
-    cairo_rectangle(cr, 0, 0, WIDTH, HEIGHT);
-    cairo_set_source_rgb(cr, 1, 1, 1);
-    cairo_fill_preserve(cr);
-    cairo_destroy(cr);
     draw_hello(surf);
     return surf;
 }

make_offscreen()の中身が随分簡単になる。
色の指定は、

    GdkColor white = {0, 65535, 65535, 65535};
...snip
    gtk_widget_modify_bg(da, GTK_STATE_NORMAL, &white);

でもよい。というよりも、こちらの方が普通だろう。

実はcairotest5.cを書いている時に、
gtk_widget_modify_bg()で変更しようとしたのだが、
全く反映されず背景色はデフォルトから変わらなかった。
環境がWindowsだと機能しないのかと思い、
内部が白色の矩形でわざわざ塗り潰してからdraw_hello()に引き渡すという面倒な処理を書いていた。
原因は単純ミスでGtkDrawingAreaではなくGtkWindowの方の背景を一生懸命変更しようとしていただけだった。