先日翻訳した移行ガイドを参考に GConf から GSetting に変更してみた。概ねこのガイドに従っていけば移行はできるけど、GSettings の API を使って設定情報を保管したり取得するコードは別途追加が必要。このあたりを中心に気づいた点などをまとめてみる。あと、前バージョンでは Deprecated なウィジェット (コンテナ) を残したまま GTK+ 3 をサポートしていたのだけれど、GTK+ 3.6 系の環境で使用するとウィジェットの配置が崩れてくるのが目に付いたので、それらを新しいコンテナらで置き換えておいた。
今回の移行対象となるスキーマはアプリケーションの設定情報とかオプションとか呼ばれる類のもので、いわゆる Microsoft Windows のレジストリみたいなもの。詳細はこちらのドキュメントを参照のこと。以下、前者が GConf のスキーマ XML で、後者が (GConf スキーマを変換し修正した結果でもある) GSettings のスキーマ XML の一部である:
(nautilus-renames.schemas) <gconfschemafile> <schemalist> <schema> <key>/schemas/apps/nautilus-renames/last_template</key> <applyto>/apps/nautilus-renames/last_template</applyto> <owner>nautilus-renames</owner> <type>string</type> <default></default> <locale name="C"> <short>Last template used to rename</short> <long> Used to store which a template used for renaming filenames or folder names with some special character in pattern. </long> </locale> </schema> ...
(org.gnome.nautilus-renames.command-history.gschema.xml) <?xml version="1.0" encoding="UTF-8"?> <schemalist> <schema path="/org/gnome/nautilus-renames/command-history/" id="org.gnome.nautilus-renames.command-history" gettext-domain="nautilus -renames"> <key type="s" name="last-template"> <default>''</default> <summary>Last template used to rename</summary> <description>Used to store which a template used for renaming filenames or folder names with some special character in pattern.< /description> </key> ...
上の例では両者共にちょうど1個のキーとその値の定義をスキーマで記述してある。移行ガイドにもあるけど、両者の大きな違いはキーの名前が GConf では絶対パス名で、GSettings では名称になっている点。あとで両者の違いを吸収するコンバータについて説明する。
で、その移行作業としては:
- configure.ac に専用の m4 マクロを追加する移行ガイドにあるように GLIB_GSETTINGS を追加し pkg-config を使った検出では古い GConf 向けの条件を外して、代わりに gsettings-desktop-schemas を利用するための条件を追加する。
@@ -66,6 +66,7 @@ AC_HEADER_STDC GNOME_COMMON_INIT GNOME_MAINTAINER_MODE_DEFINES GNOME_COMPILE_WARNINGS([maximum]) +GLIB_GSETTINGS
@@ -84,8 +84,8 @@ PKG_CHECK_MODULES([DEPENDENCIES], [ gmodule-2.0 gio-2.0 gtk+-3.0 >= $GTK_REQUIRED - gconf-2.0 >= $GCONF_REQUIRED libnautilus-extension >= $NAUTILUS_EXTENSION + gsettings-desktop-schemas ])
gconftool も不要なので configure スクリプトから外す:
@@ -161,16 +161,6 @@ else -AC_PATH_PROG(GCONFTOOL, gconftool-2, no) -if test x"$GCONFTOOL" = xno; then - AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf]) -fi -AM_GCONF_SOURCE_2
GSettings は GLib バージョン 2.26 以降から利用できるので、それをビルド条件として追加しても構わない:
@@ -75,7 +76,6 @@ PKG_PROG_PKG_CONFIG GLIB_REQUIRED=2.28.0 // >= 2.26 であることを明示する GTK_REQUIRED=3.4.0 // Deprecated なコンテナを使わないようにするため NAUTILUS_EXTENSION=3.0.0
- Makefile.am に専用のルールを追加するこのアプリでは GConf のスキーマを $(topdir)/data に格納しているので、このディレクトリの Makefile.am を修正する。まず GConf 向けのルールを GSettings のルールで置き換える。ここにあるとおり GSettings のスキーマ XML ファイルの名前は org.gnome.nautilus-renames.command-history.gschema.xml で、後で説明するけど <summary> (サマリ) と <description> (説明) は l10n 向けに翻訳カタログにエキスポートするため、実際には *.gschema.xml.in というファイルを作成して、その後の @INTLTOOL_XML_NOMERGE_RULE@ というルールを介して *.gschema.xml に変換している:
@@ -14,24 +14,27 @@ icon_DATA = \ ## Man page man_MANS = nautilus-renames.1 -## Schemas and about.ini -schemadir = @GCONF_SCHEMA_FILE_DIR@ -schema_in_files = nautilus-renames.schemas.in -schema_DATA = $(schema_in_files:.schemas.in=.schemas) +## GSettings schemas +gsettings_schema_in_files = \ + org.gnome.nautilus-renames.command-history.gschema.xml.in \ + $(NULL) +gsettings_SCHEMAS = $(gsettings_schema_in_files:.xml.in=.xml) -@INTLTOOL_SCHEMAS_RULE@ +@INTLTOOL_XML_NOMERGE_RULE@ +@GSETTINGS_RULES@
ちなみに dconf-editor といった GUI の類でスキーマのサマリや説明を参照しても日本語になっていない理由は、この @INTLTOOL_XML_NOMERGE_RULE@ ルールがあるため。このルールを外せば日本語のままスキーマに埋め込まれるのだけれどバイナリに変換する際にエラーが出る。単純にせっかく翻訳した日本語の文章が表示されないのはそれが原因。
- GConf/GSettings のスキーマ変換一覧のファイルを作成し、
Makefile.am に専用のルールを追加するつづいて、移行ガイドのここにあるように、GConf/GSettings のスキーマを相互に自動変換してデータを保存できるようにするために、GSettings のスキーマにあるキーと GConf のパス名の対応づけを記述したファイル (コンバータ) を nautilus-renames.convert なる名前で作成しておき、これを /usr/share/GConf/gsettings というディレクトリにインストールするルールを書いておく:+## About informations +convertdir = $(datadir)/GConf/gsettings +convert_DATA = nautilus-renames.convert
次がコンバータの中身。GSettings のスキーマ毎にキーを左辺に、それに対応する GConf のキー (/schemas を除いた絶対パス) を右辺に記述する:
[org.gnome.nautilus-renames.command-history] last-template = /apps/nautilus-renames/last_template last-start-at = /apps/nautilus-renames/last_start_at last-sort-by = /apps/nautilus-renames/last_sort_by last-reverseorder = /apps/nautilus-renames/last_reverseorder last-change-case = /apps/nautilus-renames/last_change_case last-leave-original = /apps/nautilus-renames/last_leave_original
最後にソース・アーカイブを配布するためのお決まりのターゲットでも、GConf スキーマファイルを削除して GSettings のスキーマとコンバータを追加しておく:
EXTRA_DIST = \ - nautilus-renames.schemas \ - nautilus-renames.schemas.in \ + $(gsettings_schema_in_files) \ + nautilus-renames.convert \ $(icon_DATA) \ $(man_MANS) \ $(aboutdialog_DATA) \ @@ -42,9 +45,18 @@ DISTCLEANFILES = \ $(NULL) CLEANFILES = \ - $(schema_DATA) \ + $(gsettings_SCHEMAS) \ $(NULL)
- GConf スキーマの XML ファイルを
GSettings スキーマの XML ファイルに変換する次は、移行ガイドのここにあるように、GConf のパッケージに付属している gsettings-schema-convert なるツールを使って実際に GConf から GSettings のスキーマ XML に変換する。GSettings の場合、スキーマ名「イコール」ファイル名が慣例らしく名前空間みたいにドットで区切った名称にし、拡張子はこれも慣例に従い .gschema.xml にする。ということで、GSettings のスキーマ XML のファイル名は org.gnome.nautilus-renames.command-history.gschema.xml になる。とはいえ、GConf / GSettings 共に実際の XML ファイルは l10n 対応ということで intltool のマクロを介して展開されるようにしておくため *.in という拡張子になっており、移行ガイドに従って実行するコマンドラインは次のようになる:$ gsettings-schema-convert \ --gconf --xml \ --schema-id "org.gnome.nautilus-renames.command-history" \ --output org.gnome.nautilus-renames.command-history.gschema.xml.in \ nautilus-renames.schemas.in
- 変換した GSettings スキーマの XML ファイルを修正するgsettings-schema-convert ツールで変換した結果を修正する。ここではコマンドラインからスキーマ id を “org.gnome.*” に変更しているが、変換された path の内容は GConf の絶対パスのままなので手動で修正する。例えば
<schema id="org.gnome.nautilus-renames.command-history" path="/schemas/apps/nautilus-renames/last_template" ...
を次のように修正する (これを全キーに対して繰り返す):
<schema id="org.gnome.nautilus-renames.command-history" path="/org/gnome/nautilus-renames/command-history/" ...
その他に、各キーのスキーマにある <summary> を <_summary>、<description> を <_description> にそれぞれ変更し、スキーマ id の中に gettext のドメインを追加して intltool の @INTLTOOL_XML_NOMERGE_RULE@ のルールでエキスポートされるようにしておく:
<schema id="org.gnome.nautilus-renames.command-history" path="/org/gnome/nautilus-renames/command-history/" gettext-domain="nautilus-renames">
- POTFILES.in に GSettings スキーマファイルを追加する上で追加した intltool のルールと intltool-update を使って l10n のメッセージ・カタログ・ファイルにスキーマの日本語訳をエキスポートできるように、GSettings のスキーマ XML ファイルの名前を po/POTFILES.in に追加しておく:
[encoding: UTF-8] # List of source files containing translatable strings. # Please keep this file sorted alphabetically. ... data/org.gnome.nautilus-renames.command-history.gschema.xml.in
あとは po ディレクトリで次のコマンドを実行すると、GSettings のスキーマ XML ファイルにある <_summary> と <_description> でそれぞれ囲った部分が翻訳メッセージのエントリとして追加されるようになる:
$ intltool-update ja
- GConf の API を GSettings の API に置き換えてコンパイルしてみる最後に、プログラムから GConf の API を使ってアプリの設定情報を取得したり、別の値で上書きするなどしているコードをそれぞれ修正しておく。このアプリではアプリの設定に応じた GConf のラッパーを提供しているので、これを GSetting の API で置き換えた。同様に、直接アプリの設定を取得するコードも GSetting の API でそれぞれ置き換えた。
それが完了したら、configure スクリプトが正しく GSetting を検出し、GSettings のスキーマ XML ファイルが生成され、GSettings の API を使ったコードがコンパイルされるか autogen.sh を実行して確認する。
といった流れになった。さらに、このアプリでは run-in-place をサポートするようにしており、せっかくなのでスキーマをシステム規模でインストールすることなく、ビルド直後にそのまま GSettings を利用できるようにちょっと fake な処理を追加している。
本来ならばスキーマをシステム規模の /usr/share/glib-2.0/schemas というディレクトリにインストールしてコンパイルする必要があるが、それは $XDG_DATA_DIRS という環境変数に基底ディレクトリが定義されているから:
$ echo $XDG_DATA_DIRS /usr/share/gnome:/usr/local/share/:/usr/share/
すなわち、上記の基底ディレクトリ配下の glib-2.0/schemas に GSettings のスキーマ XML とそのバイトコンパイルが存在ししていないとアプリが起動しない:
$ nautilus-renames *.* ... (nautilus-renames:14782): GLib-GIO-ERROR **: No GSettings schemas are installed on the system
ということで、システム規模にインストールせずにローカルのディレクトリで上記の条件を満足させるようにした上で、このアプリの起動時に次のように環境変数を変更してローカルのディレクトリを優先するようなコードを追加した:
#ifdef RUN_IN_PLACE { gchar *val_string; const gchar *old_env; old_env = g_getenv ("XDG_DATA_DIRS"); if (old_env) { val_string = g_strdup_printf ("%s:$(XDG_DATA_DIRS)", DATADIR); g_setenv ("XDG_DATA_DIRS", val_string, TRUE); } else { val_string = g_strdup_printf ("%s", DATADIR); g_setenv ("XDG_DATA_DIRS", val_string, TRUE); } #ifdef DEBUG mkf_debug_message (DEBUG_PRINT, "$XDG_DATA_DIRS = %s", val_string); #endif /* Def: DEBUG */ g_free (val_string); } #endif /* Def: RUN_IN_PLACE */
そしてビルドした後に次のコマンドで GSettings のスキーマをローカルでバイトコンパイルして利用できる環境にする:
$ make compile-local-schemas cd data && make compile-local-schemas make[1]: ディレクトリ `nautilus-renames/data' に入ります top_builddir=`cd .. && pwd` Compiling schemas in local mkdir -p ../data/glib-2.0/schemas/ install -c -m644 org.gnome.nautilus-renames.command-history.gschema.xml ../data/glib-2.0/schemas/ GLIB_COMPILE_SCHEMAS=/usr/bin/glib-compile-schemas && /usr/lib/x86_64-linux-gnu/glib-2.0/glib-compile-schemas ../data/glib-2.0/schemas make[1]: ディレクトリ `nautilus-renames/data' から出ます
次が上のターゲットのルール:
+if RUN_IN_PLACE +compile-local-schemas: org.gnome.nautilus-renames.command-history.gschema.xml + top_builddir=`cd $(top_builddir) && pwd` + @echo Compiling schemas in local + mkdir -p $(top_builddir)/data/glib-2.0/schemas/ + install -c -m644 org.gnome.nautilus-renames.command-history.gschema.xml $(top_builddir)/data/glib-2.0/schemas/ + GLIB_COMPILE_SCHEMAS=$(shell which glib-compile-schemas) && $(GLIB_COMPILE_SCHEMAS) $(top_builddir)/data/glib-2.0/schemas +endif
これでアプリをシステム規模でインストールしなくても即行で起動できる。
あとGTK+ バージョン3を使った GUI の方も、Deprecated になったテーブルやボックスといったコンテナを全て Glade を使って書き直した。ウィジェットをコンテナを介して階層的に管理することは理論的に良いとは思うけど、実際にレイアウトを視覚的に決めるのが難しくなった。あれこれパラメータを変更しながらじゃないと一意にきまらないというか、やり直しが多くなるというか。一箇所操作するだけでレイアウトが決まれば良いのだけれど、Glade は個々のウィジェットをそれぞれ操作しないとうまくいかない。
ということで、以下がスクリーンショット:
今バージョンからコンテキスト・メニューの項目でショートカットキーを利用できるようにした:
nautilus-renames-3.1.92.tar.xz: Release Candidate2
開発リポジトリ
ホームページ
そういえば前のバージョンも未だ stable を出していなかったような気もするな…。
安定版の nautilus-renames-3.2.0.tar.xz をリリースした。
RC2からの差分は、GUI でキーボードからのニーモニックが無効になっていたので修正したこと。