IMM変換ウィンドウ

http://d.hatena.ne.jp/propella/20050527 のコメント欄にあった、IMM変換ウィンドウが変な場所に出てしまう現象を、直せないか見てみました。昨夜の時点ではいったん断念してしまったのですが、個々の部分問題が興味深かったので、メモを残します。

Squeakでの動き

1. フォーカス移動などのタイミングで、変換ウィンドウ位置設定処理を起動する
  + HandMorph>>newKeyboardFocus:
  + TextMorph>>handleInteraction:fromEvent: または TextMorphForEditView>>mouseUp
   ---> TextMorph>>setCompositionWindow

2. 変換ウィンドウ位置設定処理
2.1 CompositionWindowManagerのシングルトンインスタンスを取得する
  HandMorph>>compositionWindowManager
   HandMorph>>(class)conmpositionWindowManager
    CompositionWindowManagerをクラス変数から返す
   まだ作成していなければ返す

2.2 フォーカスがあるMorphを指定して位置設定処理を行う
 ImmWin32>>keyboardFocusForAMorph:   (Win32の場合)
 各種Morph>>prefereredKeyboardPosition キー入力の座標値を得る
 Imm>>setCompositionWindowPositionX:y:

Tweakでどうするか?

今は、位置設定が呼び出されていないのでおかしい。原理的にはMorphicと同様のことをすればいいはず。以下はその部分問題です。

  • Tweak世界で、変換ウィンドウ位置設定処理を呼び出す適切な場所。プロトコルとして、適切な場所でイベントを発生してくれるなら、あちこちにパッチを当てなくてすむのですがね。
  • クラス変数は廃止されそう(http://d.hatena.ne.jp/propella/20050523/p1)ということだが、CompositionWindowManagerのシングルトンをどう管理するのが正しいか?Gammaのパターン本読み返してみますか...
  • prefereredKeyboardPositionを実装するとして、それをあちこちのクラスにつくらないようにするには?最初、「コスチュームもプレイヤ」なのだから、CPlayerに作ればいいと思っていたのですが、CPrimitiveCostumeはCPlayerのサブクラスでないのでだめでした。
  • Tweak世界の座標系をディスプレイ座標系に変換するには?今は、Morphic世界にTweakのウィンドウを開いていますが、TweakがMorphicなしで動くようになったとき、この変換ロジックはどう変えないといけなくなる?