| Index: chrome/browser/extensions/global_shortcut_listener_mac.h
|
| diff --git a/chrome/browser/extensions/global_shortcut_listener_mac.h b/chrome/browser/extensions/global_shortcut_listener_mac.h
|
| index 8c1b5dbfbbe0189effcea5c70c17249c75ff42fb..ddc191e7901085d8cde39750140215f3e402d72a 100644
|
| --- a/chrome/browser/extensions/global_shortcut_listener_mac.h
|
| +++ b/chrome/browser/extensions/global_shortcut_listener_mac.h
|
| @@ -5,26 +5,43 @@
|
| #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 <CoreFoundation/CoreFoundation.h>
|
| +
|
| +#include <map>
|
| +
|
| +#include "base/mac/scoped_nsobject.h"
|
| +
|
| 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.
|
| +//
|
| +// This class does two things:
|
| +// 1. Intercepts media keys. Uses an event tap for intercepting media keys
|
| +// (PlayPause, NextTrack, PreviousTrack).
|
| +// 2. Binds keyboard shortcuts (hot keys). Carbon RegisterEventHotKey API for
|
| +// binding to non-media key global hot keys (eg. Command-Shift-1).
|
| class GlobalShortcutListenerMac : public GlobalShortcutListener {
|
| public:
|
| + GlobalShortcutListenerMac();
|
| virtual ~GlobalShortcutListenerMac();
|
|
|
| virtual void StartListening() OVERRIDE;
|
| virtual void StopListening() OVERRIDE;
|
|
|
| private:
|
| - friend struct base::DefaultLazyInstanceTraits<GlobalShortcutListenerMac>;
|
| + typedef int KeyId;
|
| + typedef std::map<ui::Accelerator, KeyId> AcceleratorIdMap;
|
| + typedef std::map<KeyId, ui::Accelerator> IdAcceleratorMap;
|
| + typedef std::map<KeyId, EventHotKeyRef> IdHotKeyRefMap;
|
|
|
| - GlobalShortcutListenerMac();
|
| + // Keyboard event callbacks.
|
| + void OnHotKeyEvent(EventHotKeyID hot_key_id);
|
| + bool OnMediaKeyEvent(int key_code);
|
|
|
| // Register an |accelerator| with the particular |observer|.
|
| virtual void RegisterAccelerator(
|
| @@ -35,9 +52,56 @@ class GlobalShortcutListenerMac : public GlobalShortcutListener {
|
| const ui::Accelerator& accelerator,
|
| GlobalShortcutListener::Observer* observer) OVERRIDE;
|
|
|
| + // Mac-specific functions for registering hot keys with modifiers.
|
| + void RegisterHotKey(const ui::Accelerator& accelerator, KeyId hot_key_id);
|
| + void UnregisterHotKey(const ui::Accelerator& accelerator);
|
| +
|
| + // Enable and disable the media key event tap.
|
| + void StartWatchingMediaKeys();
|
| + void StopWatchingMediaKeys();
|
| +
|
| + // Enable and disable the hot key event handler.
|
| + void StartWatchingHotKeys();
|
| + void StopWatchingHotKeys();
|
| +
|
| + // Whether or not any media keys are currently registered.
|
| + bool IsAnyMediaKeyRegistered();
|
| +
|
| + // Whether or not any hot keys are currently registered.
|
| + bool IsAnyHotKeyRegistered();
|
| +
|
| + // The callback for when an event tap happens.
|
| + static CGEventRef EventTapCallback(
|
| + CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon);
|
| +
|
| + // The callback for when a hot key event happens.
|
| + static OSStatus HotKeyHandler(
|
| + EventHandlerCallRef next_handler, EventRef event, void* user_data);
|
| +
|
| // Whether this object is listening for global shortcuts.
|
| bool is_listening_;
|
|
|
| + // The hotkey identifier for the next global shortcut that is added.
|
| + KeyId hot_key_id_;
|
| +
|
| + // A map of all hotkeys (media keys and shortcuts) mapping to their
|
| + // corresponding hotkey IDs. For quickly finding if an accelerator is
|
| + // registered.
|
| + AcceleratorIdMap accelerator_ids_;
|
| +
|
| + // The inverse map for quickly looking up accelerators by hotkey id.
|
| + IdAcceleratorMap id_accelerators_;
|
| +
|
| + // Keyboard shortcut IDs to hotkeys map for unregistration.
|
| + IdHotKeyRefMap id_hot_key_refs_;
|
| +
|
| + // Event tap for intercepting mac media keys.
|
| + CFMachPortRef event_tap_;
|
| + CFRunLoopSourceRef event_tap_source_;
|
| +
|
| + // Event handler for keyboard shortcut hot keys.
|
| + EventHandlerRef event_handler_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(GlobalShortcutListenerMac);
|
| };
|
|
|
|
|