Index: ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc |
diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc |
index b72f6f208e3fd8deb9939b8cae47183269bc1802..aacfc8a483a6a5b58dffe71a66e81a261ac5b230 100644 |
--- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc |
+++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc |
@@ -827,6 +827,13 @@ void XkbKeyboardLayoutEngine::SetKeymap(xkb_keymap* keymap) { |
if (index == XKB_MOD_INVALID) { |
DVLOG(3) << "XKB keyboard layout does not contain " << flags[i].xkb_name; |
} else { |
+ if (flags[i].ui_flag == ui::EF_SHIFT_DOWN) |
+ xkb_mod_indexes_.shift = index; |
+ else if (flags[i].ui_flag == ui::EF_CONTROL_DOWN) |
+ xkb_mod_indexes_.control = index; |
+ else if (flags[i].ui_flag == ui::EF_ALT_DOWN) |
+ xkb_mod_indexes_.alt = index; |
+ |
xkb_mod_mask_t flag = static_cast<xkb_mod_mask_t>(1) << index; |
XkbFlagMapEntry e = {flags[i].ui_flag, flag}; |
xkb_flag_map_.push_back(e); |
@@ -975,4 +982,27 @@ void XkbKeyboardLayoutEngine::ParseLayoutName(const std::string& layout_name, |
} |
} |
+int XkbKeyboardLayoutEngine::UpdateModifiers(uint32_t depressed_mods, |
+ uint32_t latched_mods, |
+ uint32_t locked_mods, |
+ uint32_t group) { |
+ xkb_state_update_mask(xkb_state_.get(), depressed_mods, latched_mods, |
+ locked_mods, 0, 0, group); |
+ |
+ int modifiers = 0; |
+ auto component = static_cast<xkb_state_component>(XKB_STATE_MODS_DEPRESSED | |
+ XKB_STATE_MODS_LATCHED); |
+ if (xkb_state_mod_index_is_active(xkb_state_.get(), xkb_mod_indexes_.control, |
+ component)) |
+ modifiers |= EF_CONTROL_DOWN; |
+ if (xkb_state_mod_index_is_active(xkb_state_.get(), xkb_mod_indexes_.alt, |
+ component)) |
+ modifiers |= EF_ALT_DOWN; |
+ if (xkb_state_mod_index_is_active(xkb_state_.get(), xkb_mod_indexes_.shift, |
+ component)) |
+ modifiers |= EF_SHIFT_DOWN; |
+ |
+ return modifiers; |
+} |
+ |
} // namespace ui |