例によって例のごとく、tgifを試してみる事にした。 OSはVine6.0であるが、今回はx86_64を使ってみる。
x86_64版をいじると、やはりいくつかの問題が発生した。 この原因は以下の通りである。
とりあえず、以下のSRPMパッケージをダウンロードし、 インストール後コンパイルして、生成されたRPMパッケージを インストールすると動くのではないかと思う。 (ついでにRPMパッケージも置いておく)
ここからは、個々の問題の詳細とその対処方法について、 メモがわりに書くことにする。
Vine5の時もほぼ同じであったが、 インストールしたままだと "/usr/share/fonts/X11/encodings/encodings.dir" が存在しないため、日本語のフォントが使えない。
対処法としては、管理者権限で以下のコマンドを打ち、 encodings.dirを生成することである。
cd /usr/share/fonts/X11/encodings mkfontdir -n -r -e . -e large
せっかくPostscript互換のスケーラブルなフォントがあるのに、 それをTgifで指定してないためフォントの大きさを変えることができなくなっている。
対処法は、 "/usr/share/X11/ja/app-defaults/Tgif" というTgifのリソースファイルで、 urw-fontsに含まれるフォントを指定することである。 そのための設定部分を以下に示す。
[前略] Tgif.HasAlternateDefaultFonts: true Tgif.Times-Roman: -urw-nimbus roman no9 l-medium-r-*-*-%d-*-*-*-*-*-iso8859-1 Tgif.Times-Bold: -urw-nimbus roman no9 l-bold-r-*-*-%d-*-*-*-*-*-iso8859-1 Tgif.Times-Italic: -urw-nimbus roman no9 l-medium-i-*-*-%d-*-*-*-*-*-iso8859-1 Tgif.Times-BoldItalic: -urw-nimbus roman no9 l-bold-i-*-*-%d-*-*-*-*-*-iso8859-1 Tgif.Courier: -urw-nimbus mono l-medium-r-*-*-%d-*-*-*-*-*-iso8859-1 Tgif.Courier-Bold: -urw-nimbus mono l-bold-r-*-*-%d-*-*-*-*-*-iso8859-1 Tgif.Courier-Oblique: -urw-nimbus mono l-medium-o-*-*-%d-*-*-*-*-*-iso8859-1 Tgif.Courier-BoldOblique: -urw-nimbus mono l-bold-o-*-*-%d-*-*-*-*-*-iso8859-1 Tgif.Helvetica: -urw-nimbus sans l-medium-r-normal-*-%d-*-*-*-*-*-iso8859-1 Tgif.Helvetica-Bold: -urw-nimbus sans l-bold-r-normal-*-%d-*-*-*-*-*-iso8859-1 Tgif.Helvetica-Oblique: -urw-nimbus sans l-medium-o-normal-*-%d-*-*-*-*-*-iso8859-1 Tgif.Helvetica-BoldOblique: -urw-nimbus sans l-bold-o-normal-*-%d-*-*-*-*-*-iso8859-1 Tgif.NewCenturySchlbk-Roman: -urw-century schoolbook l-medium-r-normal--%d-*-*-*-*-*-iso8859-1 Tgif.NewCenturySchlbk-Bold: -urw-century schoolbook l-bold-r-normal--%d-*-*-*-*-*-iso8859-1 Tgif.NewCenturySchlbk-Italic: -urw-century schoolbook l-medium-o-*--%d-*-*-*-*-*-iso8859-1 Tgif.NewCenturySchlbk-BoldItalic: -urw-century schoolbook l-bold-o-*--%d-*-*-*-*-*-iso8859-1 Tgif.Symbol: -urw-standard symbols l-medium-r-normal--%d-*-*-*-*-*-adobe-fontspecific [後略]
32ビット版の時は表面化しなかったのかも知れないが、 Tgif-4.2.2ではstrcpyの使い方に問題があり、 64ビット版では保存したファイルを読み込む際などに 日本語文字が化ける可能性がある。
より細かく言えば、strcpyに存在する、 コピー元とコピー先の領域にオーバーラップがあってはならない と言う規則を守っていない。
これのダーティな対処法として、そのような違反の プログラムのはじめのあたりに、
#define strcpy(dst, src) (memmove((dst), (src), strlen(src)+1))と入れればとりあえずは動くはずである。
以前、日本語文字列におけるテキストカーソル移動の問題で パッチを作成したのだが、 そのパッチが古いバージョンのTgif用であるため、 新しいバージョンのTgifに対しては、 異なる場所にパッチがあたってしまうという問題がある。 結果として、日本語文字列上ではカーソルが動かない。
これはTgifを使用するだけなら何の関係も無い話だが、 コンパイル時に必要となるライブラリの開発用パッケージ (zlib-devel, libidn-devel) をSPECファイルのBuildRequiresに指定していないため、 ビルドに失敗してしまうことがある。
Vine5の時も同じだったのだけど、TrueType-ipafont-michoや TrueType-ipafont-gothicのRPMパッケージは、 mktcapdirというコマンドを使っているが、 mktcapdirコマンドを含むパッケージをRequireしていない。 そのため、新規インストールの際、 パッケージインストールの順番によってはfonts.dirが生成されないことがある。 そうすると、スケーラブルな日本語フォントを見つけることができなくなり、 日本語文字の大きさを変更することができなくなる。
対処法は、以下のようなコマンドを打って、 fonts.dirその他ファイルを生成することである。
mktcapdir /usr/share/fonts/TrueType-ipafont /usr/share/fonts/TrueType-ipafont/*.ttfconf
Vine5の時に存在した、キーボードから入力されたUTF-8の文字列を EUC-JPに変換するパッチは必要がない。詳しく調べてはいないが、 EUC-JPのロケールにibusが対応してくれているのだと思う。
(2011/8/19 作成)