// Copyright 2021 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.session.scene;

using fuchsia.ui.app;
using fuchsia.ui.policy;
using fuchsia.ui.views;

/// A protocol used to manage the scene graph of the session.
///
/// This protocol is exposed by the `scene_manager` component. The `scene_manager`
/// component configures and constructs a scene graph in Scenic. A product may
/// use the `scene_manager` to reduce Scenic-related configuration code in their session.
[Discoverable]
protocol Manager {
    /// Sets the root view of the scene graph to the view provided by `view_provider`.
    ///
    /// Subsequent calls will remove the existing root view, as well as any of its
    /// descendants from the scene graph. The root view is shared between all clients
    /// of `Manager`.
    ///
    /// Returns a `fuchsia.ui.views.ViewRef` to the view provided by `view_provider`.
    SetRootView(fuchsia.ui.app.ViewProvider view_provider) -> (fuchsia.ui.views.ViewRef view_ref);

    /// Focuses the provided `view_ref`.
    ///
    /// Returns once the view associated with `view_ref` has been focused, or if there
    /// was an error focusing the specified view.
    RequestFocus(fuchsia.ui.views.ViewRef view_ref) -> () error fuchsia.ui.views.Error;

    /// Adds a listener for "raw" pointer events.
    ///
    /// This exists to support legacy clients, and new uses are discouraged. This method
    /// will be removed prior to the inclusion of `Manager` in the SDK.
    CapturePointerEvents(fuchsia.ui.policy.PointerCaptureListenerHACK listener);
};
