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