|  | // Copyright 2019 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.accessibility; | 
|  |  | 
|  | using fuchsia.math; | 
|  | using fuchsia.ui.input; | 
|  | using zx; | 
|  |  | 
|  | /// Possible ways an accessibility listener can process pointer events. | 
|  | enum EventHandling { | 
|  | /// The listener consumes all the pointer events for (device_id, pointer_id) | 
|  | /// until the next UP event. | 
|  | CONSUMED = 1; | 
|  | /// The listener rejects the remaining pointer events for (device_id, | 
|  | /// pointer_id), and observed (past) and expected (future) pointer events | 
|  | /// until the next UP event are to be sent for regular input dispatch. | 
|  | REJECTED = 2; | 
|  | }; | 
|  |  | 
|  | /// A PointerEvent is a privileged pointer event that has local view and global | 
|  | /// screen coordinates as well as some metadata about the event type. | 
|  | table PointerEvent { | 
|  | /// Time the event was delivered. The time is in nanoseconds and corresponds | 
|  | /// to the uptime of the machine. | 
|  | 1: uint64 event_time; | 
|  | /// ID of the device that captured this event. | 
|  | 2: uint32 device_id; | 
|  | /// ID of the pointer that identifies this event. | 
|  | 3: uint32 pointer_id; | 
|  | /// Type of this event, e.g. touch, mouse, etc. | 
|  | 4: fuchsia.ui.input.PointerEventType type; | 
|  | /// Phase of this event, e.g. add, down, etc. | 
|  | 5: fuchsia.ui.input.PointerEventPhase phase; | 
|  | /// The coordinate of this pointer event in normalized device coordinates. | 
|  | /// Normalized device coordinates have dimensions in the range [-1, 1], | 
|  | /// with (0, 0) being the center of the device and axes aligned with the | 
|  | /// native display. | 
|  | 6: fuchsia.math.PointF ndc_point; | 
|  | /// The viewref koid of the top most view hit for this pointer event. | 
|  | /// This field is set to `ZX_KOID_INVALID` when there is no view hit and | 
|  | /// `local_point` is undefined. | 
|  | 7: zx.koid viewref_koid; | 
|  | /// The point of this pointer event in local view coordinates. | 
|  | 8: fuchsia.math.PointF local_point; | 
|  | }; | 
|  |  | 
|  | /// PointerEventRegistration allows an accessibility service to register a | 
|  | /// pointer event listener, so that it can intercept pointer events before they | 
|  | /// reach clients. | 
|  | [Discoverable] | 
|  | protocol PointerEventRegistry { | 
|  | /// Registers a listener to start receiving incoming pointer events. For | 
|  | /// now, only one listener is allowed and the first to register is honored. | 
|  | Register(PointerEventListener pointer_event_listener); | 
|  | }; | 
|  |  | 
|  | /// A PointerEventListener receives pointer events and decides to consume them | 
|  | /// or not. | 
|  | /// TODO(fxbug.dev/36429): Investigate flow control mechanisms for a11y input events. | 
|  | protocol PointerEventListener { | 
|  | /// Sends a PointerEvent to an accessibility service. An event is returned | 
|  | /// at any time to indicate whether the pointer event stream was consumed / | 
|  | /// rejected for a particular stream of pointer events related to a | 
|  | /// `device_id` and a `pointer_id`. A stream is a sequence of pointer events | 
|  | /// starting with an event with phase DOWN, followed by any number of MOVE, | 
|  | /// ending in an UP phase event. The event can arrive while the stream is in | 
|  | /// progress or when it has already finished. The resulting | 
|  | /// behavior depends on how it was handled, please see EventHandling above. | 
|  | OnEvent(PointerEvent pointer_event); | 
|  |  | 
|  | -> OnStreamHandled(uint32 device_id, uint32 pointer_id, EventHandling handled); | 
|  | }; |