こんにちは、山本です。
"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/