// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/ui/scenic/lib/input/input_system.h"

namespace scenic_impl::input {

InputSystem::InputSystem(sys::ComponentContext* context, inspect::Node& inspect_node,
                         RequestFocusFunc request_focus)
    : request_focus_(std::move(request_focus)),
      hit_tester_(view_tree_snapshot_, inspect_node),
      mouse_system_(context, view_tree_snapshot_, hit_tester_,
                    [this](zx_koid_t koid) { request_focus_(koid); }),
      touch_system_(context, view_tree_snapshot_, hit_tester_, inspect_node),
      pointerinjector_registry_(
          context,
          /*inject_touch_exclusive=*/
          [&touch_system = touch_system_](const InternalTouchEvent& event, StreamId stream_id) {
            touch_system.InjectTouchEventExclusive(event, stream_id);
          },
          /*inject_touch_hit_tested=*/
          [&touch_system = touch_system_](const InternalTouchEvent& event, StreamId stream_id) {
            touch_system.InjectTouchEventHitTested(event, stream_id);
          },
          /*inject_mouse_exclusive=*/
          [&mouse_system = mouse_system_](const InternalMouseEvent& event, StreamId stream_id) {
            mouse_system.InjectMouseEventExclusive(event, stream_id);
          },
          /*inject_mouse_hit_tested=*/
          [&mouse_system = mouse_system_](const InternalMouseEvent& event, StreamId stream_id) {
            mouse_system.InjectMouseEventHitTested(event, stream_id);
          },
          // Explicit call necessary to cancel mouse stream, because mouse stream itself does not
          // track phase.
          /*cancel_mouse_stream=*/
          [&mouse_system = mouse_system_](StreamId stream_id) {
            mouse_system.CancelMouseStream(stream_id);
          },
          inspect_node.CreateChild("PointerinjectorRegistry")) {}

}  // namespace scenic_impl::input
