息抜きにマウスの対応

本業の息抜きに先の「タッチパネルでドラッグの暴発を防ぐ」を、ちょっと。


まず推測。

  • Morphはマウスのup,down,moveのイベントをそれぞれ別途受け取っている
  • Morphはイベントの来る順番で内部状態を遷移している->ウィンドウの端にあったら「サイズ変更状態」とか

この推測を裏付けるためにMorphに対して調べてみました。この際、Morph以外は考えない方向で(^^;)。
まず、判ってるところから。Morph>>mouseDown:で、マウスダウンのイベントを取ることができると言うことは、Morphを使ったプログラムの作り方から判ってるのでここから調べます。
Senders of で見ると、Morph>>handleMouseDown:から呼ばれていることが判ります。
じゃあ、今度はMorph>>handleMouseDown:はどこから呼ばれているかと見ると、MouseButtonEvent>>sentTo:から呼ばれています。
コメントを見る限りでは、「MouseEventの継承先であるMouseButtonEventが、他のMorphにイベントをdispatchしている」と、読めます。


と、なると、以下の方法論を実現するにはここをちょちょいと書き換えてやれば行けるのではないか、と思われます。

  • イベントを横取りして(ないしはイベントを送る所を書き換えて)downイベントの前にmoveのイベントを送る方法を考える。

試しに書き換えてみました。
元は

type == #mouseDown ifTrue:[^anObject handleMouseDown: self].

これを

type == #mouseDown ifTrue:[
"Changed by Florian"
anObject handleMouseMove: self.
^anObject handleMouseDown: self].


結果。
ダメでした(^^;)。特に変化無し。ウィンドウリサイズのカーソルになっている時に、離れた任意の位置からドラッグしはじめると、やっぱりリサイズされちゃいます。うーむ、前提が間違ってるのかなぁ。
ちなみに、これをやるとなぜかSystemBrowserのコードペインにフォーカスを移すことがすごーく困難になります。タップするだけでは移ってくれないのです。
ま、どのみちこれではダメでしたって事で息抜きおしまい。どうすればいいんだろうなぁ? ゆっくり試してみましょう。