作者: Koichi
日時: 2005/5/11(04:43)
こんにちは、樋口です。
丁寧なアドバイスをいただき、大変ありがとうございます。

>    Tcl_UtfToExternalDString(NULL, string, -1, &ds);
>    XStoreName(winPtr->display, wmPtr->wrapperPtr->window,
>	    Tcl_DStringValue(&ds));
>    Tcl_DStringFree(&ds);
>
>で行われていました。XStoreNameの引数はテキストプロパティではなく単なる
>文字列のようで、XStoreName自身がlocale awareかどうかがポイントになりそ
>うです。

小さなサンプルで試してみたところ、XStoreNameはlocale-awareなようで、問
題なく日本語のタイトルを表示することができました。

というわけで、Perl/TkのREADMEにあった<ptk@...>と
<nick@...-simmons.net>だけに、バグレポートを送っておきました。
公表するには気が引ける英語・文章なのですが、大変お世話になりましたので
ご報告をと思い、下記に添付いたします。
# およその意図くらいは伝わるだろうと信じているのですが、もし相当に
# まずそうな部分がありましたら、ご指摘をいただけましたら幸いです。

なお、tkUnixWm.cにおいては、「#include <locale.h> 」と「setlocale
(LC_CTYPE, "");」は不要のようでしたので、省いています。

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

---------------------------------------------------------------------
From:     Koichi <koichi_home_add@...>
To:       ptk@..., nick@...-simmons.net
Subject:  Bug report: Internationalization of Perl/Tk

Hello from Japan.

My name is Koichi Higuchi and I am a user of Perl/Tk.
I really like Perl/Tk and thank you very much for 
developing this nice tool.  It is fun to watch my
applications running on various platforms like MS
Windows, Linux, and Mac OS X!  Here is some screenshots
 (just incase if you are curious) : 
http://khc.sourceforge.net/scr_others.html

[Problem]
Anyway, I started to port my Perl/Tk 800 applications
to Perl/Tk 804.027 on Linux and I found a problem.
With Perl/Tk 804.027, I cannot display Japanese 
characters in the window title bar.  I see garbled or 
scrambled characters.  While Japanese characters are OK
inside the windows or widgets, not in the window title
bars.
This problem happens on GNOME 2.10 (ja_JP.UTF-8 / 
ja_JP.eucJP), KDE 3.4 (ja_JP.UTF-8) and Mac OS X Tiger's
quartz-wm (ja_JP.UTF-8).
# On KDE having locale set to ja_JP.eucJP, this problem
# dose not happen...

[Cause & Solution]
It seems that XStringListToTextProperty is not locale-
aware.  We should use XmbTextListToTextProperty instead.
After I modified pTk/mTk/unix/tkUnixWm.c this way, I can
display Japanese characters in the window title bar 
normally on all platforms I tested (GNOME, KDE, quartz-wm).

Best regards and sorry for my poor English.

p.s.
Here is the diff -c output:

*** tkUnixWm.c.org	2004-03-27 07:03:02.000000000 +0900
--- tkUnixWm.c	2005-05-10 22:03:57.000000000 +0900
***************
*** 691,701 ****
  	string = (wmPtr->title != NULL) ? wmPtr->title : winPtr->nameUid;
  	Tcl_UtfToExternalDString(NULL, string, -1, &ds);
  	string = Tcl_DStringValue(&ds);
! 	if (XStringListToTextProperty((char **)&string, 1,
! 		&textProp)  != 0) {
! 	    XSetWMName(winPtr->display, wmPtr->wrapperPtr->window, &textProp);
! 	    XFree((char *) textProp.value);
! 	}
  	Tcl_DStringFree(&ds);
  
  	TkWmSetClass(winPtr);
--- 691,705 ----
  	string = (wmPtr->title != NULL) ? wmPtr->title : winPtr->nameUid;
  	Tcl_UtfToExternalDString(NULL, string, -1, &ds);
  	string = Tcl_DStringValue(&ds);
! 	XmbTextListToTextProperty(
! 		winPtr->display,
! 		(char **)&string,
! 		1,
! 		XStdICCTextStyle,
! 		&textProp
! 	);
! 	XSetWMName(winPtr->display, wmPtr->wrapperPtr->window, &textProp);
! 	XFree((char *) textProp.value);
  	Tcl_DStringFree(&ds);
  
  	TkWmSetClass(winPtr);
***************
*** 3102,3113 ****
  
  	    Tcl_UtfToExternalDString(NULL, wmPtr->title, -1, &ds);
              string = Tcl_DStringValue(&ds);
! 	    if (XStringListToTextProperty(&string, 1,
! 		    &textProp)  != 0) {
! 		XSetWMName(winPtr->display, wmPtr->wrapperPtr->window,
! 			&textProp);
! 		XFree((char *) textProp.value);
! 	    }
  	    Tcl_DStringFree(&ds);
  	}
      }
--- 3106,3120 ----
  
  	    Tcl_UtfToExternalDString(NULL, wmPtr->title, -1, &ds);
              string = Tcl_DStringValue(&ds);
! 	    XmbTextListToTextProperty(
! 		winPtr->display,
! 		&string,
! 		1,
! 		XStdICCTextStyle,
! 		&textProp
! 	    );
! 	    XSetWMName(winPtr->display, wmPtr->wrapperPtr->window, &textProp);
! 	    XFree(textProp.value);
  	    Tcl_DStringFree(&ds);
  	}
      }