// Copyright 2015 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.

library fuchsia.ui.input;

// TODO(jeffbrown): Redesign input event representation later.

// The input dispatcher service allows the component which owns and controls
// a view tree to dispatch input events to the views that it contains.
//
// This service can be retrieved from the |ViewTree| service provider.
//
// TODO(jeffbrown): Elaborate how input devices are registered with the
// dispatcher so that applications can query their capabilities and distinguish
// input coming from multiple sources concurrently.
[Discoverable]
interface InputDispatcher {
  // Dispatches an event through the view tree.  The dispatcher will deliver
  // the event to the appropriate views based on the current state of the
  // tree, such as focus and the structure of the scene graph.
  //
  // The dispatcher expects the stream of events that it receives to be
  // internally consistent.  For example, each pointer down must be matched
  // by a corresponding pointer up.
  //
  // It is an error to supply an inconsistent stream events to the dispatcher;
  // the connection will be closed.
  //
  // TODO(jeffbrown): Is this the right policy?  It would certainly help
  // diagnose faults earlier.
  // TODO(jeffbrown): Decide whether there should be a way to track the
  // progress of input events.  For testing purposes it is often desirable
  // to block the test until a sequence of events have been delivered and
  // handled.  However these same mechanisms have proven to be brittle in
  // the past so it might be better to solve the problem some other way.
  1: DispatchEvent(InputEvent event);
};
