| 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 |