Commit 4534b86e authored by Weidong Guo's avatar Weidong Guo Committed by Commit Bot

Fix Caps Lock remapping issue

Changes:
Remove the Caps Lock modifier for key event when Caps Lock key is
remapped to another key.

BUG=782572
TEST=EventRewriterTest.TestRewriteCapsLock

Change-Id: I561931034acb94719750f9c70f7b8feb6cee5219
Reviewed-on: https://chromium-review.googlesource.com/759816Reviewed-by: default avatarDan Erat <derat@chromium.org>
Commit-Queue: Weidong Guo <weidongg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#515436}
parent 03e612f2
...@@ -1061,6 +1061,44 @@ TEST_F(EventRewriterTest, TestRewriteCapsLock) { ...@@ -1061,6 +1061,44 @@ TEST_F(EventRewriterTest, TestRewriteCapsLock) {
ui::VKEY_F16, ui::DomCode::F16, ui::VKEY_F16, ui::DomCode::F16,
ui::EF_MOD3_DOWN, ui::DomKey::F16)); ui::EF_MOD3_DOWN, ui::DomKey::F16));
EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
// Remap Caps Lock to Control.
IntegerPrefMember caps_lock;
InitModifierKeyPref(&caps_lock, prefs::kLanguageRemapCapsLockKeyTo,
ui::chromeos::ModifierKey::kControlKey);
// Press Caps Lock.
EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
ui::DomCode::CONTROL_LEFT,
ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL),
GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
ui::DomKey::CAPS_LOCK));
// Release Caps Lock.
EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
ui::DomKey::CONTROL),
GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
ui::EF_NONE, ui::DomKey::CAPS_LOCK));
// Press F16.
EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
ui::DomCode::CONTROL_LEFT,
ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL),
GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
ui::VKEY_F16, ui::DomCode::F16,
ui::EF_MOD3_DOWN, ui::DomKey::F16));
// Release F16.
EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
ui::DomKey::CONTROL),
GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
ui::VKEY_F16, ui::DomCode::F16,
ui::EF_MOD3_DOWN, ui::DomKey::F16));
} }
TEST_F(EventRewriterTest, TestRewriteDiamondKey) { TEST_F(EventRewriterTest, TestRewriteDiamondKey) {
......
...@@ -767,6 +767,15 @@ bool EventRewriterChromeOS::RewriteModifierKeys(const ui::KeyEvent& key_event, ...@@ -767,6 +767,15 @@ bool EventRewriterChromeOS::RewriteModifierKeys(const ui::KeyEvent& key_event,
state->key = remapped_key->result.key; state->key = remapped_key->result.key;
incoming.flags |= characteristic_flag; incoming.flags |= characteristic_flag;
characteristic_flag = remapped_key->flag; characteristic_flag = remapped_key->flag;
if (incoming.key_code == ui::VKEY_CAPITAL ||
incoming.key_code == ui::VKEY_F16) {
// Caps Lock is rewritten to another key event, remove EF_CAPS_LOCK_ON
// flag to prevent the keyboard's Caps Lock state being synced to the
// rewritten key event's flag in InputMethodChromeOS. (Caps Lock key on an
// external keyboard generates F16 which is treated as Caps Lock and then
// rewritten.)
incoming.flags &= ~ui::EF_CAPS_LOCK_ON;
}
if (remapped_key->remap_to == ui::chromeos::ModifierKey::kCapsLockKey) if (remapped_key->remap_to == ui::chromeos::ModifierKey::kCapsLockKey)
characteristic_flag |= ui::EF_CAPS_LOCK_ON; characteristic_flag |= ui::EF_CAPS_LOCK_ON;
state->code = RelocateModifier( state->code = RelocateModifier(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment