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なしで動くようになったとき、この変換ロジックはどう変えないといけなくなる?