GtkWidgetブラウザコンポーネント比較その2(xulrunner-dev対応)

前回XULRunner+GTKの開発についてメモしましたが、libxul-devを使うのはやっぱり古かったらしく、最近だとxulrunner-devを使うのが正攻法である事がわかりました。前回までのコードではxulrunner-devを使ったビルド&実行できないので、今回はその修正内容をfixします。

環境

Ubuntu-10.04-x86_64、AthlonⅡX2-240e/2GB
xulrunner-1.9.2-dev
(パッケージのインストールはapt-get install xulrunner-devで)

ソース例

#include 
#include 
#include 

GtkWidget* window; // メインウインドウ
GtkMozEmbed* web_view; // ブラウザウィジェット

// キーイベントハンドラ関数
void my_keyevent(GtkWidget *widget, GdkEvent *event, gpointer data) {
	GdkEventKey *kevent = (GdkEventKey *) event;
	if (kevent->keyval == 0xFF1B) { // ESCボタンを押されたら終了
		g_signal_emit_by_name(window, "destroy", NULL, NULL);
	}
}

void my_destroyevent(GtkWidget *widget, GdkEvent *event, gpointer data) {
	gtk_main_quit();
}

// gtk-windowを作成する
int gtk_window_main(int argc, char *argv) {

	// GTKの初期化
	if (!g_thread_supported()) {
		g_thread_init(NULL);
		gdk_threads_init();
	}
	gtk_init_check(&argc, &argv);

	gdk_threads_enter();

	GtkWidget* scrolled;

	// GTKウインドウを作る
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_moz_embed_set_path("/usr/lib/xulrunner-1.9.2.3/");// 初期化
	web_view = GTK_MOZ_EMBED(gtk_moz_embed_new());// ブラウザウィジェットの作成

	scrolled = gtk_scrolled_window_new(NULL, NULL); // スクロールの作成
	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
	gtk_container_add(GTK_CONTAINER(scrolled), GTK_WIDGET(web_view));
	gtk_container_add(GTK_CONTAINER(window), scrolled);

	gtk_window_set_title(GTK_WINDOW(window), "WebViewGTK + UPnP Demo");// タイトルを設定
	gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);// デフォルトのサイズを設定

	gtk_signal_connect(G_OBJECT(window), "key-press-event", G_CALLBACK(
			my_keyevent), NULL);// キーイベント関数を登録する
	gtk_signal_connect(G_OBJECT(window), "destroy",
			G_CALLBACK(my_destroyevent), NULL);// 閉じるボタンを押したときはgtk_main_quitを実行して終了する

	gtk_moz_embed_load_url(web_view, "http://www.google.com/");// URLをセットする
	gtk_moz_embed_push_startup();

	gtk_widget_show_all(window);

	gtk_main();

	gtk_moz_embed_pop_startup();
	gdk_threads_leave();


	return 0;
}

// main関数
int main(int argc, char *argv) {
	window = NULL;
	web_view = NULL;

	gtk_window_main(argc, argv);

	return 0;
}

大きく変わった点は「gtk_moz_embed_set_path」を使うようにした事です。参照先に「This function must be called before the first widget is created or XPCOM is initialized.」とあるように、最初に実行しておく必要があったみたいです。これを実行しないとgtk_widget_showした時点でSEGVになるみたいです。Ubuntuの場合はgtk_moz_embed_set_pathにライブラリのある場所を指定します。(今回の例だと/usr/lib/xulrunner-1.9.2.3/)

ビルドと実行

これらをビルド&実行するにはxulライブラリのある場所にパスを通してあげないとだめです。ライブラリのインストール不完全なのではなく、xulrunnerを使うアプリ全般で必要な作業っぽいです。

ldd /usr/lib/firefox-3.6.3/firefox-bin
 # ↑/usr/lib/firefox-3.6.3/firefoxのシェル内でパスに通してるっぽい
ldd /usr/lib/thunderbird-3.0.4/thunderbird-bin

としてもパスを通す必要があることが確認できます。何でこうなってるんでしょう。
ライブラリの性質上セキュリティアップデートが頻繁に起こるからでしょうかね。

そして実際のビルド&実行手順は

export LD_LIBRARY_PATH=/usr/lib/xulrunner-devel-1.9.2.3/lib
gcc `pkg-config --cflags --libs mozilla-gtkmozembed gtk+-2.0` xul.c
./a.out

になると思います。