作者: Koichi
日時: 2005/5/08(14:08)
こんにちは、樋口です。

皆様にアドバイスをいただき、大変ありがとうございました。
pTk/mTk/Unix/tkUnixWm.cを修正してからmakeすることで、(ActivePerlと同
様に)Windowのタイトルに日本語を表示できるようになりました。
GNOMEでもKDEでも、ja_JP.eucJPでもja_JP.UTF-8でも大丈夫でした。また、
quarts-wm(Mac OS X)でも大丈夫でした。

以下、修正の経緯・内容です。
# お恥ずかしいことに、C言語はほとんど触ったことがなかったので、
# おっかなびっくり試してみました。

まず、Zazelさんにお書きいただいたコードを試したところ、ごくわずかの
修正で、Windowのタイトルに日本語を表示することができました。
修正内容は、冒頭に
	#include <locale.h>
を付け足し、main()の冒頭に
	setlocale(LC_CTYPE, "");
を付け足しただけです。

ということで、Bruce.さんに教えていただいたpTk/mTk/Unix/tkUnixWm.cの
該当箇所を修正しました。
	if (XStringListToTextProperty((char **)&string, 1,
		&textProp)  != 0) {
	    XSetWMName(winPtr->display, wmPtr->wrapperPtr->window,
	    &textProp);
	    XFree((char *) textProp.value);
	}
上のようになっていた部分を、下記のように変更しました。
	setlocale(LC_CTYPE, "");
	XmbTextListToTextProperty(winPtr->display, (char **)&string,
	 1, XStdICCTextStyle, &textProp);
	XSetWMName(winPtr->display, wmPtr->wrapperPtr->window, &textProp);
	XFree((char *) textProp.value);

もう一カ所、同様の変更を行いました。
	    if (XStringListToTextProperty(&string, 1,
		    &textProp)  != 0) {
		XSetWMName(winPtr->display, wmPtr->wrapperPtr->window,
			&textProp);
		XFree((char *) textProp.value);
	    }
上のようになっていた部分を、下記のように変更しました。
	setlocale(LC_CTYPE, "");
	XmbTextListToTextProperty(winPtr->display, &string, 1,
	 XStdICCTextStyle, &textProp);
	XSetWMName(winPtr->display, wmPtr->wrapperPtr->window, &textProp);
	XFree(textProp.value);

最後に、冒頭に
	#include <locale.h> 
を書き加えてお終いです。


なお、ウィンドウのタイトルを設定している部分(変更した部分)の真上に、
	Tcl_UtfToExternalDString(NULL, string, -1, &ds);
	string = Tcl_DStringValue(&ds);
のようなコードがありました。printf (string);で確かめたところ、localeに
あわせて文字コードを変換するということまでは行われていたようです。よっ
て、XStringListToTextPropertyからXmbTextListToTextPropertyに変えるだけ
で上手く行ったようです。


以上、お礼と報告までに。


樋口 (http://hey.to/KO-ichi)