作者: Koichi Yamamoto
日時: 2002/7/15(14:10)
こんにちは、山本です。

"Peg <peg@...>"さんは書きました:
> > Pegさん、TSNETでははじめまして!
> ども。 最近、閑古鳥が鳴いている感じなので… もとい、

最近はSF.jpの翻訳MLの方に活動拠点が移ってしまって(^^;

> > Windows XP上で確認してみましたがやはり同じような現象が確認できました。
> > 簡単な入力テストしかしていなかったので、ちっとも気が付きませんでした。
> うーん、やはり発生しましたか。
> 実はコレ、IME のテストをやるつもりでは無く、socket を利用した
> プログラム(某伺かクライアントの Tcl/Tk 版)を作って動かしていた時に、
> たまたま見つかったものなんです。
> 僕も IME に関しては簡単な動作テストしかやってないです。

私もTk8.4のIMEに関しては簡単な動作テストしかやってないです。
# ↑今明かされる衝撃の事実だったりして(--;

今回の現象は、entry widgetの中の文字が左側にいくつか
隠れると発生する現象です。つまり、カーソル位置を計算する
ときにオフセットの加減算が抜けてしまったことが原因です。
# だから1文字隠れると1文字分だけ、2文字隠れると2文字分だけ
# IMEの変換ウィンドウが右方向に移動してしまうのです。

ということで、お馴染みのパッチです。私の手元にあるソースが
古い(5月始め頃のCVSかな?)ため行番号はアテになりませんけど、
tkEntry.cの中でTk_SetCaretPosを探せばどこを直せばよいか
すぐに判ります。


*** generic/tkEntry.c.orig	Fri Apr 05 17:43:22 2002
--- generic/tkEntry.c	Mon Jul 15 13:38:06 2002
***************
*** 1897,1907 ****
      if ((entryPtr->state == STATE_NORMAL) && (entryPtr->flags & GOT_FOCUS)) {
  	Tk_CharBbox(entryPtr->textLayout, entryPtr->insertPos, &cursorX, NULL,
  		NULL, NULL);
  	Tk_SetCaretPos(entryPtr->tkwin, cursorX, baseY - fm.ascent,
  		fm.ascent + fm.descent);
  	if (entryPtr->insertPos >= entryPtr->leftIndex) {
- 	    cursorX += entryPtr->layoutX;
- 	    cursorX -= (entryPtr->insertWidth)/2;
  	    if (cursorX < xBound) {
  		if (entryPtr->flags & CURSOR_ON) {
  		    Tk_Fill3DRectangle(tkwin, pixmap, entryPtr->insertBorder,
--- 1897,1907 ----
      if ((entryPtr->state == STATE_NORMAL) && (entryPtr->flags & GOT_FOCUS)) {
  	Tk_CharBbox(entryPtr->textLayout, entryPtr->insertPos, &cursorX, NULL,
  		NULL, NULL);
+     cursorX += entryPtr->layoutX;
+     cursorX -= (entryPtr->insertWidth)/2;
  	Tk_SetCaretPos(entryPtr->tkwin, cursorX, baseY - fm.ascent,
  		fm.ascent + fm.descent);
  	if (entryPtr->insertPos >= entryPtr->leftIndex) {
  	    if (cursorX < xBound) {
  		if (entryPtr->flags & CURSOR_ON) {
  		    Tk_Fill3DRectangle(tkwin, pixmap, entryPtr->insertBorder,


他のウィジェットではどうでしょう?
text widget(-wrap none)は大丈夫そうですけど...

--
Koichi Yamamoto, 
http://www3.ocn.ne.jp/~yamako/