summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorbruthig@chromium.org <bruthig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-06 18:52:03 +0000
committerbruthig@chromium.org <bruthig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-06 18:52:03 +0000
commit36552d55cbbf0a51db9153ca86bd31c699856ee6 (patch)
treefe3ddf06c97eef970d206b79691c52f8ab48ebe7 /ui
parent21fcde825f0f329af2cc177924e4772bafe4cecb (diff)
downloadchromium_src-36552d55cbbf0a51db9153ca86bd31c699856ee6.zip
chromium_src-36552d55cbbf0a51db9153ca86bd31c699856ee6.tar.gz
chromium_src-36552d55cbbf0a51db9153ca86bd31c699856ee6.tar.bz2
Blocked volume up/down events that originated from remapped function keys.
BUG=368710 BUG=368669 Test=MaximizeModeControllerTest.AllowsVolumeControl Test=EventRewriterTest.TestRewriteFunctionKeys Review URL: https://codereview.chromium.org/286103004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@275488 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r--ui/events/event_constants.h1
-rw-r--r--ui/events/x/events_x.cc2
-rw-r--r--ui/events/x/events_x_unittest.cc59
3 files changed, 62 insertions, 0 deletions
diff --git a/ui/events/event_constants.h b/ui/events/event_constants.h
index 9196d9f..d2ff97c 100644
--- a/ui/events/event_constants.h
+++ b/ui/events/event_constants.h
@@ -101,6 +101,7 @@ enum KeyEventFlags {
// IME without a user action.
// (Linux X11 only)
EF_IS_REPEAT = 1 << 18,
+ EF_FUNCTION_KEY = 1 << 19, // Key originates from function key row
};
// Flags specific to mouse events
diff --git a/ui/events/x/events_x.cc b/ui/events/x/events_x.cc
index 1e5d81c..9d6b15a 100644
--- a/ui/events/x/events_x.cc
+++ b/ui/events/x/events_x.cc
@@ -174,6 +174,8 @@ int GetEventFlagsFromXKeyEvent(XEvent* xevent) {
return GetEventFlagsFromXState(xevent->xkey.state) |
(IsKeypadKey(XLookupKeysym(&xevent->xkey, 0)) ? ui::EF_NUMPAD_KEY : 0) |
+ (IsFunctionKey(XLookupKeysym(&xevent->xkey, 0)) ?
+ ui::EF_FUNCTION_KEY : 0) |
ime_fabricated_flag;
}
diff --git a/ui/events/x/events_x_unittest.cc b/ui/events/x/events_x_unittest.cc
index 368682c..3a1c08c 100644
--- a/ui/events/x/events_x_unittest.cc
+++ b/ui/events/x/events_x_unittest.cc
@@ -59,6 +59,20 @@ void InitKeyEvent(Display* display,
key_event->state = state;
}
+// Returns true if the keysym maps to a KeyEvent with the EF_FUNCTION_KEY
+// flag set, or the keysym maps to a zero key code.
+bool HasFunctionKeyFlagSetIfSupported(Display* display, int x_keysym) {
+ XEvent event;
+ int x_keycode = XKeysymToKeycode(display, x_keysym);
+ // Exclude keysyms for which the server has no corresponding keycode.
+ if (x_keycode) {
+ InitKeyEvent(display, &event, true, x_keycode, 0);
+ ui::KeyEvent ui_key_event(&event, false);
+ return (ui_key_event.flags() & ui::EF_FUNCTION_KEY);
+ }
+ return true;
+}
+
} // namespace
TEST(EventsXTest, ButtonEvents) {
@@ -370,4 +384,49 @@ TEST(EventsXTest, NumpadKeyEvents) {
}
}
+TEST(EventsXTest, FunctionKeyEvents) {
+ Display* display = gfx::GetXDisplay();
+
+ // Min function key code minus 1.
+ EXPECT_FALSE(HasFunctionKeyFlagSetIfSupported(display, XK_F1 - 1));
+ // All function keys.
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F1));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F2));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F3));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F4));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F5));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F6));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F7));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F8));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F9));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F10));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F11));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F12));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F13));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F14));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F15));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F16));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F17));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F18));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F19));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F20));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F21));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F22));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F23));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F24));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F25));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F26));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F27));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F28));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F29));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F30));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F31));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F32));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F33));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F34));
+ EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F35));
+ // Max function key code plus 1.
+ EXPECT_FALSE(HasFunctionKeyFlagSetIfSupported(display, XK_F35 + 1));
+}
+
} // namespace ui