| // 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; |
| |
| using fuchsia.input.report as device; |
| using zx; |
| |
| const MOUSE_MAX_EVENT uint32 = 128; |
| |
| /// A method for a client to receive mouse pointer events. |
| /// |
| /// 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; |
| /// mouse movement 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 MouseSource { |
| /// A method for a client to receive mouse 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. |
| /// |
| /// Event times. The timestamps on each event in the event vector are *not* |
| /// guaranteed monotonic; 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 |MouseEvent| carries |ViewParameters|, these |
| /// parameters apply to successive |MousePointerSample|s until the next |
| /// |ViewParameters|. |
| Watch() -> (struct { |
| events vector<MouseEvent>:MOUSE_MAX_EVENT; |
| }); |
| }; |
| |
| /// The self-sufficient, self-consistent collection of pointer-related data, |
| /// sent from server to client. |
| type MouseEvent = table { |
| /// The time this event was observed. |
| /// Required. |
| 1: timestamp zx.time; |
| |
| /// 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: view_parameters ViewParameters; |
| |
| /// A description of the mouse device, sufficient to correctly interpret |
| /// the capabilities and usage intent of the device. |
| /// - It is issued once per device. |
| 3: device_info MouseDeviceInfo; |
| |
| /// A description of each sampled data point in a mouse event stream. |
| /// |
| /// Issuance policy. There are two dispatch modes, "hover" and "latched". |
| /// Hover mode is default, and the stream is dispatched in fragments to the |
| /// visible client that each mouse event hovers above. Latched mode directs |
| /// the stream to a single client (regardless of view boundary) until |
| /// unlatched. Latched mode is typically toggled when the user presses the |
| /// primary mouse button, but is ultimately a product-specific policy. |
| 4: pointer_sample MousePointerSample; |
| |
| /// The signal for view entry/exit in hover mode. |
| /// - It is issued on hover entry into a view, and hover exit from a view. |
| 5: stream_info MouseEventStreamInfo; |
| |
| /// An identifier to correlate this event's send/receive occurrence across |
| /// component boundaries or abstraction layers. |
| 6: trace_flow_id uint64; |
| }; |
| |
| /// The valid values of relative motion for a mouse device. |
| /// - The ranges are placed in (x, y) order. |
| alias RelativeMotionRange = array<device.Axis, 2>; |
| |
| /// Information about a device that issues a mouse event stream. |
| type MouseDeviceInfo = table { |
| /// An identifier for the mouse device that issues a mouse event stream. |
| /// Required. |
| 1: id uint32; |
| |
| /// Range of relative movement values issued by the device. |
| 5: relative_motion_range RelativeMotionRange; |
| |
| /// Range of vertical scroll values issued by the device. |
| 2: scroll_v_range device.Axis; |
| |
| /// Range of horizontal scroll values issued by the device. |
| 3: scroll_h_range device.Axis; |
| |
| /// Button identifiers issued by the device, in priority order. |
| 4: buttons vector<uint8>:device.MOUSE_MAX_NUM_BUTTONS; |
| }; |
| |
| /// The relative motion performed by a mouse device. |
| /// - The valid range is defined in [`MouseDeviceInfo.RelativeMotionRange`]. |
| /// - The values are placed in (x, y) order. |
| alias RelativeMotion = array<float32, 2>; |
| |
| /// A description of each sampled data point in a mouse event stream. |
| /// |
| /// `MousePointerSample` may bundle multiple state changes into one event. |
| /// For example, if user scrolls mouse wheel and presses the left buttton |
| /// down at the same time, client may receive scroll and button state changes |
| /// together in 1 event, or receive button change and scroll change in |
| /// separate events. |
| type MousePointerSample = table { |
| /// An identifier for the mouse device that issues a mouse event stream. |
| /// Required. |
| 1: device_id uint32; |
| |
| /// The position of this event, in the viewport's coordinate system. |
| /// Required. |
| 2: position_in_viewport Point2; |
| |
| /// The relative movement performed, independent of the viewport's |
| /// coordinate system. |
| 6: relative_motion RelativeMotion; |
| |
| /// Relative vertical scrolling displacement by detent. |
| 3: scroll_v int64; |
| |
| /// Relative horizontal scrolling displacement by detent. |
| 4: scroll_h int64; |
| |
| /// Recommended vertical scrolling displacement by physical pixel, it is |
| /// computed with accelerator, detent / mm to pixel ratio, etc. |
| 7: scroll_v_physical_pixel float64; |
| |
| /// Recommended horizontal scrolling displacement by physical pixel, it |
| /// is computed with accelerator, detent / mm to pixel ratio, etc. |
| 8: scroll_h_physical_pixel float64; |
| |
| /// Indicated if the scroll event is from a precision scroll device (HI_RES |
| /// mouse or touchpad). Clients may want to play interpolation animations |
| /// on non precision scroll device for smooth scrolling. |
| 9: is_precision_scroll bool; |
| |
| /// Identifiers of currently pressed buttons. |
| 5: pressed_buttons vector<uint8>:device.MOUSE_MAX_NUM_BUTTONS; |
| }; |
| |
| /// The status of a mouse event stream, sent from server to client. |
| /// |
| /// Invariant: a client's mouse events are bracketed by |
| /// [`MouseViewStatus.ENTERED`] and [`MouseViewStatus.EXITED`]. |
| /// |
| type MouseEventStreamInfo = struct { |
| /// An identifier for the mouse device that issues a mouse event stream. |
| device_id uint32; |
| |
| /// The mouse event stream's enter/exit status, sent from server to client. |
| status MouseViewStatus; |
| }; |
| |
| /// A description of mouse event stream's relationship to this view. |
| type MouseViewStatus = strict enum { |
| /// The stream is directed towards this view. |
| ENTERED = 1; |
| |
| /// The stream is directed away from this view. |
| EXITED = 2; |
| }; |