blob: d84958bd924af97af7d96df6e5c2a2f98b0d0fd3 [file] [log] [blame]
// 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.focus;
using fuchsia.ui.views;
/// 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.
resource table FocusChain {
/// 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: vector<fuchsia.ui.views.ViewRef> focus_chain;
};
/// A FocusChainListener receives an updated FocusChain when focus changes.
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.
OnFocusChange(FocusChain focus_chain) -> ();
};
/// A FocusChainListenerRegistry allows listening to FocusChain updates.
[Discoverable]
protocol FocusChainListenerRegistry {
Register(FocusChainListener listener);
};