C++程序  |  92行  |  2.89 KB

// Copyright 2014 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.

#ifndef ATHENA_INPUT_PUBLIC_ACCELERATOR_MANAGER_H_
#define ATHENA_INPUT_PUBLIC_ACCELERATOR_MANAGER_H_

#include "athena/athena_export.h"
#include "base/memory/scoped_ptr.h"
#include "ui/events/keycodes/keyboard_codes.h"

namespace ui {
class Accelerator;
}

namespace views {
class FocusManager;
}

namespace athena {

enum TriggerEvent {
  TRIGGER_ON_PRESS,
  TRIGGER_ON_RELEASE,
};

// Accelerator flags.
enum AcceleratorFlags {
  AF_NONE = 0,
  // Used for accelerators that should not be fired on auto repeated
  // key event, such as toggling fullscrren.
  AF_NON_AUTO_REPEATABLE = 1 << 0,
  // Most key events are sent to applications first as they may
  // want to consume them. Reserverd accelerators are reserved for OS
  // and cannot be consumed by apps. (such as window cycling)
  AF_RESERVED = 1 << 1,
  // Used for accelerators that are useful only in debug mode.
  AF_DEBUG = 1 << 2,
};

struct AcceleratorData {
  // true if the accelerator should be triggered upon ui::ET_KEY_PRESSED
  TriggerEvent trigger_event;
  ui::KeyboardCode keycode;  // KeyEvent event flags.
  int keyevent_flags;        // Combination of ui::KeyEventFlags
  int command_id;            // ID to distinguish
  int accelerator_flags;     // Combination of AcceleratorFlags;
};

// An interface that implements behavior for the set of
// accelerators.
class ATHENA_EXPORT AcceleratorHandler {
 public:
  virtual ~AcceleratorHandler() {}

  virtual bool IsCommandEnabled(int command_id) const = 0;
  virtual bool OnAcceleratorFired(int command_id,
                                  const ui::Accelerator& accelerator) = 0;
};

class ATHENA_EXPORT AcceleratorManager {
 public:
  // Returns an AccelerarManager for global acelerators.
  static AcceleratorManager* Get();

  // Creates an AcceleratorManager for application windows that
  // define their own accelerators.
  static scoped_ptr<AcceleratorManager> CreateForFocusManager(
      views::FocusManager* focus_manager);

  virtual ~AcceleratorManager() {}

  // Tells if the accelerator is registered with the given flag.  If
  // flags is AF_NONE, it simply tells if the accelerator is
  // registered with any flags.
  virtual bool IsRegistered(const ui::Accelerator& accelerator,
                            int flags) const = 0;

  // Register accelerators and its handler that will be invoked when
  // one of accelerator is fired.
  virtual void RegisterAccelerators(const AcceleratorData accelerators[],
                                    size_t num_accelerators,
                                    AcceleratorHandler* handler) = 0;

  // Enables/Disables accelerators that has a AF_DEBUG flag.
  virtual void SetDebugAcceleratorsEnabled(bool enabled) = 0;
};

}  // namespace athena

#endif  // ATHENA_INPUT_PUBLIC_ACCELERATOR_MANAGER_H_