Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(495)

Side by Side Diff: chrome/browser/ui/cocoa/accelerators_cocoa.mm

Issue 152643007: mac: Create a static mapping of accelerators in the main menu. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@acc_list
Patch Set: Another self-review. Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698