Nautilus Renames Extension 3.2 RC1 supports GSettings.

先日翻訳した移行ガイドを参考に 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 では名称になっている点。あとで両者の違いを吸収するコンバータについて説明する。
で、その移行作業としては:

  1. 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
    
  2. 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@ ルールがあるため。このルールを外せば日本語のままスキーマに埋め込まれるのだけれどバイナリに変換する際にエラーが出る。単純にせっかく翻訳した日本語の文章が表示されないのはそれが原因。

  3. 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)
    
  4. 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
    
  5. 変換した 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">
    
  6. 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 ファイルにある &lt_summary> と <_description> でそれぞれ囲った部分が翻訳メッセージのエントリとして追加されるようになる:

    $ intltool-update ja
    
  7. 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-2013010501.png
今バージョンからコンテキスト・メニューの項目でショートカットキーを利用できるようにした:
nautilus-renames-2013010401.png
See Also nautilus-renames-3.1.92.tar.xz: Release Candidate2
See Also 開発リポジトリ
See Also ホームページ
そういえば前のバージョンも未だ stable を出していなかったような気もするな…:O

Nautilus Renames Extension 3.2 RC1 supports GSettings.” への1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*