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

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: Minor fix: Fix compile error on mac_rel. 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/logging.h"
9 #include "base/memory/singleton.h" 10 #include "base/memory/singleton.h"
10 #include "chrome/app/chrome_command_ids.h" 11 #include "chrome/app/chrome_command_ids.h"
11 #import "ui/base/accelerators/platform_accelerator_cocoa.h" 12 #import "ui/base/accelerators/platform_accelerator_cocoa.h"
13 #import "ui/events/keycodes/keyboard_code_conversion_mac.h"
12 14
13 namespace { 15 namespace {
14 16
17 // These accelerators are not associated with a command_id.
18 const struct AcceleratorListing {
19 NSUInteger modifiers; // The Cocoa modifiers.
20 ui::KeyboardCode key_code; // The key used for cross-platform compatibility.
21 } kAcceleratorList [] = {
22 {NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_H},
23 {NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_W},
24 {NSCommandKeyMask | NSAlternateKeyMask | NSShiftKeyMask, ui::VKEY_V},
25 {NSCommandKeyMask, ui::VKEY_E},
26 {NSCommandKeyMask, ui::VKEY_J},
27 {NSCommandKeyMask, ui::VKEY_OEM_1},
28 {NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_OEM_1},
29 {NSCommandKeyMask, ui::VKEY_OEM_COMMA},
30 {NSCommandKeyMask | NSControlKeyMask, ui::VKEY_SPACE},
31 };
32
15 const struct AcceleratorMapping { 33 const struct AcceleratorMapping {
16 int command_id; 34 int command_id;
17 NSString* key; 35 NSUInteger modifiers; // The Cocoa modifiers.
18 NSUInteger modifiers; 36 ui::KeyboardCode key_code; // The key used for cross-platform compatibility.
19 } kAcceleratorMap[] = { 37 } kAcceleratorMap[] = {
20 { IDC_CLEAR_BROWSING_DATA, @"\x8", NSCommandKeyMask | NSShiftKeyMask }, 38 // Accelerators used in the toolbar menu.
21 { IDC_COPY, @"c", NSCommandKeyMask }, 39 {IDC_CLEAR_BROWSING_DATA, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_BACK},
22 { IDC_CUT, @"x", NSCommandKeyMask }, 40 {IDC_COPY, NSCommandKeyMask, ui::VKEY_C},
23 { IDC_DEV_TOOLS, @"i", NSCommandKeyMask | NSAlternateKeyMask }, 41 {IDC_CUT, NSCommandKeyMask, ui::VKEY_X},
24 { IDC_DEV_TOOLS_CONSOLE, @"j", NSCommandKeyMask | NSAlternateKeyMask }, 42 {IDC_DEV_TOOLS, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_I},
25 { IDC_FIND, @"f", NSCommandKeyMask }, 43 {IDC_DEV_TOOLS_CONSOLE, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_J},
26 { IDC_FULLSCREEN, @"f", NSCommandKeyMask | NSShiftKeyMask }, 44 {IDC_FIND, NSCommandKeyMask, ui::VKEY_F},
27 { IDC_NEW_INCOGNITO_WINDOW, @"n", NSCommandKeyMask | NSShiftKeyMask }, 45 {IDC_FULLSCREEN, NSCommandKeyMask | NSControlKeyMask, ui::VKEY_F},
28 { IDC_NEW_TAB, @"t", NSCommandKeyMask }, 46 {IDC_NEW_INCOGNITO_WINDOW, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_N},
29 { IDC_NEW_WINDOW, @"n", NSCommandKeyMask }, 47 {IDC_NEW_TAB, NSCommandKeyMask, ui::VKEY_T},
30 { IDC_OPTIONS, @",", NSCommandKeyMask }, 48 {IDC_NEW_WINDOW, NSCommandKeyMask, ui::VKEY_N},
31 { IDC_PASTE, @"v", NSCommandKeyMask }, 49 {IDC_PASTE, NSCommandKeyMask, ui::VKEY_V},
32 { IDC_PRINT, @"p", NSCommandKeyMask }, 50 {IDC_PRINT, NSCommandKeyMask, ui::VKEY_P},
33 { IDC_RESTORE_TAB, @"t", NSCommandKeyMask | NSShiftKeyMask }, 51 {IDC_RESTORE_TAB, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_T},
34 { IDC_SAVE_PAGE, @"s", NSCommandKeyMask }, 52 {IDC_SAVE_PAGE, NSCommandKeyMask, ui::VKEY_S},
35 { IDC_SHOW_BOOKMARK_BAR, @"b", NSCommandKeyMask | NSShiftKeyMask }, 53 {IDC_SHOW_BOOKMARK_BAR, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_B},
36 { IDC_SHOW_BOOKMARK_MANAGER, @"b", NSCommandKeyMask | NSAlternateKeyMask }, 54 {IDC_SHOW_BOOKMARK_MANAGER, NSCommandKeyMask | NSAlternateKeyMask,
37 { IDC_BOOKMARK_PAGE, @"d", NSCommandKeyMask }, 55 ui::VKEY_B},
38 { IDC_SHOW_DOWNLOADS, @"j", NSCommandKeyMask | NSShiftKeyMask }, 56 {IDC_BOOKMARK_PAGE, NSCommandKeyMask, ui::VKEY_D},
39 { IDC_SHOW_HISTORY, @"y", NSCommandKeyMask }, 57 {IDC_SHOW_DOWNLOADS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_J},
40 { IDC_VIEW_SOURCE, @"u", NSCommandKeyMask | NSAlternateKeyMask }, 58 {IDC_SHOW_HISTORY, NSCommandKeyMask, ui::VKEY_Y},
41 { IDC_ZOOM_MINUS, @"-", NSCommandKeyMask }, 59 {IDC_VIEW_SOURCE, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_U},
42 { IDC_ZOOM_PLUS, @"+", NSCommandKeyMask } 60 {IDC_ZOOM_MINUS, NSCommandKeyMask, ui::VKEY_OEM_MINUS},
61 {IDC_ZOOM_PLUS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_OEM_PLUS},
62
63 // Accelerators used in MainMenu.xib, but not the toolbar menu.
64 {IDC_HIDE_APP, NSCommandKeyMask, ui::VKEY_H},
65 {IDC_EXIT, NSCommandKeyMask, ui::VKEY_Q},
66 {IDC_OPEN_FILE, NSCommandKeyMask, ui::VKEY_O},
67 {IDC_FOCUS_LOCATION, NSCommandKeyMask, ui::VKEY_L},
68 {IDC_CLOSE_WINDOW, NSCommandKeyMask, ui::VKEY_W},
69 {IDC_EMAIL_PAGE_LOCATION, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_I},
70 {IDC_ADVANCED_PRINT, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_P},
71 {IDC_CONTENT_CONTEXT_UNDO, NSCommandKeyMask, ui::VKEY_Z},
72 {IDC_CONTENT_CONTEXT_REDO, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_Z},
73 {IDC_CONTENT_CONTEXT_CUT, NSCommandKeyMask, ui::VKEY_X},
74 {IDC_CONTENT_CONTEXT_COPY, NSCommandKeyMask, ui::VKEY_C},
75 {IDC_CONTENT_CONTEXT_PASTE, NSCommandKeyMask, ui::VKEY_V},
76 {IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE,
77 NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_V},
78 {IDC_CONTENT_CONTEXT_SELECTALL, NSCommandKeyMask, ui::VKEY_A},
79 {IDC_FOCUS_SEARCH, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_F},
80 {IDC_FIND_NEXT, NSCommandKeyMask, ui::VKEY_G},
81 {IDC_FIND_PREVIOUS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_G},
82 {IDC_ZOOM_PLUS, NSCommandKeyMask, ui::VKEY_OEM_PLUS},
83 {IDC_ZOOM_MINUS, NSCommandKeyMask, ui::VKEY_OEM_MINUS},
84 {IDC_STOP, NSCommandKeyMask, ui::VKEY_OEM_PERIOD},
85 {IDC_RELOAD, NSCommandKeyMask, ui::VKEY_R},
86 {IDC_RELOAD_IGNORING_CACHE, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_R},
87 {IDC_PRESENTATION_MODE, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_F},
88 {IDC_ZOOM_NORMAL, NSCommandKeyMask, ui::VKEY_0},
89 {IDC_HOME, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_H},
90 {IDC_BACK, NSCommandKeyMask, ui::VKEY_OEM_4},
91 {IDC_FORWARD, NSCommandKeyMask, ui::VKEY_OEM_6},
92 {IDC_BOOKMARK_ALL_TABS, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_D},
93 {IDC_MINIMIZE_WINDOW, NSCommandKeyMask, ui::VKEY_M},
94 {IDC_SELECT_NEXT_TAB, NSCommandKeyMask | NSAlternateKeyMask, ui::VKEY_RIGHT},
95 {IDC_SELECT_PREVIOUS_TAB, NSCommandKeyMask | NSAlternateKeyMask,
96 ui::VKEY_LEFT},
97 {IDC_TABPOSE, NSCommandKeyMask | NSControlKeyMask, ui::VKEY_T},
98 {IDC_HELP_PAGE_VIA_MENU, NSCommandKeyMask | NSShiftKeyMask, ui::VKEY_OEM_2},
43 }; 99 };
44 100
101 // Compute the cross-platform modifier from the cocoa modifier.
Robert Sesek 2014/02/11 22:18:16 nit: capitalize Cocoa
erikchen 2014/02/11 23:16:28 Done.
102 int CrossPlatformModifiersFromCocoaModifiers(NSUInteger modifiers) {
103 int x_modifiers = 0;
104 if ((modifiers & NSCommandKeyMask) != 0)
105 x_modifiers |= ui::EF_COMMAND_DOWN;
106 if ((modifiers & NSAlternateKeyMask) != 0)
107 x_modifiers |= ui::EF_ALT_DOWN;
108 if ((modifiers & NSShiftKeyMask) != 0)
109 x_modifiers |= ui::EF_SHIFT_DOWN;
110 if ((modifiers & NSControlKeyMask) != 0)
111 x_modifiers |= ui::EF_CONTROL_DOWN;
112 return x_modifiers;
113 }
114
45 } // namespace 115 } // namespace
46 116
47 AcceleratorsCocoa::AcceleratorsCocoa() { 117 AcceleratorsCocoa::AcceleratorsCocoa() {
48 for (size_t i = 0; i < arraysize(kAcceleratorMap); ++i) { 118 for (size_t i = 0; i < arraysize(kAcceleratorMap); ++i) {
49 const AcceleratorMapping& entry = kAcceleratorMap[i]; 119 const AcceleratorMapping& entry = kAcceleratorMap[i];
50 ui::Accelerator accelerator(ui::VKEY_UNKNOWN, 0); 120 int x_modifiers = CrossPlatformModifiersFromCocoaModifiers(entry.modifiers);
121 ui::Accelerator accelerator(entry.key_code, x_modifiers);
122
123 unichar character;
124 unichar char_no_modifiers;
125 int result = ui::MacKeyCodeForWindowsKeyCode(
126 entry.key_code, entry.modifiers, &character, &char_no_modifiers);
127 DCHECK(result != -1);
128 NSString* key_equivalent = [NSString stringWithFormat:@"%C", character];
129
51 scoped_ptr<ui::PlatformAccelerator> platform_accelerator( 130 scoped_ptr<ui::PlatformAccelerator> platform_accelerator(
52 new ui::PlatformAcceleratorCocoa(entry.key, entry.modifiers)); 131 new ui::PlatformAcceleratorCocoa(key_equivalent, entry.modifiers));
132
Robert Sesek 2014/02/11 22:18:16 nit: extra blank line
erikchen 2014/02/11 23:16:28 Done.
133
53 accelerator.set_platform_accelerator(platform_accelerator.Pass()); 134 accelerator.set_platform_accelerator(platform_accelerator.Pass());
54 accelerators_.insert(std::make_pair(entry.command_id, accelerator)); 135 accelerators_.insert(std::make_pair(entry.command_id, accelerator));
55 } 136 }
137 for (size_t i = 0; i < arraysize(kAcceleratorList); ++i) {
Robert Sesek 2014/02/11 22:18:16 These two loops are awfully similar. Can they be c
erikchen 2014/02/11 23:16:28 Done.
138 const AcceleratorListing& entry = kAcceleratorList[i];
139 int x_modifiers = CrossPlatformModifiersFromCocoaModifiers(entry.modifiers);
140 ui::Accelerator accelerator(entry.key_code, x_modifiers);
141
142 unichar character;
143 unichar char_no_modifiers;
144 int result = ui::MacKeyCodeForWindowsKeyCode(
145 entry.key_code, entry.modifiers, &character, &char_no_modifiers);
146 DCHECK(result != -1);
147 NSString* string = [NSString stringWithFormat:@"%C", character];
148
149 scoped_ptr<ui::PlatformAccelerator> platform_accelerator(
150 new ui::PlatformAcceleratorCocoa(string, entry.modifiers));
151 accelerator.set_platform_accelerator(platform_accelerator.Pass());
152 accelerator_vector_.push_back(accelerator);
153 }
56 } 154 }
57 155
58 AcceleratorsCocoa::~AcceleratorsCocoa() {} 156 AcceleratorsCocoa::~AcceleratorsCocoa() {}
59 157
60 // static 158 // static
61 AcceleratorsCocoa* AcceleratorsCocoa::GetInstance() { 159 AcceleratorsCocoa* AcceleratorsCocoa::GetInstance() {
62 return Singleton<AcceleratorsCocoa>::get(); 160 return Singleton<AcceleratorsCocoa>::get();
63 } 161 }
64 162
65 const ui::Accelerator* AcceleratorsCocoa::GetAcceleratorForCommand( 163 const ui::Accelerator* AcceleratorsCocoa::GetAcceleratorForCommand(
66 int command_id) { 164 int command_id) {
67 AcceleratorMap::iterator it = accelerators_.find(command_id); 165 AcceleratorMap::iterator it = accelerators_.find(command_id);
68 if (it == accelerators_.end()) 166 if (it == accelerators_.end())
69 return NULL; 167 return NULL;
70 return &it->second; 168 return &it->second;
71 } 169 }
170
171 const ui::Accelerator* AcceleratorsCocoa::GetAcceleratorForHotKey(
172 NSString* key_equivalent, NSUInteger modifiers) const {
173 for (AcceleratorVector::const_iterator it = accelerator_vector_.begin();
174 it != accelerator_vector_.end();
175 ++it) {
176 const ui::Accelerator& accelerator = *it;
177 const ui::PlatformAcceleratorCocoa* platform_accelerator =
Robert Sesek 2014/02/11 22:18:16 This block is also a bit similar to the one above.
erikchen 2014/02/11 23:16:28 Almost all of the duplicated code lies in the invo
178 static_cast<const ui::PlatformAcceleratorCocoa*>(
179 accelerator.platform_accelerator());
180 unichar character;
181 unichar char_no_modifiers;
182 int result =
183 ui::MacKeyCodeForWindowsKeyCode(accelerator.key_code(),
184 platform_accelerator->modifier_mask(),
185 &character,
186 &char_no_modifiers);
187 if (result == -1)
188 return NULL;
189
190 // Check for a match in the modifiers and key_equivalent.
191 NSUInteger mask = platform_accelerator->modifier_mask();
192 BOOL maskEqual =
193 (mask == modifiers) || ((mask & (~NSShiftKeyMask)) == modifiers);
194 NSString* string = [NSString stringWithFormat:@"%C", character];
195 if ([string isEqual:key_equivalent] && maskEqual)
196 return &*it;
197 }
198
199 return NULL;
200 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698