Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/cocoa/accelerators_cocoa.h" | 5 #include "chrome/browser/ui/cocoa/accelerators_cocoa.h" |
| 6 | 6 |
| 7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
| 8 | 8 |
| 9 #include "base/memory/singleton.h" | 9 #include "base/memory/singleton.h" |
| 10 #include "chrome/app/chrome_command_ids.h" | 10 #include "chrome/app/chrome_command_ids.h" |
| 11 #import "ui/base/accelerators/platform_accelerator_cocoa.h" | 11 #import "ui/base/accelerators/platform_accelerator_cocoa.h" |
| 12 #import "ui/events/keycodes/keyboard_code_conversion_mac.h" | |
| 12 | 13 |
| 13 namespace { | 14 namespace { |
| 14 | 15 |
| 16 // These accelerators are not associated with a command_id. | |
| 17 const struct AcceleratorListing { | |
| 18 NSUInteger modifiers; // The Cocoa modifiers. | |
| 19 ui::KeyboardCode keyXP; // The key used for cross-platform compatibility. | |
| 20 } kAcceleratorList [] = { | |
| 21 {NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_H}, | |
| 22 {NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_W}, | |
| 23 {NSCommandKeyMask | NSAlternateKeyMask | NSShiftKeyMask, ui::VKEY_V}, | |
| 24 {NSCommandKeyMask, ui::VKEY_E}, | |
| 25 {NSCommandKeyMask, ui::VKEY_J}, | |
| 26 {NSCommandKeyMask, ui::VKEY_OEM_1}, | |
| 27 {NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_OEM_1}, | |
| 28 {NSCommandKeyMask, ui::VKEY_OEM_COMMA}, | |
| 29 {NSCommandKeyMask | NSControlKeyMask, ui::VKEY_SPACE}, | |
| 30 }; | |
| 31 | |
| 15 const struct AcceleratorMapping { | 32 const struct AcceleratorMapping { |
| 16 int command_id; | 33 int command_id; |
| 17 NSString* key; | 34 NSUInteger modifiers; // The Cocoa modifiers. |
| 18 NSUInteger modifiers; | 35 ui::KeyboardCode keyXP; // The key used for cross-platform compatibility. |
|
Robert Sesek
2014/02/11 16:19:48
"XP" is not a common term in Chromium, except if y
erikchen
2014/02/11 19:42:27
Done.
| |
| 19 } kAcceleratorMap[] = { | 36 } kAcceleratorMap[] = { |
| 20 { IDC_CLEAR_BROWSING_DATA, @"\x8", NSCommandKeyMask | NSShiftKeyMask }, | 37 // Accelerators used in the toolbar menu. |
|
Robert Sesek
2014/02/11 16:19:48
nit: the indent on this was correct before (only t
erikchen
2014/02/11 19:42:27
This was the output of clang-format. I'm not sure
| |
| 21 { IDC_COPY, @"c", NSCommandKeyMask }, | 38 {IDC_CLEAR_BROWSING_DATA, NSCommandKeyMask | NSShiftKeyMask, |
| 22 { IDC_CUT, @"x", NSCommandKeyMask }, | 39 ui::VKEY_BACK}, |
| 23 { IDC_DEV_TOOLS, @"i", NSCommandKeyMask | NSAlternateKeyMask }, | 40 {IDC_COPY, NSCommandKeyMask, ui::VKEY_C}, |
| 24 { IDC_DEV_TOOLS_CONSOLE, @"j", NSCommandKeyMask | NSAlternateKeyMask }, | 41 {IDC_CUT, NSCommandKeyMask, ui::VKEY_X}, |
| 25 { IDC_FIND, @"f", NSCommandKeyMask }, | 42 {IDC_DEV_TOOLS, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_I}, |
| 26 { IDC_FULLSCREEN, @"f", NSCommandKeyMask | NSShiftKeyMask }, | 43 {IDC_DEV_TOOLS_CONSOLE, NSCommandKeyMask | NSAlternateKeyMask, |
| 27 { IDC_NEW_INCOGNITO_WINDOW, @"n", NSCommandKeyMask | NSShiftKeyMask }, | 44 ui::VKEY_J}, |
| 28 { IDC_NEW_TAB, @"t", NSCommandKeyMask }, | 45 {IDC_FIND, NSCommandKeyMask, ui::VKEY_F}, |
| 29 { IDC_NEW_WINDOW, @"n", NSCommandKeyMask }, | 46 {IDC_FULLSCREEN, NSCommandKeyMask | NSControlKeyMask, ui::VKEY_F}, |
| 30 { IDC_OPTIONS, @",", NSCommandKeyMask }, | 47 {IDC_NEW_INCOGNITO_WINDOW, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_N}, |
| 31 { IDC_PASTE, @"v", NSCommandKeyMask }, | 48 {IDC_NEW_TAB, NSCommandKeyMask, ui::VKEY_T}, |
| 32 { IDC_PRINT, @"p", NSCommandKeyMask }, | 49 {IDC_NEW_WINDOW, NSCommandKeyMask, ui::VKEY_N}, |
| 33 { IDC_RESTORE_TAB, @"t", NSCommandKeyMask | NSShiftKeyMask }, | 50 {IDC_PASTE, NSCommandKeyMask, ui::VKEY_V}, |
| 34 { IDC_SAVE_PAGE, @"s", NSCommandKeyMask }, | 51 {IDC_PRINT, NSCommandKeyMask, ui::VKEY_P}, |
| 35 { IDC_SHOW_BOOKMARK_BAR, @"b", NSCommandKeyMask | NSShiftKeyMask }, | 52 {IDC_RESTORE_TAB, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_T}, |
| 36 { IDC_SHOW_BOOKMARK_MANAGER, @"b", NSCommandKeyMask | NSAlternateKeyMask }, | 53 {IDC_SAVE_PAGE, NSCommandKeyMask, ui::VKEY_S}, |
| 37 { IDC_BOOKMARK_PAGE, @"d", NSCommandKeyMask }, | 54 {IDC_SHOW_BOOKMARK_BAR, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_B}, |
| 38 { IDC_SHOW_DOWNLOADS, @"j", NSCommandKeyMask | NSShiftKeyMask }, | 55 {IDC_SHOW_BOOKMARK_MANAGER, NSCommandKeyMask | NSAlternateKeyMask, |
| 39 { IDC_SHOW_HISTORY, @"y", NSCommandKeyMask }, | 56 ui::VKEY_B}, |
| 40 { IDC_VIEW_SOURCE, @"u", NSCommandKeyMask | NSAlternateKeyMask }, | 57 {IDC_BOOKMARK_PAGE, NSCommandKeyMask, ui::VKEY_D}, |
| 41 { IDC_ZOOM_MINUS, @"-", NSCommandKeyMask }, | 58 {IDC_SHOW_DOWNLOADS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_J}, |
| 42 { IDC_ZOOM_PLUS, @"+", NSCommandKeyMask } | 59 {IDC_SHOW_HISTORY, NSCommandKeyMask, ui::VKEY_Y}, |
| 43 }; | 60 {IDC_VIEW_SOURCE, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_U}, |
| 61 {IDC_ZOOM_MINUS, NSCommandKeyMask, ui::VKEY_OEM_MINUS}, | |
| 62 {IDC_ZOOM_PLUS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_OEM_PLUS}, | |
| 44 | 63 |
| 45 } // namespace | 64 // Accelerators used in MainMenu.xib, but not the toolbar menu. |
| 65 {IDC_HIDE_APP, NSCommandKeyMask, ui::VKEY_H}, | |
| 66 {IDC_EXIT, NSCommandKeyMask, ui::VKEY_Q}, | |
| 67 {IDC_OPEN_FILE, NSCommandKeyMask, ui::VKEY_O}, | |
| 68 {IDC_FOCUS_LOCATION, NSCommandKeyMask, ui::VKEY_L}, | |
| 69 {IDC_CLOSE_WINDOW, NSCommandKeyMask, ui::VKEY_W}, | |
| 70 {IDC_EMAIL_PAGE_LOCATION, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_I}, | |
| 71 {IDC_ADVANCED_PRINT, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_P}, | |
| 72 {IDC_CONTENT_CONTEXT_UNDO, NSCommandKeyMask, ui::VKEY_Z}, | |
| 73 {IDC_CONTENT_CONTEXT_REDO, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_Z}, | |
| 74 {IDC_CONTENT_CONTEXT_CUT, NSCommandKeyMask, ui::VKEY_X}, | |
| 75 {IDC_CONTENT_CONTEXT_COPY, NSCommandKeyMask, ui::VKEY_C}, | |
| 76 {IDC_CONTENT_CONTEXT_PASTE, NSCommandKeyMask, ui::VKEY_V}, | |
| 77 {IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE, | |
| 78 NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_V}, | |
| 79 {IDC_CONTENT_CONTEXT_SELECTALL, NSCommandKeyMask, ui::VKEY_A}, | |
| 80 {IDC_FOCUS_SEARCH, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_F}, | |
| 81 {IDC_FIND_NEXT, NSCommandKeyMask, ui::VKEY_G}, | |
| 82 {IDC_FIND_PREVIOUS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_G}, | |
| 83 {IDC_ZOOM_PLUS, NSCommandKeyMask, ui::VKEY_OEM_PLUS}, | |
| 84 {IDC_ZOOM_MINUS, NSCommandKeyMask, ui::VKEY_OEM_MINUS}, | |
| 85 {IDC_STOP, NSCommandKeyMask, ui::VKEY_OEM_PERIOD}, | |
| 86 {IDC_RELOAD, NSCommandKeyMask, ui::VKEY_R}, | |
| 87 {IDC_RELOAD_IGNORING_CACHE, NSCommandKeyMask | NSShiftKeyMask, | |
| 88 ui::VKEY_R}, | |
| 89 {IDC_PRESENTATION_MODE, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_F}, | |
| 90 {IDC_ZOOM_NORMAL, NSCommandKeyMask, ui::VKEY_0}, | |
| 91 {IDC_HOME, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_H}, | |
| 92 {IDC_BACK, NSCommandKeyMask, ui::VKEY_OEM_4}, | |
| 93 {IDC_FORWARD, NSCommandKeyMask, ui::VKEY_OEM_6}, | |
| 94 {IDC_BOOKMARK_ALL_TABS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_D}, | |
| 95 {IDC_MINIMIZE_WINDOW, NSCommandKeyMask, ui::VKEY_M}, | |
| 96 {IDC_SELECT_NEXT_TAB, NSCommandKeyMask | NSAlternateKeyMask, | |
| 97 ui::VKEY_RIGHT}, | |
| 98 {IDC_SELECT_PREVIOUS_TAB, NSCommandKeyMask | NSAlternateKeyMask, | |
| 99 ui::VKEY_LEFT}, | |
| 100 {IDC_TABPOSE, NSCommandKeyMask | NSControlKeyMask, ui::VKEY_T}, | |
| 101 {IDC_HELP_PAGE_VIA_MENU, NSCommandKeyMask | NSShiftKeyMask, | |
| 102 ui::VKEY_OEM_2}, }; | |
| 103 | |
| 104 } // Anonymous namespace. | |
|
Robert Sesek
2014/02/11 16:19:48
Revert this to what it was. "// namespace" is the
erikchen
2014/02/11 19:42:27
Done.
| |
| 105 | |
| 106 // Compute the cross-platform modifier from the cocoa modifier. | |
| 107 int xpModifiersFromCocoaModifiers(NSUInteger modifiers) { | |
|
Robert Sesek
2014/02/11 16:19:48
This should go in the namespae above, should be na
erikchen
2014/02/11 19:42:27
Done.
| |
| 108 int modifiersXP = 0; | |
| 109 if ((modifiers & NSCommandKeyMask) != 0) | |
| 110 modifiersXP |= ui::EF_COMMAND_DOWN; | |
| 111 if ((modifiers & NSAlternateKeyMask) != 0) | |
| 112 modifiersXP |= ui::EF_ALT_DOWN; | |
| 113 if ((modifiers & NSShiftKeyMask) != 0) | |
| 114 modifiersXP |= ui::EF_SHIFT_DOWN; | |
| 115 if ((modifiers & NSControlKeyMask) != 0) | |
| 116 modifiersXP |= ui::EF_CONTROL_DOWN; | |
| 117 return modifiersXP; | |
| 118 } | |
| 46 | 119 |
| 47 AcceleratorsCocoa::AcceleratorsCocoa() { | 120 AcceleratorsCocoa::AcceleratorsCocoa() { |
| 48 for (size_t i = 0; i < arraysize(kAcceleratorMap); ++i) { | 121 for (size_t i = 0; i < arraysize(kAcceleratorMap); ++i) { |
| 49 const AcceleratorMapping& entry = kAcceleratorMap[i]; | 122 const AcceleratorMapping& entry = kAcceleratorMap[i]; |
| 50 ui::Accelerator accelerator(ui::VKEY_UNKNOWN, 0); | 123 int xpModifiers = xpModifiersFromCocoaModifiers(entry.modifiers); |
|
Robert Sesek
2014/02/11 16:19:48
naming: here and throughout xp -> something else
Robert Sesek
2014/02/11 16:19:48
I'm surprised we don't already have this function
erikchen
2014/02/11 19:42:27
I've change xp -> x, as a shorthand for cross-plat
erikchen
2014/02/11 19:42:27
We have similar functions, but they all require NS
Robert Sesek
2014/02/11 22:18:16
OK. It may be handy to refactor out the flag-conve
Robert Sesek
2014/02/11 22:18:16
What about ui_modifiers vs cocoa_modifiers? Those
erikchen
2014/02/11 23:16:28
refactored completed.
On 2014/02/11 22:18:16, rses
erikchen
2014/02/11 23:16:28
I found ui_modifiers to be confusing as well. I've
| |
| 124 ui::Accelerator accelerator(entry.keyXP, xpModifiers); | |
| 125 | |
| 126 unichar character; | |
| 127 unichar characterIgnoringModifiers; | |
|
Robert Sesek
2014/02/11 16:19:48
naming: here and throughout, in C++ or C functions
erikchen
2014/02/11 19:42:27
ah. got it.
On 2014/02/11 16:19:48, rsesek wrote:
| |
| 128 int result = ui::MacKeyCodeForWindowsKeyCode( | |
| 129 entry.keyXP, entry.modifiers, &character, &characterIgnoringModifiers); | |
| 130 DCHECK(result != -1); | |
| 131 NSString* cocoaKeyEquivalent = [NSString stringWithFormat:@"%C", character]; | |
| 132 | |
| 51 scoped_ptr<ui::PlatformAccelerator> platform_accelerator( | 133 scoped_ptr<ui::PlatformAccelerator> platform_accelerator( |
| 52 new ui::PlatformAcceleratorCocoa(entry.key, entry.modifiers)); | 134 new ui::PlatformAcceleratorCocoa(cocoaKeyEquivalent, entry.modifiers)); |
| 135 | |
| 136 | |
| 53 accelerator.set_platform_accelerator(platform_accelerator.Pass()); | 137 accelerator.set_platform_accelerator(platform_accelerator.Pass()); |
| 54 accelerators_.insert(std::make_pair(entry.command_id, accelerator)); | 138 accelerators_.insert(std::make_pair(entry.command_id, accelerator)); |
| 55 } | 139 } |
| 140 for (size_t i = 0; i < arraysize(kAcceleratorList); ++i) { | |
| 141 const AcceleratorListing& entry = kAcceleratorList[i]; | |
| 142 int xpModifiers = xpModifiersFromCocoaModifiers(entry.modifiers); | |
| 143 ui::Accelerator accelerator(entry.keyXP, xpModifiers); | |
| 144 | |
| 145 unichar character; | |
| 146 unichar characterIgnoringModifiers; | |
| 147 int result = ui::MacKeyCodeForWindowsKeyCode( | |
| 148 entry.keyXP, entry.modifiers, &character, &characterIgnoringModifiers); | |
| 149 DCHECK(result != -1); | |
| 150 NSString* string = [NSString stringWithFormat:@"%C", character]; | |
| 151 | |
| 152 scoped_ptr<ui::PlatformAccelerator> platform_accelerator( | |
| 153 new ui::PlatformAcceleratorCocoa(string, entry.modifiers)); | |
| 154 accelerator.set_platform_accelerator(platform_accelerator.Pass()); | |
| 155 acceleratorVector_.push_back(accelerator); | |
| 156 } | |
| 56 } | 157 } |
| 57 | 158 |
| 58 AcceleratorsCocoa::~AcceleratorsCocoa() {} | 159 AcceleratorsCocoa::~AcceleratorsCocoa() {} |
| 59 | 160 |
| 60 // static | 161 // static |
| 61 AcceleratorsCocoa* AcceleratorsCocoa::GetInstance() { | 162 AcceleratorsCocoa* AcceleratorsCocoa::GetInstance() { |
| 62 return Singleton<AcceleratorsCocoa>::get(); | 163 return Singleton<AcceleratorsCocoa>::get(); |
| 63 } | 164 } |
| 64 | 165 |
| 65 const ui::Accelerator* AcceleratorsCocoa::GetAcceleratorForCommand( | 166 const ui::Accelerator* AcceleratorsCocoa::GetAcceleratorForCommand( |
| 66 int command_id) { | 167 int command_id) { |
| 67 AcceleratorMap::iterator it = accelerators_.find(command_id); | 168 AcceleratorMap::iterator it = accelerators_.find(command_id); |
| 68 if (it == accelerators_.end()) | 169 if (it == accelerators_.end()) |
| 69 return NULL; | 170 return NULL; |
| 70 return &it->second; | 171 return &it->second; |
| 71 } | 172 } |
| 173 | |
| 174 const ui::Accelerator* AcceleratorsCocoa::GetAcceleratorForHotKey( | |
| 175 NSString* keyEquivalent, NSUInteger modifiers) { | |
| 176 for (AcceleratorVector::iterator it = acceleratorVector_.begin(); | |
|
Robert Sesek
2014/02/11 16:19:48
const_iterator?
erikchen
2014/02/11 19:42:27
Done.
| |
| 177 it != acceleratorVector_.end(); | |
|
Robert Sesek
2014/02/11 16:19:48
nit: align with 'A'
erikchen
2014/02/11 19:42:27
Done.
| |
| 178 ++it) { | |
| 179 const ui::Accelerator& accelerator = *it; | |
| 180 const ui::PlatformAcceleratorCocoa* platform_accelerator = | |
| 181 static_cast<const ui::PlatformAcceleratorCocoa*>( | |
|
Robert Sesek
2014/02/11 16:19:48
nit: continuations are indented 4 spaces
erikchen
2014/02/11 19:42:27
Done.
| |
| 182 accelerator.platform_accelerator()); | |
| 183 unichar character; | |
| 184 unichar characterIgnoringModifiers; | |
| 185 int result = | |
| 186 ui::MacKeyCodeForWindowsKeyCode(accelerator.key_code(), | |
| 187 platform_accelerator->modifier_mask(), | |
| 188 &character, | |
| 189 &characterIgnoringModifiers); | |
| 190 if (result == -1) | |
| 191 return NULL; | |
| 192 | |
| 193 // Check for a match in the modifiers and keyEquivalent. | |
| 194 NSUInteger mask = platform_accelerator->modifier_mask(); | |
| 195 BOOL maskEqual = | |
| 196 (mask == modifiers) || ((mask & (~NSShiftKeyMask)) == modifiers); | |
| 197 NSString* string = [NSString stringWithFormat:@"%C", character]; | |
| 198 if ([string isEqual:keyEquivalent] && maskEqual) | |
| 199 return &*it; | |
| 200 } | |
| 201 | |
| 202 return NULL; | |
| 203 } | |
| OLD | NEW |