1// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <Carbon/Carbon.h>
6
7#include <cstdint>
8#include <string>
9
10#include "base/mac/foundation_util.h"
11#include "ui/events/keycodes/dom/dom_code.h"
12#include "ui/events/keycodes/dom/dom_key.h"
13#include "ui/events/keycodes/dom/dom_keyboard_layout_map_base.h"
14#include "ui/events/keycodes/dom/keycode_converter.h"
15#include "ui/events/keycodes/keyboard_code_conversion_mac.h"
16
17namespace ui {
18
19namespace {
20
21class DomKeyboardLayoutMapMac : public ui::DomKeyboardLayoutMapBase {
22 public:
23  DomKeyboardLayoutMapMac();
24  ~DomKeyboardLayoutMapMac() override;
25
26  // ui::DomKeyboardLayoutMapBase implementation.
27  uint32_t GetKeyboardLayoutCount() override;
28  ui::DomKey GetDomKeyFromDomCodeForLayout(
29      ui::DomCode dom_code,
30      uint32_t keyboard_layout_index) override;
31
32 private:
33  DISALLOW_COPY_AND_ASSIGN(DomKeyboardLayoutMapMac);
34};
35
36DomKeyboardLayoutMapMac::DomKeyboardLayoutMapMac() = default;
37
38DomKeyboardLayoutMapMac::~DomKeyboardLayoutMapMac() = default;
39
40uint32_t DomKeyboardLayoutMapMac::GetKeyboardLayoutCount() {
41  return 1;
42}
43
44ui::DomKey DomKeyboardLayoutMapMac::GetDomKeyFromDomCodeForLayout(
45    ui::DomCode dom_code,
46    uint32_t keyboard_layout_index) {
47  DCHECK_NE(dom_code, ui::DomCode::NONE);
48  DCHECK_EQ(keyboard_layout_index, 0U);
49
50  UInt32 dead_key_state = 0;
51  uint16_t key_code = ui::KeycodeConverter::DomCodeToNativeKeycode(dom_code);
52  base::ScopedCFTypeRef<TISInputSourceRef> input_source(
53      TISCopyCurrentASCIICapableKeyboardLayoutInputSource());
54  UniChar char_value = ui::TranslatedUnicodeCharFromKeyCode(
55      input_source.get(), key_code, kUCKeyActionDisplay, 0, LMGetKbdType(),
56      &dead_key_state);
57
58  if (!char_value)
59    return ui::DomKey::NONE;
60
61  if (dead_key_state)
62    return DomKey::DeadKeyFromCombiningCharacter(char_value);
63
64  return DomKey::FromCharacter(char_value);
65}
66
67}  // namespace
68
69// static
70base::flat_map<std::string, std::string> GenerateDomKeyboardLayoutMap() {
71  return DomKeyboardLayoutMapMac().Generate();
72}
73
74}  // namespace ui
75