| Index: chrome/browser/extensions/global_shortcut_listener_mac.h
|
| ===================================================================
|
| --- chrome/browser/extensions/global_shortcut_listener_mac.h (revision 235137)
|
| +++ chrome/browser/extensions/global_shortcut_listener_mac.h (working copy)
|
| @@ -5,15 +5,25 @@
|
| #ifndef CHROME_BROWSER_EXTENSIONS_GLOBAL_SHORTCUT_LISTENER_MAC_H_
|
| #define CHROME_BROWSER_EXTENSIONS_GLOBAL_SHORTCUT_LISTENER_MAC_H_
|
|
|
| -#include "base/lazy_instance.h"
|
| #include "chrome/browser/extensions/global_shortcut_listener.h"
|
|
|
| +#include <Carbon/Carbon.h>
|
| +#include <map>
|
| +
|
| +#include "base/lazy_instance.h"
|
| +#include "base/mac/scoped_nsobject.h"
|
| +
|
| +@class GlobalShortcutListenerTap;
|
| +
|
| namespace extensions {
|
|
|
| // Mac-specific implementation of the GlobalShortcutListener class that
|
| // listens for global shortcuts. Handles basic keyboard intercepting and
|
| // forwards its output to the base class for processing.
|
| -// TODO(finnur/smus): Implement this class.
|
| +//
|
| +// Uses an event tap for intercepting media keys (PlayPause, NextTrack,
|
| +// PreviousTrack). Also uses the Carbon RegisterEventHotKey API for binding to
|
| +// non-media key global keyboard shortcuts (eg. Command-Shift-1).
|
| class GlobalShortcutListenerMac : public GlobalShortcutListener {
|
| public:
|
| virtual ~GlobalShortcutListenerMac();
|
| @@ -21,6 +31,10 @@
|
| virtual void StartListening() OVERRIDE;
|
| virtual void StopListening() OVERRIDE;
|
|
|
| + // Keyboard event callbacks.
|
| + bool OnKeyEvent(EventHotKeyID hotKeyID);
|
| + bool OnMediaKeyEvent(ui::KeyboardCode keyCode);
|
| +
|
| private:
|
| friend struct base::DefaultLazyInstanceTraits<GlobalShortcutListenerMac>;
|
|
|
| @@ -35,9 +49,40 @@
|
| const ui::Accelerator& accelerator,
|
| GlobalShortcutListener::Observer* observer) OVERRIDE;
|
|
|
| + // Mac-specific function for registering a hotkey.
|
| + void RegisterHotKey(const ui::Accelerator& accelerator);
|
| + void UnregisterHotKey(const ui::Accelerator& accelerator);
|
| +
|
| + // Determine if a key is a media key or not.
|
| + // TODO(smus): Use the one in CommandService.
|
| + bool IsMediaKey(const ui::Accelerator& accelerator);
|
| +
|
| + // Whether or not any media keys are currently registered.
|
| + bool AreMediaKeysRegistered();
|
| +
|
| // Whether this object is listening for global shortcuts.
|
| bool is_listening_;
|
|
|
| + // A counter representing the current hotkey identifier.
|
| + int hotkey_id_ = 0;
|
| +
|
| + // A map of all hotkeys (media keys and shortcuts) mapping to their
|
| + // corresponding hotkey IDs. For quickly finding if an accelerator is
|
| + // registered.
|
| + typedef std::map<ui::Accelerator, int> HotKeyIdMap;
|
| + HotKeyIdMap hotkey_ids_;
|
| +
|
| + // The inverse map for quickly looking up accelerators by hotkey id.
|
| + typedef std::map<int, ui::Accelerator> IdHotKeyMap;
|
| + IdHotKeyMap id_hotkeys_;
|
| +
|
| + // Keyboard shortcut IDs to hotkeys map for unregistration.
|
| + typedef std::map<int, EventHotKeyRef> IdHotKeyRefMap;
|
| + IdHotKeyRefMap id_hotkey_refs_;
|
| +
|
| + // Global shortcut listener tap used for intercepting mac media keys.
|
| + base::scoped_nsobject<GlobalShortcutListenerTap> tap_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(GlobalShortcutListenerMac);
|
| };
|
|
|
|
|