From b16c19ce32714a02a0cffada488c5a918ae63fdd Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 16 May 2013 15:24:18 +0800 Subject: [PATCH] Convert generic accelerator to platform accelerator. When creating menus, the accelerators must be converted to platform accelerators before they can be used. --- atom.gyp | 1 + browser/accelerator_util.cc | 4 ++++ browser/accelerator_util.h | 3 +++ browser/accelerator_util_mac.mm | 34 +++++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 browser/accelerator_util_mac.mm diff --git a/atom.gyp b/atom.gyp index a929296121..60d91c3cb4 100644 --- a/atom.gyp +++ b/atom.gyp @@ -31,6 +31,7 @@ 'app/atom_main_delegate.h', 'browser/accelerator_util.cc', 'browser/accelerator_util.h', + 'browser/accelerator_util_mac.mm', 'browser/api/atom_api_app.cc', 'browser/api/atom_api_app.h', 'browser/api/atom_api_browser_ipc.cc', diff --git a/browser/accelerator_util.cc b/browser/accelerator_util.cc index 74c5ff723a..8f44fabbb2 100644 --- a/browser/accelerator_util.cc +++ b/browser/accelerator_util.cc @@ -43,6 +43,7 @@ bool StringToAccelerator(const std::string& description, std::vector tokens; base::SplitString(shortcut, '+', &tokens); if (tokens.size() < 2 || tokens.size() > 3) { + LOG(WARNING) << "Invalid accelerator description: " << description; return false; } @@ -69,15 +70,18 @@ bool StringToAccelerator(const std::string& description, } else if (tokens[i][0] >= '0' && tokens[i][0] <= '9') { key = static_cast(ui::VKEY_0 + (tokens[i][0] - '0')); } else { + LOG(WARNING) << "Invalid accelerator character: " << tokens[i]; key = ui::VKEY_UNKNOWN; break; } } else { + LOG(WARNING) << "Invalid accelerator token: " << tokens[i]; return false; } } *accelerator = ui::Accelerator(key, modifiers); + SetPlatformAccelerator(accelerator); return true; } diff --git a/browser/accelerator_util.h b/browser/accelerator_util.h index 200f4a7296..758ca8015e 100644 --- a/browser/accelerator_util.h +++ b/browser/accelerator_util.h @@ -17,6 +17,9 @@ namespace accelerator_util { bool StringToAccelerator(const std::string& description, ui::Accelerator* accelerator); +// Set platform accelerator for the Accelerator. +void SetPlatformAccelerator(ui::Accelerator* accelerator); + } // namespace accelerator_util #endif // BROWSER_ACCELERATOR_UTIL_H_ diff --git a/browser/accelerator_util_mac.mm b/browser/accelerator_util_mac.mm new file mode 100644 index 0000000000..033e79f308 --- /dev/null +++ b/browser/accelerator_util_mac.mm @@ -0,0 +1,34 @@ +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "browser/accelerator_util.h" + +#include "ui/base/accelerators/accelerator.h" +#import "ui/base/accelerators/platform_accelerator_cocoa.h" +#import "ui/base/keycodes/keyboard_code_conversion_mac.h" + +namespace accelerator_util { + +void SetPlatformAccelerator(ui::Accelerator* accelerator) { + unichar character; + unichar characterIgnoringModifiers; + ui::MacKeyCodeForWindowsKeyCode(accelerator->key_code(), + 0, + &character, + &characterIgnoringModifiers); + NSString* characters = + [[[NSString alloc] initWithCharacters:&character length:1] autorelease]; + + NSUInteger modifiers = + (accelerator->IsCtrlDown() ? NSControlKeyMask : 0) | + (accelerator->IsCmdDown() ? NSCommandKeyMask : 0) | + (accelerator->IsAltDown() ? NSAlternateKeyMask : 0) | + (accelerator->IsShiftDown() ? NSShiftKeyMask : 0); + + scoped_ptr platform_accelerator( + new ui::PlatformAcceleratorCocoa(characters, modifiers)); + accelerator->set_platform_accelerator(platform_accelerator.Pass()); +} + +} // namespace accelerator_util