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
になると思います。