1999/11/23    Glib/Gtk+, Gimp-1.1.11, and Gtk--

山田さんの所 で gimp の日本語化に関する素晴らしいページがある事を知る。
紅眠さんのページ
榎田さんのページ
Linux に関する重要な情報の大部分を山田さんの所から仕入れているような気がする。 本当にありがたい事である。 というわけで、gimp 関連のアップデートをすることに。

[1] Glib-1.2.6-1b と Gtk+-1.2.6-1b

前のバージョン
glib-1.2.6-1a.ppc.rpm
gtk+-1.2.6-1a.ppc.rpm
では、gimp-1.1.10 で見られたスクリーンショットでセグメンテーションフォールト する問題に対処するため、glib に glib-1.2.6-gcache.patch また、gimp-1.1.11 でも続いている script-fu がセグメンテーションフォールトを 起こす問題に対処するための gtk+-1.2.6-gdkfont.patch をあてていた。前者は、gimp developer mailinglist の msg8528 に投稿された Asbjoern Pettersen 氏によるパッチ、後者は Kondara Linux で使われている Akira Higuchi 氏のパッチからの抜粋である。
いずれも、アプリケーションが正しく gtk+ を使っている限り、 本来あってはならない事態に対処するためのものであり、 本来、アプリケーション側で対処すべき問題と思われる。 幸い、glib のパッチは gimp-1.1.11 では不要になっている。 そこで、script-fu の問題を調べてみる事にし、そのために 上記二つのパッチをはずして、glib/gtk+ の RPMS を作り直す。
使ったSPECはこれこれ、 できたRPMSは
glib-1.2.6-1b.ppc.rpm
glib-devel-1.2.6-1b.ppc.rpm
gtk+-1.2.6-1b.ppc.rpm
gtk+-devel-1.2.6-1b.ppc.rpm
で、対応するSRPMSは
glib-1.2.6-1b.src.rpm
gtk+-1.2.6-1b.src.rpm
である。 gtk+ には、改良版の gtkfontsel パッチをあてた。 山田さんに教えて頂いた榎田さんのページで、同様のパッチがある事を知り、 比べた所、大河さんのパッチは私のものと同じ思想であった。 世の中には同じような事を考える人がいるものである。 一方、私のものには森岡さんの部分が欠落していたのでこれを補った (森岡さんに感謝)。 この gtk+ には他にも2つ gtk+ developer mailinglist に流れていた パッチがあててある。これは、すでに CVS バージョンには統合されている との事である。 いずれにせよ使う場合はいつものように自己責任

[2] Gimp-1.1.11-1b

さて、新しい glib と gtk+ を、"rpm -Uvh" し、gimp-1.1.11 で script-fu を 試すと、無事(?)セグメンテーションフォールトを起こした。 しばらくデバッグすると、gdkfont パッケージの中で、fontname の ハッシュテーブルで問題を起こしている事が分かった。 上記の Kondara のパッチでは、1バイトフォントに対し、 ハッシュテーブルを使わないという力業でこの問題に対処している。 gtk+-1.2.6/gdk/gdkfont.c を読んでみても、ロジック自体に問題は なさそうであるので、私としてはできればそこをいじらずにすませたいところである。
そこで、こんどは、gimp-1.1.11/plug-ins/script-fu/script-fu-script.c の方を眺める事になる。すると、gdk_font_load をした直後に、 戻り値である GdkFont 構造体へのポインターを g_free している事が分かった。 この構造体は、最初の gdk_font_load 時にハッシュテーブルに登録され、 次回よりハッシュテーブルで参照される。 そこで、 ハッシュテーブルから問題のフォントのエントリーを除かずにポインターの 参照する実体を開放してしまうと、 セグメンテーションフォールトを起こす事になると思われる。
どうもそのフォントを使わなくなった時点で gdk_font_unref するのが正しい作法の ようである。 が、それをトラックするのが面倒なので(あー、いつもながらいい加減)、 g_free を gdk_font_unref に置き換えてしまう。 こうすれば、とりあえずハッシュテーブルの整合性は保たれる。 この思想で作った script-fu のパッチは これ。 INIT_I18N_UI の呼びどころが遅すぎて、日本語にならない問題にも 対処している(INIT_I18N_UI は gtk_set_locale などを呼ぶマクロ)。
このパッチをあて script-fu だけ作り直して試すと、今度は セグメンテーションフォールトしなくなった。まずは 思惑通りである。
ところで、上記の紅眠さんのページで (今更なにをいっているのかと怒られそうだが)、gdyntext なる plug-in が ある事を知る。 そのための日本語化パッチもあった。が、紅眠さんのページにも 説明があるように、2バイトフォントの判定に多少問題がある。 そこで、日本語2バイト文字だけ正しければいいかという事で 私家版パッチ を作った。 これは、フォントファミリーが jisx0208 を含むか否かで gdk_fontset_load を使うか gdk_font_load を使うかを 判断する仕様である。 相変わらず手抜きであるが、とりあえず動くという事で。 ただし、榎田さんのページにもあるように 正しくフォントを設定しないと、ビットマップフォントを スケールしようとしたりして、一瞬フリーズしたかと疑う程 時間がかかったりするので注意が必要。 JRPM の渡部と和田研の TrueType が入れてあれば、
$ su
# cat <somewhere>/ttf-fonts.alias.add >> /usr/lib/X11/fonts/TrueType/fonts.alias
# exit
$ set fp rehash
などとしておけば良い。 もちろん、これらの TrueType がXで使えなくてはダメなので、 X-TT か xfs-TT は入れておく必要がある。

以上のパッチを統合したのが このパッチ である。

さらに、 他の plug-ins で日本語がまともに使えるようにするパッチ も紅眠さんの所から手にはいるが、これはそのまま ありがたく使わせて頂く。 ただし、これに関しては私としてはほとんど全くテストしていない。(11月24日、さらにスクリプト自体へのパッチを追加)。

上記パッチを含め、このSPEC

gimp-1.1.11-1b.ppc.rpm
gimp-devel-1.1.11-1b.ppc.rpm
gimp-perl-1.1.11-1b.ppc.rpm
を作成、対応するSRPMは
gimp-1.1.11-1b.src.rpm
である。一応、動作テストしたが 使う場合はいつものように自己責任

[3] Gtk---1.1.4

Gimp とは直接関係ないが、glib と gtk+ を更新した所で しばらくサボっていた gtk-- の更新も行った。 このSPEC
gtk---1.1.4-1a.ppc.rpm
gtk---devel-1.1.4-1a.ppc.rpm
gtk---devel-static-1.1.4-1a.ppc.rpm
を作成、対応するSRPMは
gtk---1.1.4-1a.src.rpm
である。使うには事前に、glib、gtk+ の他、
libsigc++-0.8.5-6a.ppc.rpm
を入れておく必要がある。こいつのSRPMは
libsigc++-0.8.5-6a.src.rpm
で、SPECはこれ
例題の動作は確認したが 使う場合はいつものように自己責任


Back to Keisuke Fujii's MkLinux/LinuxPPC Life