// Copyright 2019 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_CLIENT_CONTROLLED_ACCELERATORS_H_
#define COMPONENTS_EXO_CLIENT_CONTROLLED_ACCELERATORS_H_

#include "base/memory/raw_ptr.h"
#include "components/exo/client_controlled_shell_surface.h"
#include "ui/aura/window.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/views/focus/focus_manager.h"

namespace exo {

enum class ClientControlledAcceleratorAction {
  ZOOM_IN,
  ZOOM_OUT,
  ZOOM_RESET,
};

class ClientControlledShellSurface;

class ClientControlledAcceleratorTarget : public ui::AcceleratorTarget {
 public:
  explicit ClientControlledAcceleratorTarget(
      ClientControlledShellSurface* surface);

  ClientControlledAcceleratorTarget(const ClientControlledAcceleratorTarget&) =
      delete;
  ClientControlledAcceleratorTarget& operator=(
      const ClientControlledAcceleratorTarget&) = delete;

  ~ClientControlledAcceleratorTarget() override;

  void RegisterAccelerator(const ui::Accelerator& accelerator,
                           ClientControlledAcceleratorAction action);
  void RegisterAccelerator(ui::Accelerator&& accelerator,
                           ClientControlledAcceleratorAction action);

  // ui::AcceleratorTarget interface implementation.
  bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
  bool CanHandleAccelerators() const override;

 private:
  raw_ptr<ClientControlledShellSurface> surface_;
  std::map<ui::Accelerator, ClientControlledAcceleratorAction> accelerators_;
};

}  // namespace exo

#endif  // COMPONENTS_EXO_CLIENT_CONTROLLED_ACCELERATORS_H_
