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); |
}; |