| // Copyright 2020 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.pointer; |
| |
| const uint32 MAX_EVENT = 128; |
| |
| /// A method for a client to receive touch pointer events and respond in a |
| /// global gesture disambiguation protocol. |
| /// |
| /// The position of a pointer event is defined in the context of a viewport, |
| /// situated in the view. The dimensions of the view and viewport, and their |
| /// spatial relationship (defined with a transform matrix), are supplied |
| /// synchronously in a |ViewParameter| table. A view may retrieve a pointer's |
| /// position in its local coordinate system by applying the viewport-to-view |
| /// transform matrix. |
| /// |
| /// The viewport is embedded in an independent and stable coordinate system, |
| /// suitable for interpreting pointer events in a scale-independent manner; a |
| /// swipe will be observed at a constant scale, even under effects such as |
| /// magnification or panning. However, other effects, such as enlargening the |
| /// view's clip bounds, may trigger a change in the viewport extents. |
| protocol TouchEventSource { |
| /// A method for a client to receive touch pointer events. |
| /// |
| /// This call is formulated as a "hanging get" pattern: the client asks for |
| /// a set of recent events, and receives them via the callback. This |
| /// pull-based approach ensures that clients consume events at their own |
| /// pace; events don't clog up the channel in an unbounded manner. |
| /// |
| /// Flow control. The caller is allowed at most one in-flight |Watch| call |
| /// at a time; it is a logical error to have concurrent calls to |Watch|. |
| /// Non-compliance results in channel closure. |
| /// |
| /// Client pacing. The server will dispatch events to the caller on a FIFO, |
| /// lossless, best-effort basis, but the caller must allocate enough time to |
| /// keep up with new events. An unresponsive client may be categorized as |
| /// "App Not Responding" and targeted for channel closure. |
| /// |
| /// Responses. The gesture disambiguation scheme relies on the server |
| /// receiving a |TouchResponse| for each |TouchEvent|.|TouchPointerSample|; |
| /// non-sample events should return an empty |TouchResponse| table to the |
| /// server. Responses for *previous* events are fed to the server on the |
| /// *next* call of |Watch| [1]. Each element in the |responses| vector is |
| /// interpreted as the pairwise response to the event in the previous |
| /// |events| vector; the vector lengths must match. |
| /// |
| /// Initial response. The first call to |Watch| must be an empty vector. |
| /// |
| /// Event times. The timestamps on each event in the event vector are *not* |
| /// guaranteed monotonic; pointer events from different devices may be |
| /// injected into Scenic at different times. Generally, events from a single |
| /// device are expected to have monotonically increasing timestamps. |
| /// |
| /// View parameters. Occasionally, changes in view or viewport require |
| /// notifying the client. If a |TouchEvent| carries |ViewParameters|, these |
| /// parameters apply to successive |TouchPointerSample|s until the next |
| /// |ViewParameters|. |
| /// |
| /// [1] The hanging get pattern enables straightforward API evolution, but |
| /// unfortunately does not admit an idiomatic matching of response to event. |
| Watch(vector<TouchResponse>:MAX_EVENT responses) -> (vector<TouchEvent>:MAX_EVENT events); |
| |
| /// The gesture protocol allows a client to enact a "hold" on an event |
| /// stream, to prevent resolution of event stream ownership, even after the |
| /// stream has finished. This method updates the client's "hold" by |
| /// replacing it with a response that allows ownership resolution to |
| /// proceed. |
| /// |
| /// Flow control. The caller is allowed at most one |UpdateResponse| call |
| /// per event stream, after the event stream has finished. It is a logical |
| /// error to call |UpdateResponse| when a normal response is possible with |
| /// the |Watch| call. |
| /// |
| /// Validity. This TouchResponse must not be another "hold" response, and |
| /// the prior response is expected to be a "hold" response. |
| UpdateResponse(TouchEventStreamId stream, TouchResponse response) -> (); |
| }; |
| |
| /// The self-sufficient, self-consistent collection of pointer-related data, |
| /// sent from server to client. |
| table TouchEvent { |
| /// The time this event was observed. |
| /// Required. |
| 1: zx.time timestamp; |
| |
| /// The parameters of the associated view and viewport, sufficient to |
| /// correctly interpret the position, orientation, magnitude, and |
| /// inter-event distance of pointer events dispatched to a view. |
| /// - It is issued on connection and on change. |
| 2: ViewParameters view_parameters; |
| |
| /// A description of the pointer device, sufficient to correctly interpret |
| /// the capabilities and usage intent of the device. |
| /// - It is issued once per device. |
| 3: TouchDeviceInfo device_info; |
| |
| /// A description of each sampled data point in a pointer event stream. |
| /// - It is issued on every sample in the pointer event stream. |
| 4: TouchPointerSample pointer_sample; |
| |
| /// The result of gesture disambiguation for a pointer event stream. |
| /// - It is issued once per pointer event stream. |
| 5: TouchEventStreamInfo stream_info; |
| |
| /// An identifier to correlate this event's send/receive occurrence across |
| /// component boundaries or abstraction layers. |
| 6: uint64 trace_flow_id; |
| |
| /// Certain clients may receive augmented data. |
| 7: fuchsia.ui.pointer.augment.LocalHitData local_hit_data; |
| }; |
| |
| /// Information about a device that issues touch event streams. |
| table TouchDeviceInfo { |
| /// An identifier for the touch device that issues touch event streams. |
| /// A device may own multiple pointers, each with its own pointer id. |
| /// Required. |
| 1: uint32 id; |
| }; |
| |
| /// A unique identifier for a pointer event stream. |
| struct TouchEventStreamId { |
| /// An identifier for the pointer device that issues pointer event streams. |
| /// A device may own multiple pointers, each with its own |pointer_id|. |
| uint32 device_id; |
| |
| /// An identifier of the pointer that issued this event. It is unique only |
| /// to a specific |device_id|. Each (device_id, pointer_id) pair issues at |
| /// most one pointer event stream at a time. |
| uint32 pointer_id; |
| |
| /// An identifier of the pointer event stream. It is unique only to a |
| /// specific (device_id, pointer_id) pair. |
| uint32 stream_id; |
| }; |
| |
| /// A description of each sampled data point in a pointer event stream. |
| /// All fields are required. |
| table TouchPointerSample { |
| /// The unique stream identifier that this pointer sample belongs to. |
| 1: TouchEventStreamId stream; |
| |
| /// The state of this event in the pointer event stream's state machine. |
| 2: EventPhase phase; |
| |
| /// The position of this event, in the viewport's coordinate system. |
| 3: Point2 position_in_viewport; |
| }; |
| |
| /// The status of a pointer event stream, sent from server to client. |
| struct TouchEventStreamInfo { |
| /// The unique stream identifier that this pointer sample belongs to. |
| TouchEventStreamId stream; |
| |
| /// The pointer event stream's disposition, sent from server to client. |
| TouchEventStreamStatus status; |
| }; |
| |
| /// A description of the touch event stream's relationship to this client. |
| enum TouchEventStreamStatus { |
| /// The client has been denied ownership of the event stream. |
| DENIED = 1; |
| |
| /// The client has been granted ownership of the event stream. |
| GRANTED = 2; |
| }; |
| |
| /// A feedback event per |Event|, sent from client to server. |
| /// |
| /// Only |TouchPointerSample| requires a |TouchResponseType|; for other events, an empty |
| /// |Response| table is sent to the server. |
| table TouchResponse { |
| /// The event stream disposition that a client responds with for a given |
| /// |TouchPointerSample|. |
| 1: TouchResponseType response_type; |
| |
| /// An identifier to correlate this response's send/receive occurrence across |
| /// component boundaries or abstraction layers. |
| 2: uint64 trace_flow_id; |
| }; |
| |
| /// The possible event stream dispositions that a client can respond with to a |
| /// given |TouchPointerSample|. Used as part of a gesture disambiguation scheme. |
| /// |
| /// The responses revolve around the idea of an ownership claim on a pointer event |
| /// stream (i.e., current and future events of that event stream). Clients may |
| /// assert a claim of ownership on the current event stream, but only one |
| /// client's claim is granted by the server; other clients' claims are denied. |
| enum TouchResponseType { |
| /// The client has no further interest in this event stream; it declines |
| /// ownership of the event stream. The client will stop receiving events |
| /// from the pointer event stream. |
| NO = 1; |
| |
| /// The client is interested in this event stream, but needs to see more |
| /// events to decide; the client has not yet claimed ownership of the event |
| /// stream. |
| MAYBE = 2; |
| |
| /// The client is interested in this event stream, but needs to see more |
| /// events to decide; the client has not yet claimed ownership of the event |
| /// stream. During ownership resolution, it exerts its priority over |
| /// lower-priority "maybe" claims, but always loses to a "yes" claim. |
| MAYBE_PRIORITY = 3; |
| |
| /// The client is interested in this event stream, but needs to see more |
| /// events to decide; the client has not yet claimed ownership of the event |
| /// stream. Moreover, it suppresses lower-priority claims that try to |
| /// resolve stream ownership. |
| MAYBE_SUPPRESS = 4; |
| |
| /// The client is interested in this event stream, but needs to see more |
| /// events to decide; the client has not yet claimed ownership of the event |
| /// stream. Moreover, it suppresses lower-priority claims that try to |
| /// resolve stream ownership. During ownership resolution, it exerts its |
| /// priority over lower-priority "maybe" claims, but always loses to a "yes" |
| /// claim. |
| MAYBE_PRIORITY_SUPPRESS = 5; |
| |
| /// The client is interested in this event stream, but needs to see a |
| /// subsequent event stream to decide; the client has not yet claimed |
| /// ownership of the event stream. It prevents ownership resolution when the |
| /// stream ends. |
| HOLD = 6; |
| |
| /// The client is interested in this event stream, but needs to see a |
| /// subsequent event stream to decide; the client has not yet claimed |
| /// ownership of the event stream. It prevents ownership resolution when the |
| /// stream ends. Moreover, it suppresses lower-priority claims that try to |
| /// resolve stream ownership. |
| HOLD_SUPPRESS = 7; |
| |
| /// The client wishes exclusive access to the remaining events in this event |
| /// stream; it claims ownership of the event stream (but that claim may or |
| /// may not be granted). During ownership resolution, it yields its priority |
| /// to lower-priority "yes" claims. |
| YES = 8; |
| |
| /// The client wishes exclusive access to the remaining events in this event |
| /// stream; it claims ownership of the event stream (but that claim may or |
| /// may not be granted). During ownership resolution, it exerts its priority |
| /// over lower-priority "yes" claims. |
| YES_PRIORITY = 9; |
| }; |