blob: e448f13fbd20b8d9f30ece593c133cd4f6ef679d [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.
@available(added=7)
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.
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.
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(resource struct {
focus_chain FocusChain;
}) -> ();
};
/// A FocusChainListenerRegistry allows listening to FocusChain updates.
@discoverable
protocol FocusChainListenerRegistry {
Register(resource struct {
listener client_end:FocusChainListener;
});
};