15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ASH_ACCELERATORS_ACCELERATOR_CONTROLLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ASH_ACCELERATORS_ACCELERATOR_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/accelerators/exit_warning_handler.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AcceleratorManager;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AcceleratorData;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrightnessControlDelegate;
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ExitWarningHandler;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImeControlDelegate;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class KeyboardBrightnessControlDelegate;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScreenshotDelegate;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VolumeControlDelegate;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorController provides functions for registering or unregistering
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// global keyboard accelerators, which are handled earlier than any windows. It
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// also implements several handlers as an accelerator target.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ASH_EXPORT AcceleratorController : public ui::AcceleratorTarget {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AcceleratorController();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AcceleratorController();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers a global keyboard accelerator for the specified target. If
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // multiple targets are registered for an accelerator, a target registered
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // later has higher priority.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Register(const ui::Accelerator& accelerator,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ui::AcceleratorTarget* target);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregisters the specified keyboard accelerator for the specified target.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Unregister(const ui::Accelerator& accelerator,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ui::AcceleratorTarget* target);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregisters all keyboard accelerators for the specified target.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnregisterAll(ui::AcceleratorTarget* target);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Activates the target associated with the specified accelerator.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First, AcceleratorPressed handler of the most recently registered target
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is called, and if that handler processes the event (i.e. returns true),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this method immediately returns. If not, we do the same thing on the next
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // target, and so on.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if an accelerator was activated.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Process(const ui::Accelerator& accelerator);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the |accelerator| is registered.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsRegistered(const ui::Accelerator& accelerator) const;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the |accelerator| is one of the |reserved_actions_|.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsReservedAccelerator(const ui::Accelerator& accelerator) const;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Performs the specified action. The |accelerator| may provide additional
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // data the action needs. Returns whether an action was performed
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // successfully.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool PerformAction(int action,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const ui::Accelerator& accelerator);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ui::AcceleratorTarget:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CanHandleAccelerators() const OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBrightnessControlDelegate(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<BrightnessControlDelegate> brightness_control_delegate);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetImeControlDelegate(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<ImeControlDelegate> ime_control_delegate);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetScreenshotDelegate(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<ScreenshotDelegate> screenshot_delegate);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrightnessControlDelegate* brightness_control_delegate() const {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return brightness_control_delegate_.get();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScreenshotDelegate* screenshot_delegate() {
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return screenshot_delegate_.get();
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Provides access to the ExitWarningHandler for testing.
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExitWarningHandler* GetExitWarningHandlerForTest() {
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return &exit_warning_handler_;
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const ui::Accelerator& previous_accelerator_for_test() const {
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return previous_accelerator_;
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AcceleratorControllerTest, GlobalAccelerators);
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AcceleratorControllerTest,
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                           DontRepeatToggleFullscreen);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes the accelerators this class handles as a target.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the specified accelerators.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterAccelerators(const AcceleratorData accelerators[],
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size_t accelerators_length);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetKeyboardBrightnessControlDelegate(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<KeyboardBrightnessControlDelegate>
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyboard_brightness_control_delegate);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::AcceleratorManager> accelerator_manager_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(derat): BrightnessControlDelegate is also used by the system tray;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // move it outside of this class.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrightnessControlDelegate> brightness_control_delegate_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ImeControlDelegate> ime_control_delegate_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<KeyboardBrightnessControlDelegate>
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyboard_brightness_control_delegate_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScreenshotDelegate> screenshot_delegate_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Remember previous accelerator as some accelerator needs to be fired
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // with a specific sequence.
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ui::Accelerator previous_accelerator_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Handles the exit accelerator which requires a double press to exit and
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // shows a popup with an explanation.
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExitWarningHandler exit_warning_handler_;
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A map from accelerators to the AcceleratorAction values, which are used in
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the implementation.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<ui::Accelerator, int> accelerators_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Actions allowed when the user is not signed in.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<int> actions_allowed_at_login_screen_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Actions allowed when the screen is locked.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<int> actions_allowed_at_lock_screen_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Actions allowed when a modal window is up.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<int> actions_allowed_at_modal_window_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reserved actions. See accelerator_table.h for details.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<int> reserved_actions_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Actions which will not be repeated while holding the accelerator key.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<int> nonrepeatable_actions_;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Actions allowed in app mode.
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<int> actions_allowed_in_app_mode_;
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Actions disallowed if there are no windows.
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::set<int> actions_needing_window_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AcceleratorController);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // ASH_ACCELERATORS_ACCELERATOR_CONTROLLER_H_
159