入力が届くまでを追う
入力は、ヒットテストからジェスチャへ流れる
Section titled “入力は、ヒットテストからジェスチャへ流れる”入力は、フレームの先頭でウィジェットに届きます。WidgetBinding.BeginFrame は、DrawFrame の前に FlushPointerEvents を呼びます。流れは次のとおりです。
OverlayWindow.PollInputEventsが、オーバーレイ宛の OpenVR のイベントをポーリングする。入力源がRawPointerEventを発火し、PointerControllerのキューに積む。デスクトップウィンドウでは、GLFW のコールバックが描画スレッドで同じキューに積むPointerController.Flushが、キューを取り出してPointerEventに変換する。変換はFlushを呼んだスレッド(メインスレッド)で行うHandlePointerEventが、RenderView.HitTestでヒットしたノードのパス(ヒットパス)を求める。パスの末尾にWidgetBinding自身を加える- ヒットパスの各ノードへイベントを配る。押下中は、押した時点のヒットパスへ、移動と離す操作を配り続ける
- パスの末尾の
WidgetBinding.HandleEventが、PointerRouterでジェスチャ認識器へイベントを届ける。押下ではGestureArenaの参加受付を締め切り、離す操作では未確定のアリーナの既定勝者を確定する
認識器は src/FloatSoda/Gesture/ にあります。ウィジェットとして使うのは GestureDetector や Listener です。
オーバーレイのうち、ポインターが届くのはダッシュボードだけです。エンジン層の OverlayWindow が入力源を作るのが、ダッシュボードのときだけだからです。ほかのオーバーレイへの接続は、Issue で追跡しています(追跡: #182)。
OpenVR のイベントがポインター入力になるまでは、エンジン層 と OVR 層 の担当です。ウィジェット側の仕事は、PointerEvent を受け取るところから始まります。
関連するページ
Section titled “関連するページ”- フレームワーク層: Widget、Element、RenderObject と、差分更新
- エンジン層: ポインターの入力源と、y 座標の向き
- 1フレームが SteamVR に届くまで: 入力が逆向きに流れる段の全体