// 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();
};
