// Copyright 2018 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.scenic;

using fuchsia.images;
using fuchsia.mem;
using fuchsia.ui.gfx;
using fuchsia.ui.views;

/// Scenic.TakeScreenshot() returns a raw BGRA formatted image in
/// sRGB color space and with a non-linear transfer function in this
/// struct.
struct ScreenshotData {
    fuchsia.images.ImageInfo info;
    fuchsia.mem.Buffer data;
};

[Discoverable]
protocol Scenic {
    /// Create a new Session, which is the primary way to interact with Scenic.
    CreateSession(request<Session> session, SessionListener? listener);

    /// Create a new Session, which is the primary way to interact with Scenic.
    ///
    /// In this variant, the caller may register a request for focus management.
    /// The `view_focuser`'s client is coupled to the requested `session`, and
    /// this coupling acts as a security boundary: the ViewRef used as the basis
    /// for authority by `view_focuser` must come from `session`.
    [Transitional]
    CreateSession2(request<Session> session, SessionListener? listener,
                   request<fuchsia.ui.views.Focuser>? view_focuser);

    /// Get information about the Scenic's primary display.
    // TODO(SCN-453): in the future there will probably be a DisplayManager, and
    // info about which displays to use will be provided to the Scenic.
    GetDisplayInfo() -> (fuchsia.ui.gfx.DisplayInfo info);
    /// Gets an event signaled with displayOwnedSignal or displayNotOwnedSignal
    /// when display ownership changes.
    GetDisplayOwnershipEvent() -> (handle<event> ownership_event);

    /// Take a screenshot and return the data in `img_data`. `img_data` will
    /// not contain BGRA data if `success` is false.
    // TODO(SCN-678): The permissions here are too wide (anyone can take a
    // screenshot), we should narrow them.
    TakeScreenshot() -> (ScreenshotData img_data, bool success);
};

const uint32 displayOwnedSignal = 0x02000000;
const uint32 displayNotOwnedSignal = 0x01000000;
