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

Unified 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 side-by-side diff with in-line comments
Download patch
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..32262777e5796610df5aca3f51bd574ee43dc264 100644
--- a/chrome/browser/ui/cocoa/accelerators_cocoa.mm
+++ b/chrome/browser/ui/cocoa/accelerators_cocoa.mm
@@ -6,53 +6,151 @@
#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/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},
};
+// 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.
+int CrossPlatformModifiersFromCocoaModifiers(NSUInteger modifiers) {
+ int x_modifiers = 0;
+ if ((modifiers & NSCommandKeyMask) != 0)
+ x_modifiers |= ui::EF_COMMAND_DOWN;
+ if ((modifiers & NSAlternateKeyMask) != 0)
+ x_modifiers |= ui::EF_ALT_DOWN;
+ if ((modifiers & NSShiftKeyMask) != 0)
+ x_modifiers |= ui::EF_SHIFT_DOWN;
+ if ((modifiers & NSControlKeyMask) != 0)
+ x_modifiers |= ui::EF_CONTROL_DOWN;
+ return x_modifiers;
+}
+
} // namespace
AcceleratorsCocoa::AcceleratorsCocoa() {
for (size_t i = 0; i < arraysize(kAcceleratorMap); ++i) {
const AcceleratorMapping& entry = kAcceleratorMap[i];
- ui::Accelerator accelerator(ui::VKEY_UNKNOWN, 0);
+ int x_modifiers = CrossPlatformModifiersFromCocoaModifiers(entry.modifiers);
+ ui::Accelerator accelerator(entry.key_code, x_modifiers);
+
+ unichar character;
+ unichar char_no_modifiers;
+ int result = ui::MacKeyCodeForWindowsKeyCode(
+ entry.key_code, entry.modifiers, &character, &char_no_modifiers);
+ DCHECK(result != -1);
+ NSString* key_equivalent = [NSString stringWithFormat:@"%C", character];
+
scoped_ptr<ui::PlatformAccelerator> platform_accelerator(
- new ui::PlatformAcceleratorCocoa(entry.key, entry.modifiers));
+ new ui::PlatformAcceleratorCocoa(key_equivalent, entry.modifiers));
+
Robert Sesek 2014/02/11 22:18:16 nit: extra blank line
erikchen 2014/02/11 23:16:28 Done.
+
accelerator.set_platform_accelerator(platform_accelerator.Pass());
accelerators_.insert(std::make_pair(entry.command_id, accelerator));
}
+ 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.
+ const AcceleratorListing& entry = kAcceleratorList[i];
+ int x_modifiers = CrossPlatformModifiersFromCocoaModifiers(entry.modifiers);
+ ui::Accelerator accelerator(entry.key_code, x_modifiers);
+
+ unichar character;
+ unichar char_no_modifiers;
+ int result = ui::MacKeyCodeForWindowsKeyCode(
+ entry.key_code, entry.modifiers, &character, &char_no_modifiers);
+ DCHECK(result != -1);
+ NSString* string = [NSString stringWithFormat:@"%C", character];
+
+ scoped_ptr<ui::PlatformAccelerator> platform_accelerator(
+ new ui::PlatformAcceleratorCocoa(string, entry.modifiers));
+ accelerator.set_platform_accelerator(platform_accelerator.Pass());
+ accelerator_vector_.push_back(accelerator);
+ }
}
AcceleratorsCocoa::~AcceleratorsCocoa() {}
@@ -69,3 +167,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 =
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
+ 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;
+}

Powered by Google App Engine
This is Rietveld 408576698