910e62b5创建于 1月15日历史提交
// 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