// 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.
library fuchsia.ui.display;

using fuchsia.hardware.display;
using zx;

/// Unique identifier for a display.
/// Also serves as a capability, enabling the owner to perform certain
/// operations on displays in the DisplayManager protocol and other protocols
/// (like Scenic).
type DisplayRef = resource struct {
    reference zx.handle:EVENT;
};

// === Mode flags ===

const MODES_MAX_LEN int32 = 256;

// Flag for interlaced display modes.
const MODE_INTERLACED int32 = 0x1;

const IDENTIFIER_MAX_LEN uint32 = 128;
alias DisplayIdentifier = string:IDENTIFIER_MAX_LEN;

type Info = resource table {
    // Unique identifier for the display.
    1: display_ref DisplayRef;

    // Modes supported by the attached display. The first entry is the
    // preferred mode.
    2: modes vector<fuchsia.hardware.display.Mode>:MODES_MAX_LEN;

    3: manufacturer_name DisplayIdentifier;
    4: monitor_name DisplayIdentifier;
};

const DISPLAYS_MAX_LEN int32 = 1024;

/// Display Listener protocol implemented by clients.
protocol DisplayListener {
    /// Called when displays are added. This method will also be called when
    /// the listener is registered for any connected displays.
    OnDisplayAdded(resource struct {
        display Info;
    });

    /// Called when displays are removed.
    OnDisplayRemoved(resource struct {
        display DisplayRef;
    });

    /// Called when the client gains or loses ownership of the displays.
    ///
    /// New clients should assume they do not have ownership of the display
    /// until informed otherwise by this method. Ownership can be lost and
    /// gained more than once.
    OnDisplayOwnershipChanged(resource struct {
        displays vector<DisplayRef>:DISPLAYS_MAX_LEN;
        owned_by_display_controller bool;
    });
};

/// `DisplayManager` is a service that informs the client of new or removed
/// displays and allows changing of display configuration. Every display is
/// associated with a DisplayRef which can also be used as a parameter to other
/// apis (e.g. Scenic).
protocol DisplayManager {
    AddDisplayListener(resource struct {
        listener client_end:DisplayListener;
    });
};
