diff --git a/chrome/browser/chromeos/events/event_rewriter.cc b/chrome/browser/chromeos/events/event_rewriter.cc index d1621b9cb6ea4..01bb2b2aa7497 100644 --- a/chrome/browser/chromeos/events/event_rewriter.cc +++ b/chrome/browser/chromeos/events/event_rewriter.cc @@ -291,7 +291,6 @@ EventRewriter::EventRewriter(ash::StickyKeysController* sticky_keys_controller) ime_keyboard_for_testing_(NULL), pref_service_for_testing_(NULL), sticky_keys_controller_(sticky_keys_controller), - current_diamond_key_modifier_flags_(ui::EF_NONE), pressed_modifier_latches_(ui::EF_NONE), latched_modifier_latches_(ui::EF_NONE), used_modifier_latches_(ui::EF_NONE) {} @@ -430,8 +429,7 @@ int EventRewriter::GetRemappedModifierMasks(const PrefService& pref_service, const ui::Event& event, int original_flags) const { int unmodified_flags = original_flags; - int rewritten_flags = current_diamond_key_modifier_flags_ | - pressed_modifier_latches_ | latched_modifier_latches_; + int rewritten_flags = pressed_modifier_latches_ | latched_modifier_latches_; for (size_t i = 0; unmodified_flags && (i < arraysize(kModifierRemappings)); ++i) { const ModifierRemapping* remapped_key = NULL; @@ -737,15 +735,6 @@ bool EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event, DCHECK_EQ(ui::VKEY_CONTROL, kModifierRemappingCtrl->result.key_code); remapped_key = kModifierRemappingCtrl; } - // F15 is not a modifier key, so we need to track its state directly. - if (key_event.type() == ui::ET_KEY_PRESSED) { - int remapped_flag = remapped_key->flag; - if (remapped_key->remap_to == input_method::kCapsLockKey) - remapped_flag |= ui::EF_CAPS_LOCK_DOWN; - current_diamond_key_modifier_flags_ = remapped_flag; - } else { - current_diamond_key_modifier_flags_ = ui::EF_NONE; - } break; // On Chrome OS, XF86XK_Launch7 (F16) with Mod3Mask is sent when Caps Lock // is pressed (with one exception: when @@ -793,6 +782,8 @@ bool EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event, state->key = remapped_key->result.key; incoming.flags |= characteristic_flag; characteristic_flag = remapped_key->flag; + if (remapped_key->remap_to == input_method::kCapsLockKey) + characteristic_flag |= ui::EF_CAPS_LOCK_DOWN; state->code = RelocateModifier( state->code, ui::KeycodeConverter::DomCodeToLocation(incoming.code)); } @@ -800,10 +791,21 @@ bool EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event, // Next, remap modifier bits. state->flags |= GetRemappedModifierMasks(*pref_service, key_event, incoming.flags); - if (key_event.type() == ui::ET_KEY_PRESSED) + + // If the DomKey is not a modifier before remapping but is after, set the + // modifier latches for the later non-modifier key's modifier states. + bool non_modifier_to_modifier = + !ui::KeycodeConverter::IsDomKeyForModifier(incoming.key) && + ui::KeycodeConverter::IsDomKeyForModifier(state->key); + if (key_event.type() == ui::ET_KEY_PRESSED) { state->flags |= characteristic_flag; - else + if (non_modifier_to_modifier) + pressed_modifier_latches_ |= characteristic_flag; + } else { state->flags &= ~characteristic_flag; + if (non_modifier_to_modifier) + pressed_modifier_latches_ &= ~characteristic_flag; + } if (key_event.type() == ui::ET_KEY_PRESSED) { if (!ui::KeycodeConverter::IsDomKeyForModifier(state->key)) { diff --git a/chrome/browser/chromeos/events/event_rewriter.h b/chrome/browser/chromeos/events/event_rewriter.h index 82352795d0a8e..6ecd8fe541693 100644 --- a/chrome/browser/chromeos/events/event_rewriter.h +++ b/chrome/browser/chromeos/events/event_rewriter.h @@ -179,13 +179,6 @@ class EventRewriter : public ui::EventRewriter { // at time of writing it is a singleton in ash::Shell. ash::StickyKeysController* sticky_keys_controller_; - // The ChromeOS Diamond key arrives as F15. Since F15 is not a modifier, - // we need to track its pressed state explicitly, and apply the selected - // modifier flag to key and mouse presses that arrive while F15 is down. - // While the Diamond key is down, this holds the corresponding modifier - // ui::EventFlags; otherwise it is EF_NONE. - int current_diamond_key_modifier_flags_; - // Some keyboard layouts have 'latching' keys, which either apply // a modifier while held down (like normal modifiers), or, if no // non-modifier is pressed while the latching key is down, apply the @@ -196,6 +189,8 @@ class EventRewriter : public ui::EventRewriter { // here, sticky keys, and the system layer (X11 or Ozone), and could // do with refactoring. // - |pressed_modifier_latches_| records the latching keys currently pressed. + // It also records the active modifier flags for non-modifier keys that are + // remapped to modifiers, e.g. Diamond/F15. // - |latched_modifier_latches_| records the latching keys just released, // to be applied to the next non-modifier key. // - |used_modifier_latches_| records the latching keys applied to a non- diff --git a/chrome/browser/chromeos/events/event_rewriter_unittest.cc b/chrome/browser/chromeos/events/event_rewriter_unittest.cc index edc1a5167bf7e..cb479d575a2b8 100644 --- a/chrome/browser/chromeos/events/event_rewriter_unittest.cc +++ b/chrome/browser/chromeos/events/event_rewriter_unittest.cc @@ -959,7 +959,8 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { // Press Search. EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, - ui::DomCode::CAPS_LOCK, ui::EF_MOD3_DOWN, + ui::DomCode::CAPS_LOCK, + ui::EF_MOD3_DOWN | ui::EF_CAPS_LOCK_DOWN, ui::DomKey::CAPS_LOCK), GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_LWIN, ui::DomCode::OS_LEFT,