| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h" | 5 #include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <xkbcommon/xkbcommon-names.h> | 8 #include <xkbcommon/xkbcommon-names.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 } | 685 } |
| 686 LoadKeymapCallback reply_callback = base::Bind( | 686 LoadKeymapCallback reply_callback = base::Bind( |
| 687 &XkbKeyboardLayoutEngine::OnKeymapLoaded, weak_ptr_factory_.GetWeakPtr()); | 687 &XkbKeyboardLayoutEngine::OnKeymapLoaded, weak_ptr_factory_.GetWeakPtr()); |
| 688 base::PostTaskWithTraits( | 688 base::PostTaskWithTraits( |
| 689 FROM_HERE, base::TaskTraits() | 689 FROM_HERE, base::TaskTraits() |
| 690 .WithShutdownBehavior( | 690 .WithShutdownBehavior( |
| 691 base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) | 691 base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) |
| 692 .MayBlock(), | 692 .MayBlock(), |
| 693 base::Bind(&LoadKeymap, layout_name, base::ThreadTaskRunnerHandle::Get(), | 693 base::Bind(&LoadKeymap, layout_name, base::ThreadTaskRunnerHandle::Get(), |
| 694 reply_callback)); | 694 reply_callback)); |
| 695 #else |
| 696 NOTIMPLEMENTED(); |
| 697 #endif // defined(OS_CHROMEOS) |
| 695 return true; | 698 return true; |
| 696 #else | |
| 697 // Required by ozone-wayland (at least) for non ChromeOS builds. See | |
| 698 // http://xkbcommon.org/doc/current/md_doc_quick-guide.html for further info. | |
| 699 xkb_keymap* keymap = xkb_keymap_new_from_string( | |
| 700 xkb_context_.get(), layout_name.c_str(), XKB_KEYMAP_FORMAT_TEXT_V1, | |
| 701 XKB_KEYMAP_COMPILE_NO_FLAGS); | |
| 702 if (!keymap) | |
| 703 return false; | |
| 704 SetKeymap(keymap); | |
| 705 return true; | |
| 706 #endif // defined(OS_CHROMEOS) | |
| 707 } | 699 } |
| 708 | 700 |
| 709 void XkbKeyboardLayoutEngine::OnKeymapLoaded( | 701 void XkbKeyboardLayoutEngine::OnKeymapLoaded( |
| 710 const std::string& layout_name, | 702 const std::string& layout_name, |
| 711 std::unique_ptr<char, base::FreeDeleter> keymap_str) { | 703 std::unique_ptr<char, base::FreeDeleter> keymap_str) { |
| 712 if (keymap_str) { | 704 if (keymap_str) { |
| 713 xkb_keymap* keymap = xkb_keymap_new_from_string( | 705 xkb_keymap* keymap = xkb_keymap_new_from_string( |
| 714 xkb_context_.get(), keymap_str.get(), XKB_KEYMAP_FORMAT_TEXT_V1, | 706 xkb_context_.get(), keymap_str.get(), XKB_KEYMAP_FORMAT_TEXT_V1, |
| 715 XKB_KEYMAP_COMPILE_NO_FLAGS); | 707 XKB_KEYMAP_COMPILE_NO_FLAGS); |
| 716 XkbKeymapEntry entry = {layout_name, keymap}; | 708 XkbKeymapEntry entry = {layout_name, keymap}; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 795 *key_code = AlphanumericKeyboardCode(xkb_keysym, character); | 787 *key_code = AlphanumericKeyboardCode(xkb_keysym, character); |
| 796 if (*key_code == VKEY_UNKNOWN) { | 788 if (*key_code == VKEY_UNKNOWN) { |
| 797 *key_code = DifficultKeyboardCode(dom_code, flags, xkb_keycode, xkb_flags, | 789 *key_code = DifficultKeyboardCode(dom_code, flags, xkb_keycode, xkb_flags, |
| 798 xkb_keysym, character); | 790 xkb_keysym, character); |
| 799 if (*key_code == VKEY_UNKNOWN) | 791 if (*key_code == VKEY_UNKNOWN) |
| 800 *key_code = DomCodeToUsLayoutNonLocatedKeyboardCode(dom_code); | 792 *key_code = DomCodeToUsLayoutNonLocatedKeyboardCode(dom_code); |
| 801 } | 793 } |
| 802 return true; | 794 return true; |
| 803 } | 795 } |
| 804 | 796 |
| 805 void XkbKeyboardLayoutEngine::SetKeymapFromStringForTest( | 797 bool XkbKeyboardLayoutEngine::SetCurrentLayoutFromBuffer( |
| 806 const char* keymap_string) { | 798 const char* keymap_string, |
| 807 xkb_keymap* keymap = xkb_keymap_new_from_string( | 799 size_t size) { |
| 808 xkb_context_.get(), keymap_string, XKB_KEYMAP_FORMAT_TEXT_V1, | 800 xkb_keymap* keymap = xkb_keymap_new_from_buffer( |
| 801 xkb_context_.get(), keymap_string, size, XKB_KEYMAP_FORMAT_TEXT_V1, |
| 809 XKB_KEYMAP_COMPILE_NO_FLAGS); | 802 XKB_KEYMAP_COMPILE_NO_FLAGS); |
| 810 if (keymap) | 803 if (!keymap) |
| 811 SetKeymap(keymap); | 804 return false; |
| 805 |
| 806 SetKeymap(keymap); |
| 807 return true; |
| 812 } | 808 } |
| 813 | 809 |
| 814 void XkbKeyboardLayoutEngine::SetKeymap(xkb_keymap* keymap) { | 810 void XkbKeyboardLayoutEngine::SetKeymap(xkb_keymap* keymap) { |
| 815 xkb_state_.reset(xkb_state_new(keymap)); | 811 xkb_state_.reset(xkb_state_new(keymap)); |
| 816 // Update flag map. | 812 // Update flag map. |
| 817 static const struct { | 813 static const struct { |
| 818 int ui_flag; | 814 int ui_flag; |
| 819 const char* xkb_name; | 815 const char* xkb_name; |
| 820 } flags[] = {{ui::EF_SHIFT_DOWN, XKB_MOD_NAME_SHIFT}, | 816 } flags[] = {{ui::EF_SHIFT_DOWN, XKB_MOD_NAME_SHIFT}, |
| 821 {ui::EF_CONTROL_DOWN, XKB_MOD_NAME_CTRL}, | 817 {ui::EF_CONTROL_DOWN, XKB_MOD_NAME_CTRL}, |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 973 close_index = layout_name.size(); | 969 close_index = layout_name.size(); |
| 974 *layout_variant = layout_name.substr(parentheses_index + 1, | 970 *layout_variant = layout_name.substr(parentheses_index + 1, |
| 975 close_index - parentheses_index - 1); | 971 close_index - parentheses_index - 1); |
| 976 } else if (dash_index != std::string::npos) { | 972 } else if (dash_index != std::string::npos) { |
| 977 *layout_id = layout_name.substr(0, dash_index); | 973 *layout_id = layout_name.substr(0, dash_index); |
| 978 *layout_variant = layout_name.substr(dash_index + 1); | 974 *layout_variant = layout_name.substr(dash_index + 1); |
| 979 } | 975 } |
| 980 } | 976 } |
| 981 | 977 |
| 982 } // namespace ui | 978 } // namespace ui |
| OLD | NEW |