The Unofficial Widget FactoryにRGBAカラーマップを加える

Cimi’s Official Blogにある通りGTK+アプリケーションにRGBAカラーマップを加えるとGNOME標準のMetacity*1でも半透明のウィンドウを実現することができる。
The Widget FactoryにRGBAカラーマップを加えるパッチがwww.cimitan.comに投稿されているのでこれを元にThe Unofficial Widget Factoryのパッチを作ってみた。
src/main.c:

@@ -41,6 +41,7 @@
 
 void on_scale_value_changed (GtkRange *range, gpointer user_data);
 void on_button_refresh_clicked (GtkWidget *button, gpointer user_data);
+void transparentize_window (GtkWidget *window);
 
 static gchar *
 get_ui_file (void)
@@ -84,6 +85,7 @@
 	glade_xml_signal_autoconnect (d->gxml);
 
 	window = WID(window_main);
+	transparentize_window (window);
 
 	combobox1 = WID(combobox1);
 	combobox2 = WID(combobox2);
@@ -113,7 +115,7 @@
 		gtk_tree_view_column_set_reorderable (column, TRUE);
 		gtk_tree_view_column_set_resizable (column, TRUE);
 		gtk_tree_view_column_set_sort_column_id (column, i);
-		gtk_tree_view_append_column (treeview, column);
+		gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
 
 		g_free (name);
 	}
@@ -180,6 +182,18 @@
 	theme_refresh ();
 }
 
+void
+transparentize_window (GtkWidget *window)
+{
+  GdkScreen *screen = gtk_widget_get_screen(window);
+  GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen);
+
+  if (colormap && gdk_screen_is_composited (screen))
+    {
+      gtk_widget_set_default_colormap(colormap);
+    }
+}
+
 int
 main (int argc, char *argv[])
 {

「transparentize_window()」という関数を作り、その中でメインウィンドウにカラーマップを加えた。(ちなみに113行目から始まるブロックは型の不整合による警告を消すためのもの。)これで透過できるかと思ったがうまく行かなかったので、UIを構成しているgladeについて調べてみるとEmbedding Libglade Interfacesの最後のブロックに

One thing to note -- if you don't want a widget to be displayed as soon as 
it is constructed with glade_xml_new, you should set the visible property 
on that widget to "no" in Glade. 

と書いてあるのでメインウィンドウの「visible」プロパティを「False」にしたら半透明になった。
src/twf.glade:

@@ -3,7 +3,7 @@
 <!--*- mode: xml -*-->
 <glade-interface>
   <widget class="GtkWindow" id="window_main">
-    <property name="visible">True</property>
+    <property name="visible">False</property>
     <property name="title" translatable="yes">The Widget Factory</property>
     <signal name="destroy" handler="gtk_main_quit"/>
     <child>

メインウィンドウが作られた時点では表示せず、「transparentize_window()」でカラーマップを与えてから「gtk_widget_show_all (window)」で表示するという手順になる。

Fedora 10 用のrpmパッケージを物置にアップした。

*1:「/apps/metacity/general/compositing_manager」を「True」にする必要がある