// Copyright 2017 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.policy;

using fuchsia.ui.gfx;
using fuchsia.ui.input;

// |Presentation.CaptureKeyboardEvent| will consume this listener interface and
// call |OnEvent| when the registered keyboard event occurs.
interface KeyboardCaptureListenerHACK {
  1: OnEvent(fuchsia.ui.input.KeyboardEvent event);
};

// |Presentation.CapturePointerEvent| will consume this listener interface and
// call |OnEvent| when a pointer event occurs.
interface PointerCaptureListenerHACK {
  1: OnPointerEvent(fuchsia.ui.input.PointerEvent event);
};

// Allows clients of Presenter.Present() to control a presentation.
// Experimental.
[Discoverable]
interface Presentation {
  // Enable or disable clipping for the Scenic renderer associated with the
  // presentation.
  1: EnableClipping(bool enabled);

  2: UseOrthographicView();
  3: UsePerspectiveView();

  // Set parameters such as the shadow algorithm used to render the scene.
  // NOTE: a single param would be better than an array; see TO-529.
  4: SetRendererParams(vector<fuchsia.ui.gfx.RendererParam> params);

  // Override the intended usage of the display.
  5: SetDisplayUsage(DisplayUsage usage);

  // Rotates the display.
  11: SetDisplayRotation(float32 display_rotation_degrees, bool animate);

  // Override the dimensions of the display. Values must be less than the actual
  // size of the display. If either of the values are 0, then they are ignored
  // and the actual size of the display is used.
  7: SetDisplaySizeInMm(float32 width_in_mm, float32 height_in_mm);

  // This call exists so that base shell can capture hotkeys and do special
  // things with it (e.g., switch a session shell). Phase and modifiers are always
  // matched, and valid (non-zero) code points are matched. If there is no
  // valid code point, the filter will match against the hid usage value.
  // The full KeyboardEvent is supplied to |listener|'s OnEvent.
  // TODO: Figure out the feasibility of this feature and the best place to put
  // it.
  6: CaptureKeyboardEventHACK(fuchsia.ui.input.KeyboardEvent event_to_capture,
                              KeyboardCaptureListenerHACK listener);

  // This call exists so that base shell can capture pointer events.
  // TODO: Figure out the feasibility of this feature and the best place to put
  // it. This call will be replaced by gesture disambiguation system in future.
  10: CapturePointerEventsHACK(PointerCaptureListenerHACK listener);

  // TODO(SCN-650): Determine better place for PresentationMode API.
  8: GetPresentationMode() -> (PresentationMode mode);
  9: SetPresentationModeListener(PresentationModeListener listener);
};

// Screen modes that can be detected via sensor data.
// N.B. We use accelerometers to measure gravity when at rest, so detection is
// limited to earth-relative orientations.
enum PresentationMode {
  CLOSED = 0;
  LAPTOP = 1;
  TABLET = 2;
  TENT = 3;
};

// Tell client that the screen mode has changed, according to sensors.
// N.B. There can be a race where the actual mode continues to change, after
// the listener has been notified. The client must call GetPresentationMode(),
// which will return the latest detected mode.
interface PresentationModeListener {
  1: OnModeChanged();
};