| Index: chrome/browser/ui/cocoa/accelerators_cocoa.mm
|
| diff --git a/chrome/browser/ui/cocoa/accelerators_cocoa.mm b/chrome/browser/ui/cocoa/accelerators_cocoa.mm
|
| index 154be6f91bda7a0fc604d4a68d84a687ebd5fdfc..b4ee27147603a181e7b2d3599cfc21a5083949e0 100644
|
| --- a/chrome/browser/ui/cocoa/accelerators_cocoa.mm
|
| +++ b/chrome/browser/ui/cocoa/accelerators_cocoa.mm
|
| @@ -6,53 +6,144 @@
|
|
|
| #import <Cocoa/Cocoa.h>
|
|
|
| +#include "base/logging.h"
|
| #include "base/memory/singleton.h"
|
| #include "chrome/app/chrome_command_ids.h"
|
| #import "ui/base/accelerators/platform_accelerator_cocoa.h"
|
| +#import "ui/base/cocoa/cocoa_event_utils.h"
|
| +#import "ui/events/keycodes/keyboard_code_conversion_mac.h"
|
|
|
| namespace {
|
|
|
| +// These accelerators are not associated with a command_id.
|
| +const struct AcceleratorListing {
|
| + NSUInteger modifiers; // The Cocoa modifiers.
|
| + ui::KeyboardCode key_code; // The key used for cross-platform compatibility.
|
| +} kAcceleratorList [] = {
|
| + {NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_H},
|
| + {NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_W},
|
| + {NSCommandKeyMask | NSAlternateKeyMask | NSShiftKeyMask, ui::VKEY_V},
|
| + {NSCommandKeyMask, ui::VKEY_E},
|
| + {NSCommandKeyMask, ui::VKEY_J},
|
| + {NSCommandKeyMask, ui::VKEY_OEM_1},
|
| + {NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_OEM_1},
|
| + {NSCommandKeyMask, ui::VKEY_OEM_COMMA},
|
| + {NSCommandKeyMask | NSControlKeyMask, ui::VKEY_SPACE},
|
| +};
|
| +
|
| const struct AcceleratorMapping {
|
| int command_id;
|
| - NSString* key;
|
| - NSUInteger modifiers;
|
| + NSUInteger modifiers; // The Cocoa modifiers.
|
| + ui::KeyboardCode key_code; // The key used for cross-platform compatibility.
|
| } kAcceleratorMap[] = {
|
| - { IDC_CLEAR_BROWSING_DATA, @"\x8", NSCommandKeyMask | NSShiftKeyMask },
|
| - { IDC_COPY, @"c", NSCommandKeyMask },
|
| - { IDC_CUT, @"x", NSCommandKeyMask },
|
| - { IDC_DEV_TOOLS, @"i", NSCommandKeyMask | NSAlternateKeyMask },
|
| - { IDC_DEV_TOOLS_CONSOLE, @"j", NSCommandKeyMask | NSAlternateKeyMask },
|
| - { IDC_FIND, @"f", NSCommandKeyMask },
|
| - { IDC_FULLSCREEN, @"f", NSCommandKeyMask | NSShiftKeyMask },
|
| - { IDC_NEW_INCOGNITO_WINDOW, @"n", NSCommandKeyMask | NSShiftKeyMask },
|
| - { IDC_NEW_TAB, @"t", NSCommandKeyMask },
|
| - { IDC_NEW_WINDOW, @"n", NSCommandKeyMask },
|
| - { IDC_OPTIONS, @",", NSCommandKeyMask },
|
| - { IDC_PASTE, @"v", NSCommandKeyMask },
|
| - { IDC_PRINT, @"p", NSCommandKeyMask },
|
| - { IDC_RESTORE_TAB, @"t", NSCommandKeyMask | NSShiftKeyMask },
|
| - { IDC_SAVE_PAGE, @"s", NSCommandKeyMask },
|
| - { IDC_SHOW_BOOKMARK_BAR, @"b", NSCommandKeyMask | NSShiftKeyMask },
|
| - { IDC_SHOW_BOOKMARK_MANAGER, @"b", NSCommandKeyMask | NSAlternateKeyMask },
|
| - { IDC_BOOKMARK_PAGE, @"d", NSCommandKeyMask },
|
| - { IDC_SHOW_DOWNLOADS, @"j", NSCommandKeyMask | NSShiftKeyMask },
|
| - { IDC_SHOW_HISTORY, @"y", NSCommandKeyMask },
|
| - { IDC_VIEW_SOURCE, @"u", NSCommandKeyMask | NSAlternateKeyMask },
|
| - { IDC_ZOOM_MINUS, @"-", NSCommandKeyMask },
|
| - { IDC_ZOOM_PLUS, @"+", NSCommandKeyMask }
|
| + // Accelerators used in the toolbar menu.
|
| + {IDC_CLEAR_BROWSING_DATA, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_BACK},
|
| + {IDC_COPY, NSCommandKeyMask, ui::VKEY_C},
|
| + {IDC_CUT, NSCommandKeyMask, ui::VKEY_X},
|
| + {IDC_DEV_TOOLS, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_I},
|
| + {IDC_DEV_TOOLS_CONSOLE, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_J},
|
| + {IDC_FIND, NSCommandKeyMask, ui::VKEY_F},
|
| + {IDC_FULLSCREEN, NSCommandKeyMask | NSControlKeyMask, ui::VKEY_F},
|
| + {IDC_NEW_INCOGNITO_WINDOW, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_N},
|
| + {IDC_NEW_TAB, NSCommandKeyMask, ui::VKEY_T},
|
| + {IDC_NEW_WINDOW, NSCommandKeyMask, ui::VKEY_N},
|
| + {IDC_PASTE, NSCommandKeyMask, ui::VKEY_V},
|
| + {IDC_PRINT, NSCommandKeyMask, ui::VKEY_P},
|
| + {IDC_RESTORE_TAB, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_T},
|
| + {IDC_SAVE_PAGE, NSCommandKeyMask, ui::VKEY_S},
|
| + {IDC_SHOW_BOOKMARK_BAR, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_B},
|
| + {IDC_SHOW_BOOKMARK_MANAGER, NSCommandKeyMask | NSAlternateKeyMask,
|
| + ui::VKEY_B},
|
| + {IDC_BOOKMARK_PAGE, NSCommandKeyMask, ui::VKEY_D},
|
| + {IDC_SHOW_DOWNLOADS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_J},
|
| + {IDC_SHOW_HISTORY, NSCommandKeyMask, ui::VKEY_Y},
|
| + {IDC_VIEW_SOURCE, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_U},
|
| + {IDC_ZOOM_MINUS, NSCommandKeyMask, ui::VKEY_OEM_MINUS},
|
| + {IDC_ZOOM_PLUS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_OEM_PLUS},
|
| +
|
| + // Accelerators used in MainMenu.xib, but not the toolbar menu.
|
| + {IDC_HIDE_APP, NSCommandKeyMask, ui::VKEY_H},
|
| + {IDC_EXIT, NSCommandKeyMask, ui::VKEY_Q},
|
| + {IDC_OPEN_FILE, NSCommandKeyMask, ui::VKEY_O},
|
| + {IDC_FOCUS_LOCATION, NSCommandKeyMask, ui::VKEY_L},
|
| + {IDC_CLOSE_WINDOW, NSCommandKeyMask, ui::VKEY_W},
|
| + {IDC_EMAIL_PAGE_LOCATION, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_I},
|
| + {IDC_ADVANCED_PRINT, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_P},
|
| + {IDC_CONTENT_CONTEXT_UNDO, NSCommandKeyMask, ui::VKEY_Z},
|
| + {IDC_CONTENT_CONTEXT_REDO, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_Z},
|
| + {IDC_CONTENT_CONTEXT_CUT, NSCommandKeyMask, ui::VKEY_X},
|
| + {IDC_CONTENT_CONTEXT_COPY, NSCommandKeyMask, ui::VKEY_C},
|
| + {IDC_CONTENT_CONTEXT_PASTE, NSCommandKeyMask, ui::VKEY_V},
|
| + {IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE,
|
| + NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_V},
|
| + {IDC_CONTENT_CONTEXT_SELECTALL, NSCommandKeyMask, ui::VKEY_A},
|
| + {IDC_FOCUS_SEARCH, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_F},
|
| + {IDC_FIND_NEXT, NSCommandKeyMask, ui::VKEY_G},
|
| + {IDC_FIND_PREVIOUS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_G},
|
| + {IDC_ZOOM_PLUS, NSCommandKeyMask, ui::VKEY_OEM_PLUS},
|
| + {IDC_ZOOM_MINUS, NSCommandKeyMask, ui::VKEY_OEM_MINUS},
|
| + {IDC_STOP, NSCommandKeyMask, ui::VKEY_OEM_PERIOD},
|
| + {IDC_RELOAD, NSCommandKeyMask, ui::VKEY_R},
|
| + {IDC_RELOAD_IGNORING_CACHE, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_R},
|
| + {IDC_PRESENTATION_MODE, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_F},
|
| + {IDC_ZOOM_NORMAL, NSCommandKeyMask, ui::VKEY_0},
|
| + {IDC_HOME, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_H},
|
| + {IDC_BACK, NSCommandKeyMask, ui::VKEY_OEM_4},
|
| + {IDC_FORWARD, NSCommandKeyMask, ui::VKEY_OEM_6},
|
| + {IDC_BOOKMARK_ALL_TABS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_D},
|
| + {IDC_MINIMIZE_WINDOW, NSCommandKeyMask, ui::VKEY_M},
|
| + {IDC_SELECT_NEXT_TAB, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_RIGHT},
|
| + {IDC_SELECT_PREVIOUS_TAB, NSCommandKeyMask | NSAlternateKeyMask,
|
| + ui::VKEY_LEFT},
|
| + {IDC_TABPOSE, NSCommandKeyMask | NSControlKeyMask, ui::VKEY_T},
|
| + {IDC_HELP_PAGE_VIA_MENU, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_OEM_2},
|
| };
|
|
|
| +// Create a Cocoa platform accelerator given a cross platform |key_code| and
|
| +// the |cocoa_modifiers|.
|
| +scoped_ptr<ui::PlatformAccelerator> PlatformAcceleratorFromKeyCode(
|
| + ui::KeyboardCode key_code,
|
| + NSUInteger cocoa_modifiers) {
|
| + unichar character;
|
| + unichar char_no_modifiers;
|
| + int result = ui::MacKeyCodeForWindowsKeyCode(
|
| + key_code, cocoa_modifiers, &character, &char_no_modifiers);
|
| + DCHECK(result != -1);
|
| + NSString* key_equivalent = [NSString stringWithFormat:@"%C", character];
|
| +
|
| + return scoped_ptr<ui::PlatformAccelerator>(
|
| + new ui::PlatformAcceleratorCocoa(key_equivalent, cocoa_modifiers));
|
| +}
|
| +
|
| +// Create a cross platform accelerator given a cross platform |key_code| and
|
| +// the |cocoa_modifiers|.
|
| +ui::Accelerator AcceleratorFromKeyCode(ui::KeyboardCode key_code,
|
| + NSUInteger cocoa_modifiers) {
|
| + int cross_platform_modifiers = ui::EventFlagsFromModifiers(cocoa_modifiers);
|
| + ui::Accelerator accelerator(key_code, cross_platform_modifiers);
|
| +
|
| + scoped_ptr<ui::PlatformAccelerator> platform_accelerator =
|
| + PlatformAcceleratorFromKeyCode(key_code, cocoa_modifiers);
|
| + accelerator.set_platform_accelerator(platform_accelerator.Pass());
|
| + return accelerator;
|
| +}
|
| +
|
| } // namespace
|
|
|
| AcceleratorsCocoa::AcceleratorsCocoa() {
|
| for (size_t i = 0; i < arraysize(kAcceleratorMap); ++i) {
|
| const AcceleratorMapping& entry = kAcceleratorMap[i];
|
| - ui::Accelerator accelerator(ui::VKEY_UNKNOWN, 0);
|
| - scoped_ptr<ui::PlatformAccelerator> platform_accelerator(
|
| - new ui::PlatformAcceleratorCocoa(entry.key, entry.modifiers));
|
| - accelerator.set_platform_accelerator(platform_accelerator.Pass());
|
| + ui::Accelerator accelerator =
|
| + AcceleratorFromKeyCode(entry.key_code, entry.modifiers);
|
| accelerators_.insert(std::make_pair(entry.command_id, accelerator));
|
| }
|
| +
|
| + for (size_t i = 0; i < arraysize(kAcceleratorList); ++i) {
|
| + const AcceleratorListing& entry = kAcceleratorList[i];
|
| + ui::Accelerator accelerator =
|
| + AcceleratorFromKeyCode(entry.key_code, entry.modifiers);
|
| + accelerator_vector_.push_back(accelerator);
|
| + }
|
| }
|
|
|
| AcceleratorsCocoa::~AcceleratorsCocoa() {}
|
| @@ -69,3 +160,34 @@ const ui::Accelerator* AcceleratorsCocoa::GetAcceleratorForCommand(
|
| return NULL;
|
| return &it->second;
|
| }
|
| +
|
| +const ui::Accelerator* AcceleratorsCocoa::GetAcceleratorForHotKey(
|
| + NSString* key_equivalent, NSUInteger modifiers) const {
|
| + for (AcceleratorVector::const_iterator it = accelerator_vector_.begin();
|
| + it != accelerator_vector_.end();
|
| + ++it) {
|
| + const ui::Accelerator& accelerator = *it;
|
| + const ui::PlatformAcceleratorCocoa* platform_accelerator =
|
| + static_cast<const ui::PlatformAcceleratorCocoa*>(
|
| + accelerator.platform_accelerator());
|
| + unichar character;
|
| + unichar char_no_modifiers;
|
| + int result =
|
| + ui::MacKeyCodeForWindowsKeyCode(accelerator.key_code(),
|
| + platform_accelerator->modifier_mask(),
|
| + &character,
|
| + &char_no_modifiers);
|
| + if (result == -1)
|
| + return NULL;
|
| +
|
| + // Check for a match in the modifiers and key_equivalent.
|
| + NSUInteger mask = platform_accelerator->modifier_mask();
|
| + BOOL maskEqual =
|
| + (mask == modifiers) || ((mask & (~NSShiftKeyMask)) == modifiers);
|
| + NSString* string = [NSString stringWithFormat:@"%C", character];
|
| + if ([string isEqual:key_equivalent] && maskEqual)
|
| + return &*it;
|
| + }
|
| +
|
| + return NULL;
|
| +}
|
|
|