blob: 7039c8b7b7a3a9a556f4df1da055ef45c7353b9a [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module ash.mojom;
import "ui/gfx/geometry/mojo/geometry.mojom";
import "ui/display/mojo/display.mojom";
// All points, bounds, and insets are in display pixels unless otherwise
// sepcified.
// SetDisplayLayoutInfo or SetDisplayProperties result.
enum DisplayConfigResult {
kSuccess = 0,
kInvalidOperationError,
kInvalidDisplayIdError,
kUnifiedNotEnabledError,
kPropertyValueOutOfRangeError,
kNotSupportedOnInternalDisplayError,
kNegativeValueError,
kSetDisplayModeError,
kInvalidDisplayLayoutError,
kMirrorModeSingleDisplayError,
kMirrorModeSourceIdError,
kMirrorModeDestIdError,
kCalibrationNotAvailableError,
kCalibrationNotStartedError,
kCalibrationInProgressError,
kCalibrationInvalidDataError,
kCalibrationFailedError,
};
// Describes how the displays are laid out.
enum DisplayLayoutMode {
// In normal mode displays are laid out as described by
// DisplayLayoutInfo.layouts.
kNormal = 0,
// In unified desktop mode, a single desktop will be stretched across all
// available displays.
kUnified,
// In mirrored mode, the display defined by DisplayLayoutInfo.mirrorSourceId
// will be mirrored in the displays defined by
// DisplayLayoutInfo.mirrorDestinationIds, or in all other displays if
// mirrorDestinationIds is empty.
kMirrored
};
// Describes a display edge.
enum DisplayLayoutPosition {
kTop = 0,
kRight,
kBottom,
kLeft
};
// Describes an overscan or touch calibration operation.
enum DisplayConfigOperation {
kStart = 0,
kAdjust,
kReset,
kComplete,
kShowNative,
};
// Defines a pair of display + touch points used for touch calibration.
struct TouchCalibrationPair {
// The coordinates of the display point.
gfx.mojom.Point display_point;
// The coordinates of the touch point corresponding to the display point.
gfx.mojom.Point touch_point;
};
// Defines the data required for touch calibration.
struct TouchCalibration {
// Must contain exactly four pairs of touch calibration points.
array<TouchCalibrationPair> pairs;
// Width and height of the display area when the touch calibration was
// performed.
gfx.mojom.Size bounds;
};
// Defines the layout of a single display.
struct DisplayLayout {
// The unique identifier of the display.
string id;
// The unique identifier of the parent display. Empty for the root display.
string parent_id;
// The edge of the display that is shared with the parent display. Ignored for
// the root display.
DisplayLayoutPosition position;
// The offset of the display along the connected edge. 0 indicates that
// the topmost or leftmost corner is aligned.
int32 offset;
};
// Defines the layout mode and details.
struct DisplayLayoutInfo {
// The layout mode to use, see DisplayLayoutMode for details.
DisplayLayoutMode layout_mode;
// Ignored if If layout_mode is not kMirrored. Otherwise, if provided,
// specifies the unique identifier of the source display for mirroring. If
// not provided, mirror_destination_ids will be ignored and default ('normal')
// mirrored mode will be enabled.
string? mirror_source_id;
// Ignored if layout_mode is not kMirrored. Otherwise, if provided, specifies
// the unique identifiers of the displays to mirror the source display. If not
// provided or empty, all displays will mirror the source display.
array<string>? mirror_destination_ids;
// An array of layouts describing a directed graph of displays. Required if
// layout_mode is kNormal or kMirrored and not all displays are mirrored
// ('mixed' mode). Ignored if layout_mode is kUnified.
array<DisplayLayout>? layouts;
};
// EDID extracted parameters. Field description refers to "VESA ENHANCED
// EXTENDED DISPLAY IDENTIFICATION DATA STANDARD (Defines EDID Structure
// Version 1, Revision 4)" Release A, Revision 2 September 25, 2006.
// https://www.vesa.org/vesa-standards
struct Edid {
// Three character manufacturer code, Sec. 3.4.1 page 21.
string manufacturer_id;
// Two byte manufacturer-assigned code, Sec. 3.4.2 page 21.
string product_id;
// Year of manufacture. Sec. 3.4.4 page 22.
int32 year_of_manufacture;
};
// Struct wrapper so that the property can be optional.
struct DisplayRotation {
display.mojom.Rotation rotation;
};
// Defines the properties for a display mode, i.e. a valid size and scale.
struct DisplayMode {
// The display mode size in device independent (user visible) pixels.
gfx.mojom.Size size;
// The display mode size in native pixels.
gfx.mojom.Size size_in_native_pixels;
// The display mode device scale factor.
double device_scale_factor;
// The display mode refresh rate in hertz.
double refresh_rate;
// True if the mode is the display's native mode.
bool is_native;
// True if the mode is interlaced.
bool is_interlaced;
};
// Defines the properties of an individual display, returned by
// GetDisplayLayoutInfo.
struct DisplayUnitInfo {
// The unique identifier of the display.
string id;
// The user-friendly name (e.g. "Acme LCD monitor").
string name;
// EDID properties when available.
Edid? edid;
// True if this is the primary display.
bool is_primary;
// True if this is an internal display.
bool is_internal;
// True if this display is enabled.
bool is_enabled;
// True when the display is in tablet mode.
bool is_tablet_mode;
// True if this display has a touch input device associated with it.
bool has_touch_support;
// True if this display has an accelerometer associated with it.
bool has_accelerometer_support;
// The number of pixels per inch along the x-axis.
double dpi_x;
// The number of pixels per inch along the y-axis.
double dpi_y;
// The display's clockwise rotation.
display.mojom.Rotation rotation;
// The display's logical bounds.
gfx.mojom.Rect bounds;
// The display's ovserscan insets within its screen's bounds.
gfx.mojom.Insets overscan;
// The usable work area of the display within the display bounds. Excludes
// areas of the display reserved for the OS, e.g. the taskbar and launcher.
gfx.mojom.Rect work_area;
// The index of the selected display mode.
int32 selected_display_mode_index;
// The list of available display modes.
array<DisplayMode> available_display_modes;
// The ratio between the display's current and default zoom. i.e. 1.0 is
// is equivalent to 100% zoom, and value 1.5 is equivalent to 150% zoom.
double display_zoom_factor;
// The list of allowed zoom factor values for the display.
array<double> available_display_zoom_factors;
};
// Properties for configuring an individual display, used in
// SetDisplayProperties.
struct DisplayConfigProperties {
// If true, makes the display primary. No-op if set to false.
bool set_primary;
// If provided, sets the display's overscan insets to the provided value.
// Note: overscan values may not be negative or larger than a half of the
// screen's size. Overscan cannot be changed on the internal monitor.
gfx.mojom.Insets? overscan;
// If provided updates the display's rotation.
DisplayRotation? rotation;
// If provided, updates the display's logical bounds origin. Note: when
// updating the display origin, some constraints will be applied. so the final
// bounds origin may be different than the one set. The actual bounds will be
// reflected in DisplayUnitInfo. Cannot be changed on the primary display (or
// if set_primary is true).
gfx.mojom.Point? bounds_origin;
// If non zero, updates the zoom associated with the display. This zoom
// performs relayout and repaint thus resulting in a better quality zoom than
// just performing a pixel by pixel stretch enlargement.
double display_zoom_factor;
// Optional DisplayMode properties to set. This should match one of the
// modes listed in DisplayUnitInfo.available_display_modes. Other custom
// modes may or may not be valid.
DisplayMode? display_mode;
};
// Interface for configuring displays in Chrome OS. Currently this is
// implemented in Ash through classes owned by ash::Shell, but the interface
// should not have any Ash specific dependencies.
interface CrosDisplayConfigController {
// Observers are notified when the display layout or any display properties
// change.
AddObserver(associated CrosDisplayConfigObserver observer);
// Returns the display layout info, including the list of layouts.
GetDisplayLayoutInfo() => (DisplayLayoutInfo info);
// Sets the layout mode, mirroring, and layouts. Returns kSuccess if the
// layout is valid or an error value otherwise.
SetDisplayLayoutInfo(DisplayLayoutInfo info) => (DisplayConfigResult result);
// Returns the properties for all displays. If |single_unified| is true, a
// single display will be returned if the display layout is in unifed mode.
GetDisplayUnitInfoList(bool single_unified) =>
(array<DisplayUnitInfo> info_list);
// Sets |properties| for individual display with identifier |id|. Returns
// Success if the properties are valid or an error value otherwise.
SetDisplayProperties(string id, DisplayConfigProperties properties) =>
(DisplayConfigResult result);
// Enables or disables unified desktop mode. If the current display mode is
// kMirrored the mode will not be changed, if it is kNormal then the mode will
// be set to kUnified.
SetUnifiedDesktopEnabled(bool enabled);
// Starts, updates, completes, or resets overscan calibration for the display
// with identifier |display_id|. If |op| is kAdjust, |delta| describes the
// amount to change the overscan value. Runs the callback after performing the
// operation or on error.
OverscanCalibration(string display_id,
DisplayConfigOperation op,
gfx.mojom.Insets? delta) => (DisplayConfigResult result);
// Starts, completes, or resets touch calibration for the display with
// identifier |display_id|. If |op| is kShowNative shows the native
// calibration UI. Runs the callback after performing the operation or on
// error.
TouchCalibration(string display_id,
DisplayConfigOperation op,
TouchCalibration? calibration) =>
(DisplayConfigResult result);
};
// Interface for clients needing to be informed when the display configuration
// changes.
interface CrosDisplayConfigObserver {
// Called any time the display configuration changes.
OnDisplayConfigChanged();
};