summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authormazda@chromium.org <mazda@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-22 21:42:07 +0000
committermazda@chromium.org <mazda@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-22 21:42:07 +0000
commit7de273c49ee20a11b508af43e3a59c1300943280 (patch)
tree9ac6c2a6b88a68470a313d0a6265a5d3bdb2b1bf /ui
parent2c17b82e626c07c9f0dd2f1533f6576c6d31ba41 (diff)
downloadchromium_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.cc27
-rw-r--r--ui/base/event.h5
-rw-r--r--ui/base/event_unittest.cc81
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