[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:12151] wmaker i18n



久保田です。

# なんだか最近すごいハイペースで自分でも驚いています。
# groff, man-db, xcalendar-i18n, wmaker...
#
## 反動が来そうでこわいのだが...


Window Maker に手を加えましたので、報告します。
さきほど、BTS にも登録しました。Bug#63007 です。

Window Maker はすでに国際化されていますが、実際に日本語環境で
使うには調整が必要でした。そこで、それを不要にしました。
変更は、次の2点です。

 - MultiByteText のデフォルトを NO から YES にした。
 - wsetfont 不要にした。

MultiByteText については説明は不要だと思いますが (すでに
debian-users でも何度も話題になっていたと思います)、
wsetfont 不要については、ちょっとトリッキーなことを
したので、ここで解説します。

# そのうちに、DDP の文書である Introduction to i18n にも書きたいと
# 思います。

まず、手を加える前からすでに、wmaker は XCreateFontSet() を使って
フォントを設定するようになっていました。これは、現在のロケール
に従って、必要な文字セットのフォントを選択する関数です。
平たく言うと、wmaker はすでに複数フォントを必要とする言語
(例: 日本語 [iso8859-1, jisx0201, jisx0208, jisx0212]) に
対応していたのです。

この関数にはフォントのパターンを引数として与えるのですが、
ロケールに必要なフォントでパターンにマッチするものがなければ、
選択されないという結果になってしまいます。たとえば、/etc/X11/*
とかウィンドウマネージャーのテーマファイルに、フォントは
-adobe-helvetica-なんとか  という設定が書かれていると、
たとえ i18n 化されているアプリでも日本語が文字化けしてしまう、
といった症状は、これに起因するものです。

設定ファイルはともかく、テーマファイルの記述のせいでせっかくの
i18n アプリが能力を生かせないというのは困りもの (というか、
デフォルトの設定ファイルで日本語が表示できないのは設定ファイルの
バグだと思います)。そこで、まず、

font = XCreateFontSet(display, fontname,...);

を、

char *fontname2;
fontname2 = malloc(strlen(fontname)+3);
sprintf(fontname2, "%s,*", fontname);
font = XCreateFontSet(display, fontname2,...);
free(fontname2);

というふうに書き換えましょう。つまり、XCreateFontSset に与える
フォントパターンに、「,*」を追加するのです。すると、「*」は
すべてのフォントにマッチするので、当該ロケールで必要なフォントは、
インストールさえされていれば、必ず選択されます。これは、私がちょっと
前に IceWM に対して行った変更で、upstream にも採用されています。

# エラーチェックは省略しています。

ただし、これだと、フォントのサイズがばらばらになります。
どういう規則性があるのか私もよく知りませんが、16 ドットフォントが
選ばれるようです。そうすると、たとえば 14 ドットの helvetica と
一緒に使われるのは 14 ドットの日本語フォントではなくて 16 ドットの
日本語フォント、ということになってしまいます。また、ISO-8859-1
フォントのほうが圧倒的にサイズのバリエーションが豊かなので、
たとえば 13 ドットとか言われると困ってしまいますので、指定した
フォントのサイズに近いサイズも指定するようにしましょう。

font = XCreateFontSet(display, fontname,...);
extents = XExtentsOfFontSet(font);
h = extents->max_logical_extent.height;
XFreeFontSet(display, font);
fontname2 = malloc(strlen(fontname) + 220);
sprintf(fontname2, "%s,"
		   "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,"
		   "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,"
		   "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,"
		   "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,"
		   "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,"
		   "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,"
		   "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,*",
		   fontname, h, h-1, h+1, h-2, h+2, h-3, h+3);
font = XCreateFontSet(display, fontname2,...);
free(fontname2);

というぐあいです。実際には、malloc のエラーチェックに加えて、
1回目の XCreateFontSet が全く失敗した場合や必要な文字セットの
フォントが揃ってしまった場合のチェックが必要になるので、
けっこう複雑になります。

もっと高級にすれば、フォントの形も似たものを優先するようにする
とか、いろいろあるのでしょうが...

# Tcl/Tk のフォント選択も、なかなかすごいですよね。Times には
# 明朝体、Helvetica にはローマン体を選んだりとか。

---
Tomohiro KUBOTA <kubota@debian.or.jp>
http://surfchem0.riken.go.jp/~kubota/