diff options
author | mazda@chromium.org <mazda@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-22 21:42:07 +0000 |
---|---|---|
committer | mazda@chromium.org <mazda@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-22 21:42:07 +0000 |
commit | 7de273c49ee20a11b508af43e3a59c1300943280 (patch) | |
tree | 9ac6c2a6b88a68470a313d0a6265a5d3bdb2b1bf /ui | |
parent | 2c17b82e626c07c9f0dd2f1533f6576c6d31ba41 (diff) | |
download | chromium_src-7de273c49ee20a11b508af43e3a59c1300943280.zip chromium_src-7de273c49ee20a11b508af43e3a59c1300943280.tar.gz chromium_src-7de273c49ee20a11b508af43e3a59c1300943280.tar.bz2 |
Normalize the event flags of ui::KeyEvent.
I need this change to make single modifier accelerators, which I'll add in the CL below, work consistently for both NativeWidgetAura and RenderWidgetHostViewAura.
http://codereview.chromium.org/10831384/
BUG=138575
TEST="ui_unittests --gtest_filter=EventTest.NormalizeKeyEventFlags"
Review URL: https://chromiumcodereview.appspot.com/10828409
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@152816 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/base/event.cc | 27 | ||||
-rw-r--r-- | ui/base/event.h | 5 | ||||
-rw-r--r-- | ui/base/event_unittest.cc | 81 |
3 files changed, 113 insertions, 0 deletions
diff --git a/ui/base/event.cc b/ui/base/event.cc index 0294ddd..2db3b09 100644 --- a/ui/base/event.cc +++ b/ui/base/event.cc @@ -338,6 +338,9 @@ KeyEvent::KeyEvent(const base::NativeEvent& native_event, bool is_char) is_char_(is_char), character_(0), unmodified_character_(0) { +#if defined(USE_X11) + NormalizeFlags(); +#endif } KeyEvent::KeyEvent(EventType type, @@ -412,6 +415,30 @@ KeyEvent* KeyEvent::Copy() { return copy; } +void KeyEvent::NormalizeFlags() { + int mask = 0; + switch (key_code()) { + case ui::VKEY_CONTROL: + mask = ui::EF_CONTROL_DOWN; + break; + case ui::VKEY_SHIFT: + mask = ui::EF_SHIFT_DOWN; + break; + case ui::VKEY_MENU: + mask = ui::EF_ALT_DOWN; + break; + case ui::VKEY_CAPITAL: + mask = ui::EF_CAPS_LOCK_DOWN; + break; + default: + return; + } + if (type() == ui::ET_KEY_PRESSED) + set_flags(flags() | mask); + else + set_flags(flags() & ~mask); +} + //////////////////////////////////////////////////////////////////////////////// // TranslatedKeyEvent diff --git a/ui/base/event.h b/ui/base/event.h index d7b2c2c..c34b914 100644 --- a/ui/base/event.h +++ b/ui/base/event.h @@ -424,6 +424,11 @@ class UI_EXPORT KeyEvent : public Event { // called. void set_key_code(KeyboardCode key_code) { key_code_ = key_code; } + // Normalizes flags_ to make it Windows/Mac compatible. Since the way + // of setting modifier mask on X is very different than Windows/Mac as shown + // in http://crbug.com/127142#c8, the normalization is necessary. + void NormalizeFlags(); + private: KeyboardCode key_code_; // True if this is a translated character event (vs. a raw key down). Both diff --git a/ui/base/event_unittest.cc b/ui/base/event_unittest.cc index e1b1505..fde2b76 100644 --- a/ui/base/event_unittest.cc +++ b/ui/base/event_unittest.cc @@ -206,4 +206,85 @@ TEST(EventTest, MAYBE_KeyEventDirectUnicode) { EXPECT_EQ(0x1234U, key2.GetUnmodifiedCharacter()); } +TEST(EventTest, NormalizeKeyEventFlags) { +#if defined(USE_X11) + // Normalize flags when KeyEvent is created from XEvent. + { + scoped_ptr<XEvent> native_event(new XEvent); + InitXKeyEventForTesting(ET_KEY_PRESSED, VKEY_SHIFT, EF_SHIFT_DOWN, + native_event.get()); + KeyEvent keyev(native_event.get(), false); + EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags()); + } + { + scoped_ptr<XEvent> native_event(new XEvent); + InitXKeyEventForTesting(ET_KEY_RELEASED, VKEY_SHIFT, EF_SHIFT_DOWN, + native_event.get()); + KeyEvent keyev(native_event.get(), false); + EXPECT_EQ(EF_NONE, keyev.flags()); + } + { + scoped_ptr<XEvent> native_event(new XEvent); + InitXKeyEventForTesting(ET_KEY_PRESSED, VKEY_CONTROL, EF_CONTROL_DOWN, + native_event.get()); + KeyEvent keyev(native_event.get(), false); + EXPECT_EQ(EF_CONTROL_DOWN, keyev.flags()); + } + { + scoped_ptr<XEvent> native_event(new XEvent); + InitXKeyEventForTesting(ET_KEY_RELEASED, VKEY_CONTROL, EF_CONTROL_DOWN, + native_event.get()); + KeyEvent keyev(native_event.get(), false); + EXPECT_EQ(EF_NONE, keyev.flags()); + } + { + scoped_ptr<XEvent> native_event(new XEvent); + InitXKeyEventForTesting(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN, + native_event.get()); + KeyEvent keyev(native_event.get(), false); + EXPECT_EQ(EF_ALT_DOWN, keyev.flags()); + } + { + scoped_ptr<XEvent> native_event(new XEvent); + InitXKeyEventForTesting(ET_KEY_RELEASED, VKEY_MENU, EF_ALT_DOWN, + native_event.get()); + KeyEvent keyev(native_event.get(), false); + EXPECT_EQ(EF_NONE, keyev.flags()); + } +#endif + + // Do not normalize flags for synthesized events without + // KeyEvent::NormalizeFlags called explicitly. + { + KeyEvent keyev(ET_KEY_PRESSED, VKEY_SHIFT, EF_SHIFT_DOWN); + EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags()); + } + { + KeyEvent keyev(ET_KEY_RELEASED, VKEY_SHIFT, EF_SHIFT_DOWN); + EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags()); + keyev.NormalizeFlags(); + EXPECT_EQ(EF_NONE, keyev.flags()); + } + { + KeyEvent keyev(ET_KEY_PRESSED, VKEY_CONTROL, EF_CONTROL_DOWN); + EXPECT_EQ(EF_CONTROL_DOWN, keyev.flags()); + } + { + KeyEvent keyev(ET_KEY_RELEASED, VKEY_CONTROL, EF_CONTROL_DOWN); + EXPECT_EQ(EF_CONTROL_DOWN, keyev.flags()); + keyev.NormalizeFlags(); + EXPECT_EQ(EF_NONE, keyev.flags()); + } + { + KeyEvent keyev(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN); + EXPECT_EQ(EF_ALT_DOWN, keyev.flags()); + } + { + KeyEvent keyev(ET_KEY_RELEASED, VKEY_MENU, EF_ALT_DOWN); + EXPECT_EQ(EF_ALT_DOWN, keyev.flags()); + keyev.NormalizeFlags(); + EXPECT_EQ(EF_NONE, keyev.flags()); + } +} + } // namespace ui |