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 |