diff options
author | bruthig@chromium.org <bruthig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-06 18:52:03 +0000 |
---|---|---|
committer | bruthig@chromium.org <bruthig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-06 18:52:03 +0000 |
commit | 36552d55cbbf0a51db9153ca86bd31c699856ee6 (patch) | |
tree | fe3ddf06c97eef970d206b79691c52f8ab48ebe7 /ui | |
parent | 21fcde825f0f329af2cc177924e4772bafe4cecb (diff) | |
download | chromium_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.h | 1 | ||||
-rw-r--r-- | ui/events/x/events_x.cc | 2 | ||||
-rw-r--r-- | ui/events/x/events_x_unittest.cc | 59 |
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 |