作者: Bruce.
日時: 2005/5/06(21:27)
Bruce.です。

Koichi さんは書きました (2005/05/06 1:16):
> 私もまったく詳しくないのですが、試してみた限りでは、起動もと(?)のター
> ミナルからもらってきているようです。ja_JP.eucJPだと日本語入力できます
> が、Cだと日本語入力(xim)ができなかったりといったことが起こります。
> また、この設定によって、問題のWindowタイトルの文字化けの仕方も変わりま
> す。

ちょっとPerl/Tkのソースから調べてみました。
先に書いたとおり、Xのことはわからないので対応するWindows版の
ソースから推測しつつ進めました。んで、

pTk/mTk/Unix/tkUnixWm.c の

	    wmPtr->title = ckalloc((unsigned) (strlen(argv[3]) + 1));
	    strcpy(wmPtr->title, argv[3]);
	    if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
		XTextProperty textProp;

		if (XStringListToTextProperty(&wmPtr->title, 1,
			&textProp)  != 0) {
		    XSetWMName(winPtr->display, wmPtr->wrapperPtr->window,
			    &textProp);
		    XFree((char *) textProp.value);
		}


あたりがウィンドウのタイトルを設定している部分のようです(設定
自体はXSetWMNameで行う)。

http://xjman.dsl.gr.jp/X11R6/X11/CH14.html

によれば

> 関数 XStringListToTextProperty は、指定された文字列のリストの要素を繋げ
> た値を指定された XTextPropertyに設定する。設定される値は STRING 型(フォ
> ーマット 8)であり、元のそれぞれの文字列は NULL で終わる。追加の NULL バ
> イト(これは nitems メンバの数には入らない)は、 text_prop_return の value
> フィールドの最後に格納される。文字列のエンコーディングは STRING であるも
> のと(検査なしに)想定される。新しい文字列に割り当てる十分なメモリがなかっ
> た場合、 XStringListToTextPropertyは XTextProperty構造体のどのフィールド
> にも値を設定せず、ステータスとして 0 を返す。そうでない場合、この関数は
> 0 でないステータスを返す。 value フィールドのメモリを解放するには XFree
> を使用すること。

ということで、どうもこの関数がロカールを意識した実装をされていない
ような気がしないでもありません。実際

int XmbTextListToTextProperty(display, list, count, style, text_prop_return)

なんていう、compound_textとかカレントロカールでの変換を
指定できる関数もあります。

ちいさなX用のプログラムでも書ければ確かめられるんでしょうけど。
#VMWareもインストールして、Linux(Fedora Core)とFreeBSDも用意
#してあるのだけど止まってます(^^;

-- 
木村浩一
  I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
  mail kbk@...
	web  www.kt.rim.or.jp/~kbk/index.html#zakkicho
	     homepage3.nifty.com/farstar/