blob: f0aa835b6833bc62c3072a28818cfae828505fde [file] [log] [blame]
// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ui/base/accelerators/platform_accelerator_cocoa.h"
#import <AppKit/AppKit.h>
#include "ui/events/keycodes/keyboard_code_conversion_mac.h"
@interface KeyEquivalentAndModifierMask ()
@property(strong) NSString* keyEquivalent;
@property(readwrite) NSUInteger modifierMask;
@end
@implementation KeyEquivalentAndModifierMask
@synthesize keyEquivalent = _keyEquivalent;
@synthesize modifierMask = _modifierMask;
@end
namespace ui {
KeyEquivalentAndModifierMask* GetKeyEquivalentAndModifierMaskFromAccelerator(
const ui::Accelerator& accelerator) {
DCHECK_NE(ui::VKEY_UNKNOWN, accelerator.key_code());
NSUInteger cocoa_modifiers = 0;
if (accelerator.IsShiftDown()) {
cocoa_modifiers |= NSEventModifierFlagShift;
}
if (accelerator.IsCtrlDown()) {
cocoa_modifiers |= NSEventModifierFlagControl;
}
if (accelerator.IsAltDown()) {
cocoa_modifiers |= NSEventModifierFlagOption;
}
if (accelerator.IsCmdDown()) {
cocoa_modifiers |= NSEventModifierFlagCommand;
}
if (accelerator.IsFunctionDown()) {
cocoa_modifiers |= NSEventModifierFlagFunction;
}
unichar shifted_character;
unichar character;
int result = ui::MacKeyCodeForWindowsKeyCode(
accelerator.key_code(), cocoa_modifiers, &shifted_character, &character);
DCHECK_NE(result, -1);
// If the key equivalent is itself shifted, then drop Shift from the modifier
// flags, otherwise Shift will be required. E.g., curly braces and plus are
// both inherently shifted, so the key equivalents shouldn't require Shift.
if (shifted_character != character) {
cocoa_modifiers &= ~NSEventModifierFlagShift;
}
KeyEquivalentAndModifierMask* equivalent =
[[KeyEquivalentAndModifierMask alloc] init];
equivalent.keyEquivalent =
[NSString stringWithFormat:@"%C", shifted_character];
equivalent.modifierMask = cocoa_modifiers;
return equivalent;
}
} // namespace ui