| // 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. |
| // TODO(https://fxbug.dev/365602422): Either remove the dependency from CTF |
| // tests and uncomment this line or make this library stable. |
| // @available(added=HEAD) |
| library fuchsia.ui.focus; |
| |
| using fuchsia.ui.views; |
| using zx; |
| |
| /// A FocusChain tracks the status of the View hierarchy as View focus changes. |
| /// |
| /// Reception. Only certain components may receive a FocusChain, as it |
| /// captures global information about the scene graph. |
| type FocusChain = resource table { |
| /// The `focus_chain` is reported in order of dominance in the View |
| /// hierarchy; each adjacent pair of elements represents a |
| /// parent-child relationship. |
| /// |
| /// The `focus_chain` MAY be unset when `FocusChain` message is received, if |
| /// the message is sent very early in the scene setup, before the first |
| /// view is available. |
| /// |
| /// When `focus_chain` is set, however, the root View is always present |
| /// and occupies slot 0 in the `focus_chain`. The newly-focused View |
| /// receives a `fuchsia.ui.input.FocusEvent` and occupies the final slot |
| /// in the vector. |
| /// |
| /// If a View gets destroyed, a `FocusChain` holder that listens will |
| /// receive a `ZX_EVENTPAIR_PEER_CLOSED` signal on the corresponding |
| /// `ViewRef`. |
| /// |
| /// ## Invalidation. |
| /// |
| /// A FocusChain is invalid if any one if its ViewRefs is |
| /// invalid. |
| 1: focus_chain vector<fuchsia.ui.views.ViewRef>; |
| }; |
| |
| /// A FocusChainListener receives an updated FocusChain when focus changes. |
| closed protocol FocusChainListener { |
| /// Sent when a focus change occurs. Since `focus_chain` may contain an |
| /// empty update, every handler MUST respond to the message even |
| /// if its contents are not immediately useful. |
| strict OnFocusChange(resource struct { |
| focus_chain FocusChain; |
| }) -> (); |
| }; |
| |
| /// A FocusChainListenerRegistry allows listening to FocusChain updates. |
| @discoverable |
| closed protocol FocusChainListenerRegistry { |
| strict Register(resource struct { |
| listener client_end:FocusChainListener; |
| }); |
| }; |
| |
| /// A `FocusKoidChain` serves almost the same purpose as a `FocusChain`, but is |
| /// intended for applications that merely need to identify views in the chain |
| /// and do not need to watch their state. |
| type FocusKoidChain = table { |
| 1: focus_chain vector<zx.Koid>:MAX; |
| }; |
| |
| /// The `FocusChainProvider` protocol allows privileged clients to watch for |
| /// focus chain updates. |
| /// |
| /// It is intended as an experimental solution for providing focus information |
| /// to the clipboard. |
| @discoverable |
| closed protocol FocusChainProvider { |
| /// Subscribe to changes in the focus chain (koids only) with a hanging-get |
| /// pattern. |
| /// |
| /// The server responds immediately with the initial state, and afterwards |
| /// whenever a change occurs. Updates are not queued up for slow clients; |
| /// only the latest state is sent. |
| /// |
| /// It is invalid to call this method while a previous call is pending. |
| /// Doing so will cause the server end of the protocol to be closed. |
| strict WatchFocusKoidChain(table {}) -> (FocusKoidChain); |
| }; |