// 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.
  1: 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.
  2: GetDisplayInfo() -> (fuchsia.ui.gfx.DisplayInfo info);
  // Gets an event signaled with displayOwnedSignal or displayNotOwnedSignal
  // when display ownership changes.
  3: 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.
  4: TakeScreenshot() -> (ScreenshotData img_data, bool success);
};

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