[[diary/Kojima]]

・file-roller のデバッグ(その2)

ちとフライング気味だけど、コメント欄だとまとまった文章は書きにくいんで、日付を改めて記述。

file-roller が日本語のファイルを扱わない問題、引数として与えたファイル名が UTF-8 に変換されてしまうことが原因のようなので、
引数の処理回りを中心に調べてみた。

結論としては、引数の処理をしているのは、main.c の prepare_app() の

 else { /* Open each archive in a window */
 		const char *filename = NULL;
 
 		int i = 0;
 		while ((filename = remaining_args[i++]) != NULL) {
 			GtkWidget *window;
 			GFile     *file;
 			char      *uri;
 
 			window = fr_window_new ();
 			gtk_widget_show (window);
 
 			file = g_file_new_for_commandline_arg (filename);
 			uri = g_file_get_uri (file);
 			fr_window_archive_open (FR_WINDOW (window), uri, GTK_WINDOW (window));
 			g_free (uri);
 			g_object_unref (file);
 		}
 }

の部分で、remaining_args[] として参照しているファイル名がすでにUTF-8になっているらしい。

この remaining_args[] は、getopt で処理した argv[] の残りみたいだけど、どこから来ているかを調べてみると、
同じ main.c の

 static const GOptionEntry options[] = {
 	{ "add-to", 'a', 0, G_OPTION_ARG_STRING, &add_to,
 	  N_("Add files to the specified archive and quit the program"),
 	  N_("ARCHIVE") },
 
 	{ "add", 'd', 0, G_OPTION_ARG_NONE, &add,
 	  N_("Add files asking the name of the archive and quit the program"),
 	  NULL },
 ....
	{ G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining_args,
	  NULL,
	  NULL },
 
	{ NULL }
 };

というところで処理した残りの部分らしいことが分かった。これは glib 版の getopt 的な処理みたいだなぁ、、と
GOption をキーワードに Google を調べてみたら、Glib マニュアルがヒットして、

 If an option is declared to be of type string or filename, GOption takes care of converting it to 
 the right encoding; strings are returned in UTF-8, filenames are returned in the GLib filename encoding. 
 Note that this only works if setlocale() has been called before g_option_context_parse(). 

ということで、GOption の機能を使うと、引数として与えた文字列やファイル名は UTF-8 にエンコードされてしまうらしい。
GFile の basename はローカルのコーディングを指定しないといけないあたりとは不整合とは思うものの、そういう仕様になっているなら、
file-roller 側でファイル名のコーディングを戻してやればいいだろう。

ということで、g_file_new_for_commandline_arg() にあたえるファイル名を locale に従うように直してみた。

 gchar *locale_filename = g_locale_from_utf8(filename, -1, NULL, NULL, NULL);
 file = g_file_new_for_commandline_arg (locale_filename);

一応、この修正で引数として指定した日本語のファイルも展開できるし、ファイルマネージャ nautilus からダブルクリックで開く場合も
日本語のファイルを処理できるようになった。

細かく見ると、展開しているファイルの名称はUTF-8化したdisplay-name にしなければいけないといった問題は残っているけど、
とりあえず日本語の書庫ファイルも開けるようになったので、file-roller はこれくらいでいいことにしておこう。

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS