1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef ATHENA_INPUT_PUBLIC_ACCELERATOR_MANAGER_H_
6#define ATHENA_INPUT_PUBLIC_ACCELERATOR_MANAGER_H_
7
8#include "athena/athena_export.h"
9#include "base/memory/scoped_ptr.h"
10#include "ui/events/keycodes/keyboard_codes.h"
11
12namespace ui {
13class Accelerator;
14}
15
16namespace views {
17class FocusManager;
18}
19
20namespace athena {
21
22enum TriggerEvent {
23  TRIGGER_ON_PRESS,
24  TRIGGER_ON_RELEASE,
25};
26
27// Accelerator flags.
28enum AcceleratorFlags {
29  AF_NONE = 0,
30  // Used for accelerators that should not be fired on auto repeated
31  // key event, such as toggling fullscrren.
32  AF_NON_AUTO_REPEATABLE = 1 << 0,
33  // Most key events are sent to applications first as they may
34  // want to consume them. Reserverd accelerators are reserved for OS
35  // and cannot be consumed by apps. (such as window cycling)
36  AF_RESERVED = 1 << 1,
37  // Used for accelerators that are useful only in debug mode.
38  AF_DEBUG = 1 << 2,
39};
40
41struct AcceleratorData {
42  // true if the accelerator should be triggered upon ui::ET_KEY_PRESSED
43  TriggerEvent trigger_event;
44  ui::KeyboardCode keycode;  // KeyEvent event flags.
45  int keyevent_flags;        // Combination of ui::KeyEventFlags
46  int command_id;            // ID to distinguish
47  int accelerator_flags;     // Combination of AcceleratorFlags;
48};
49
50// An interface that implements behavior for the set of
51// accelerators.
52class ATHENA_EXPORT AcceleratorHandler {
53 public:
54  virtual ~AcceleratorHandler() {}
55
56  virtual bool IsCommandEnabled(int command_id) const = 0;
57  virtual bool OnAcceleratorFired(int command_id,
58                                  const ui::Accelerator& accelerator) = 0;
59};
60
61class ATHENA_EXPORT AcceleratorManager {
62 public:
63  // Returns an AccelerarManager for global acelerators.
64  static AcceleratorManager* Get();
65
66  // Creates an AcceleratorManager for application windows that
67  // define their own accelerators.
68  static scoped_ptr<AcceleratorManager> CreateForFocusManager(
69      views::FocusManager* focus_manager);
70
71  virtual ~AcceleratorManager() {}
72
73  // Tells if the accelerator is registered with the given flag.  If
74  // flags is AF_NONE, it simply tells if the accelerator is
75  // registered with any flags.
76  virtual bool IsRegistered(const ui::Accelerator& accelerator,
77                            int flags) const = 0;
78
79  // Register accelerators and its handler that will be invoked when
80  // one of accelerator is fired.
81  virtual void RegisterAccelerators(const AcceleratorData accelerators[],
82                                    size_t num_accelerators,
83                                    AcceleratorHandler* handler) = 0;
84
85  // Enables/Disables accelerators that has a AF_DEBUG flag.
86  virtual void SetDebugAcceleratorsEnabled(bool enabled) = 0;
87};
88
89}  // namespace athena
90
91#endif  // ATHENA_INPUT_PUBLIC_ACCELERATOR_MANAGER_H_
92