chromium/components/exo/surface_delegate.h

// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_EXO_SURFACE_DELEGATE_H_
#define COMPONENTS_EXO_SURFACE_DELEGATE_H_

#include "chromeos/ui/frame/caption_buttons/snap_controller.h"
#include "chromeos/ui/frame/multitask_menu/float_controller_base.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/size_f.h"

namespace exo {
class SecurityDelegate;
class Surface;

// Frame types that can be used to decorate a surface.
enum class SurfaceFrameType {
  NONE,
  NORMAL,
  SHADOW,
  AUTOHIDE,
  OVERLAY,
  OVERLAP
};

// Handles events on surfaces in context-specific ways.
class SurfaceDelegate {
 public:
  // Called when surface was requested to commit all double-buffered state.
  virtual void OnSurfaceCommit() = 0;

  // Returns true if surface is in synchronized mode. ie. commit of
  // double-buffered state should be synchronized with parent surface.
  virtual bool IsSurfaceSynchronized() const = 0;

  // Returns true if surface should receive input events.
  virtual bool IsInputEnabled(Surface* surface) const = 0;

  // Called when surface was requested to use a specific frame type.
  virtual void OnSetFrame(SurfaceFrameType type) = 0;

  // Called when surface was requested to use a specific set of frame colors.
  virtual void OnSetFrameColors(SkColor active_color,
                                SkColor inactive_color) = 0;

  // Called when a new "parent" was requested for this surface. |position|
  // is the initial position of surface relative to origin of parent.
  virtual void OnSetParent(Surface* parent, const gfx::Point& position) = 0;

  // Called when surface was requested to set a specific startup ID label.
  virtual void OnSetStartupId(const char* startup_id) = 0;

  // Called when surface was requested to set a specific application ID label.
  virtual void OnSetApplicationId(const char* application_id) = 0;

  // Whether to show/hide the shelf when fullscreen. If true, the titlebar/shelf
  // will show when the mouse moves to the top/bottom of the screen. If false
  // (plain fullscreen), the titlebar and shelf are always hidden.
  virtual void SetUseImmersiveForFullscreen(bool value) = 0;

  // Called when the surface's application wants it to be activated.
  virtual void OnActivationRequested() = 0;

  // Called when the new outoupt resource is created.
  virtual void OnNewOutputAdded() = 0;

  // Called when surface was requested to start resize.
  virtual void OnSetServerStartResize() = 0;

  // Called to show the snap preview to the primary or secondary position, or
  // to hide it.
  virtual void ShowSnapPreviewToPrimary() = 0;
  virtual void ShowSnapPreviewToSecondary() = 0;
  virtual void HideSnapPreview() = 0;

  // Called when the client was snapped to primary or secondary position, and
  // reset.
  virtual void SetSnapPrimary(float snap_ratio) = 0;
  virtual void SetSnapSecondary(float snap_ratio) = 0;
  virtual void UnsetSnap() = 0;

  // Whether the current client window can go back, as per its navigation list.
  virtual void SetCanGoBack() = 0;
  virtual void UnsetCanGoBack() = 0;

  // Called when surface was requested to enter pip.
  virtual void SetPip() = 0;
  virtual void UnsetPip() = 0;

  // Floats the shell surface. The bounds of the surface are determined by
  // `float_start_location`.
  virtual void SetFloatToLocation(
      chromeos::FloatStartLocation float_start_location) = 0;

  // Called when surface was requested to maintain an aspect ratio.
  virtual void SetAspectRatio(const gfx::SizeF& aspect_ratio) = 0;

  // Called when surface was requested to move the window to a desk at
  // |desk_index|.
  virtual void MoveToDesk(int desk_index) = 0;

  // Called when surface was requested to be visible on all workspaces.
  virtual void SetVisibleOnAllWorkspaces() = 0;

  // Called to set the initial workspace to restore a window to the
  // corresponding desk.
  virtual void SetInitialWorkspace(const char* initial_workspace) = 0;

  // Pins/locks a window to the screen so that the user cannot do anything
  // else before the mode is released. If trusted is set, it is an invocation
  // from a trusted app like a school test mode app.
  virtual void Pin(bool trusted) = 0;

  // Releases the pinned mode and allows the user to do other things again.
  virtual void Unpin() = 0;

  // Sets the system modality.
  virtual void SetSystemModal(bool modal) = 0;

  // Sets the top inset (header height).
  virtual void SetTopInset(int height) = 0;

  // Returns the SecurityDelegate which this surface should use to perform
  // security-sensitive operations. See go/secure-exo-ids for more information.
  virtual SecurityDelegate* GetSecurityDelegate() = 0;

 protected:
  virtual ~SurfaceDelegate() {}
};

}  // namespace exo

#endif  // COMPONENTS_EXO_SURFACE_DELEGATE_H_