// 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;

// Scenic.TakeScreenshot() returns a raw BGRA formatted image in this struct.
struct ScreenshotData {
    fuchsia.images.ImageInfo info;
    fuchsia.mem.Buffer data;
};

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

    // Get information about the SceneManager's primary display.
    // TODO(MZ-453): in the future there will probably be a DisplayManager, and
    // info about which displays to use will be provided to the SceneManager.
    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;
