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 <xkbcommon/xkbcommon-names.h> | 7 #include <xkbcommon/xkbcommon-names.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "ui/events/event_constants.h" | 10 #include "ui/events/event_constants.h" |
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 } // anonymous namespace | 619 } // anonymous namespace |
620 | 620 |
621 XkbKeyCodeConverter::XkbKeyCodeConverter() { | 621 XkbKeyCodeConverter::XkbKeyCodeConverter() { |
622 } | 622 } |
623 | 623 |
624 XkbKeyCodeConverter::~XkbKeyCodeConverter() { | 624 XkbKeyCodeConverter::~XkbKeyCodeConverter() { |
625 } | 625 } |
626 | 626 |
627 XkbKeyboardLayoutEngine::XkbKeyboardLayoutEngine( | 627 XkbKeyboardLayoutEngine::XkbKeyboardLayoutEngine( |
628 const XkbKeyCodeConverter& converter) | 628 const XkbKeyCodeConverter& converter) |
629 : key_code_converter_(converter) { | 629 : num_lock_mod_mask_(0), |
| 630 key_code_converter_(converter) { |
630 // TODO: add XKB_CONTEXT_NO_ENVIRONMENT_NAMES | 631 // TODO: add XKB_CONTEXT_NO_ENVIRONMENT_NAMES |
631 xkb_context_.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES)); | 632 xkb_context_.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES)); |
632 xkb_context_include_path_append(xkb_context_.get(), | 633 xkb_context_include_path_append(xkb_context_.get(), |
633 "/usr/share/X11/xkb"); | 634 "/usr/share/X11/xkb"); |
634 } | 635 } |
635 | 636 |
636 XkbKeyboardLayoutEngine::~XkbKeyboardLayoutEngine() { | 637 XkbKeyboardLayoutEngine::~XkbKeyboardLayoutEngine() { |
637 } | 638 } |
638 | 639 |
639 bool XkbKeyboardLayoutEngine::CanSetCurrentLayout() const { | 640 bool XkbKeyboardLayoutEngine::CanSetCurrentLayout() const { |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 xkb_state_.reset(xkb_state_new(keymap)); | 743 xkb_state_.reset(xkb_state_new(keymap)); |
743 // Update flag map. | 744 // Update flag map. |
744 static const struct { | 745 static const struct { |
745 int ui_flag; | 746 int ui_flag; |
746 const char* xkb_name; | 747 const char* xkb_name; |
747 } flags[] = {{ui::EF_CONTROL_DOWN, XKB_MOD_NAME_CTRL}, | 748 } flags[] = {{ui::EF_CONTROL_DOWN, XKB_MOD_NAME_CTRL}, |
748 {ui::EF_SHIFT_DOWN, XKB_MOD_NAME_SHIFT}, | 749 {ui::EF_SHIFT_DOWN, XKB_MOD_NAME_SHIFT}, |
749 {ui::EF_ALT_DOWN, XKB_MOD_NAME_ALT}, | 750 {ui::EF_ALT_DOWN, XKB_MOD_NAME_ALT}, |
750 {ui::EF_CAPS_LOCK_DOWN, XKB_MOD_NAME_CAPS}, | 751 {ui::EF_CAPS_LOCK_DOWN, XKB_MOD_NAME_CAPS}, |
751 {ui::EF_COMMAND_DOWN, XKB_MOD_NAME_LOGO}, | 752 {ui::EF_COMMAND_DOWN, XKB_MOD_NAME_LOGO}, |
752 {ui::EF_NUMPAD_KEY, XKB_MOD_NAME_NUM}, | |
753 {ui::EF_MOD3_DOWN, "Mod3"}, | 753 {ui::EF_MOD3_DOWN, "Mod3"}, |
754 {ui::EF_ALTGR_DOWN, "Mod5"}}; | 754 {ui::EF_ALTGR_DOWN, "Mod5"}}; |
755 xkb_flag_map_.clear(); | 755 xkb_flag_map_.clear(); |
756 xkb_flag_map_.resize(arraysize(flags)); | 756 xkb_flag_map_.resize(arraysize(flags)); |
757 for (size_t i = 0; i < arraysize(flags); ++i) { | 757 for (size_t i = 0; i < arraysize(flags); ++i) { |
758 xkb_mod_index_t index = xkb_keymap_mod_get_index(keymap, flags[i].xkb_name); | 758 xkb_mod_index_t index = xkb_keymap_mod_get_index(keymap, flags[i].xkb_name); |
759 if (index == XKB_MOD_INVALID) { | 759 if (index == XKB_MOD_INVALID) { |
760 DVLOG(3) << "XKB keyboard layout does not contain " << flags[i].xkb_name; | 760 DVLOG(3) << "XKB keyboard layout does not contain " << flags[i].xkb_name; |
761 } else { | 761 } else { |
762 xkb_mod_mask_t flag = static_cast<xkb_mod_mask_t>(1) << index; | 762 xkb_mod_mask_t flag = static_cast<xkb_mod_mask_t>(1) << index; |
763 XkbFlagMapEntry e = {flags[i].ui_flag, flag}; | 763 XkbFlagMapEntry e = {flags[i].ui_flag, flag}; |
764 xkb_flag_map_.push_back(e); | 764 xkb_flag_map_.push_back(e); |
765 } | 765 } |
766 } | 766 } |
| 767 |
| 768 // Update num lock mask. |
| 769 num_lock_mod_mask_ = 0; |
| 770 xkb_mod_index_t num_mod_index = |
| 771 xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_NUM); |
| 772 if (num_mod_index != XKB_MOD_INVALID) |
| 773 num_lock_mod_mask_ = static_cast<xkb_mod_mask_t>(1) << num_mod_index; |
767 } | 774 } |
768 | 775 |
769 xkb_mod_mask_t XkbKeyboardLayoutEngine::EventFlagsToXkbFlags( | 776 xkb_mod_mask_t XkbKeyboardLayoutEngine::EventFlagsToXkbFlags( |
770 int ui_flags) const { | 777 int ui_flags) const { |
771 xkb_mod_mask_t xkb_flags = 0; | 778 xkb_mod_mask_t xkb_flags = 0; |
772 for (const auto& entry : xkb_flag_map_) { | 779 for (const auto& entry : xkb_flag_map_) { |
773 if (ui_flags & entry.ui_flag) | 780 if (ui_flags & entry.ui_flag) |
774 xkb_flags |= entry.xkb_flag; | 781 xkb_flags |= entry.xkb_flag; |
775 } | 782 } |
| 783 // NumLock is always on. |
| 784 xkb_flags |= num_lock_mod_mask_; |
776 return xkb_flags; | 785 return xkb_flags; |
777 } | 786 } |
778 | 787 |
779 bool XkbKeyboardLayoutEngine::XkbLookup(xkb_keycode_t xkb_keycode, | 788 bool XkbKeyboardLayoutEngine::XkbLookup(xkb_keycode_t xkb_keycode, |
780 xkb_mod_mask_t xkb_flags, | 789 xkb_mod_mask_t xkb_flags, |
781 xkb_keysym_t* xkb_keysym, | 790 xkb_keysym_t* xkb_keysym, |
782 base::char16* character) const { | 791 base::char16* character) const { |
783 if (!xkb_state_) { | 792 if (!xkb_state_) { |
784 LOG(ERROR) << "No current XKB state"; | 793 LOG(ERROR) << "No current XKB state"; |
785 return false; | 794 return false; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
875 if (flags == base_flags) | 884 if (flags == base_flags) |
876 return base_character; | 885 return base_character; |
877 xkb_keysym_t keysym; | 886 xkb_keysym_t keysym; |
878 base::char16 character = 0; | 887 base::char16 character = 0; |
879 if (!XkbLookup(xkb_keycode, flags, &keysym, &character)) | 888 if (!XkbLookup(xkb_keycode, flags, &keysym, &character)) |
880 character = kNone; | 889 character = kNone; |
881 return character; | 890 return character; |
882 } | 891 } |
883 | 892 |
884 } // namespace ui | 893 } // namespace ui |
OLD | NEW |