Add EF_FINAL_MODIFIERS to suppress remapping.

Add EF_FINAL_MODIFIERS to ui::KeyEventFlags to suppress modifier key
remapping on artifical events. This replaces using the X11 send_event
field.

BUG=380349
TEST=EventRewriterTest.TestRewriteKeyEventSentByXSendEvent
R=sadrul@chromium.org,derat@chromium.org

Review URL: https://codereview.chromium.org/394553002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284085 0039d316-1c4b-4281-b951-d872f2087c98
parent 58023db2
...@@ -165,17 +165,6 @@ void UpdateX11Button(int ui_flag, unsigned int* x_button) { ...@@ -165,17 +165,6 @@ void UpdateX11Button(int ui_flag, unsigned int* x_button) {
} }
#endif // defined(USE_X11) #endif // defined(USE_X11)
bool IsSendEvent(const ui::Event& event) {
#if defined(USE_X11)
// Do not rewrite an event sent by ui_controls::SendKeyPress(). See
// crbug.com/136465.
XEvent* xev = event.native_event();
if (xev && xev->xany.send_event)
return true;
#endif
return false;
}
} // namespace } // namespace
EventRewriter::EventRewriter(ash::StickyKeysController* sticky_keys_controller) EventRewriter::EventRewriter(ash::StickyKeysController* sticky_keys_controller)
...@@ -395,8 +384,9 @@ ui::EventRewriteStatus EventRewriter::RewriteKeyEvent( ...@@ -395,8 +384,9 @@ ui::EventRewriteStatus EventRewriter::RewriteKeyEvent(
if (key_event.source_device_id() != ui::ED_UNKNOWN_DEVICE) if (key_event.source_device_id() != ui::ED_UNKNOWN_DEVICE)
DeviceKeyPressedOrReleased(key_event.source_device_id()); DeviceKeyPressedOrReleased(key_event.source_device_id());
MutableKeyState state = {key_event.flags(), key_event.key_code()}; MutableKeyState state = {key_event.flags(), key_event.key_code()};
bool is_send_event = IsSendEvent(key_event); // Do not rewrite an event sent by ui_controls::SendKeyPress(). See
if (!is_send_event) { // crbug.com/136465.
if (!(key_event.flags() & ui::EF_FINAL)) {
RewriteModifierKeys(key_event, &state); RewriteModifierKeys(key_event, &state);
RewriteNumPadKeys(key_event, &state); RewriteNumPadKeys(key_event, &state);
} }
...@@ -407,7 +397,7 @@ ui::EventRewriteStatus EventRewriter::RewriteKeyEvent( ...@@ -407,7 +397,7 @@ ui::EventRewriteStatus EventRewriter::RewriteKeyEvent(
if (status == ui::EVENT_REWRITE_DISCARD) if (status == ui::EVENT_REWRITE_DISCARD)
return ui::EVENT_REWRITE_DISCARD; return ui::EVENT_REWRITE_DISCARD;
} }
if (!is_send_event) { if (!(key_event.flags() & ui::EF_FINAL)) {
RewriteExtendedKeys(key_event, &state); RewriteExtendedKeys(key_event, &state);
RewriteFunctionKeys(key_event, &state); RewriteFunctionKeys(key_event, &state);
} }
......
...@@ -1699,8 +1699,6 @@ TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { ...@@ -1699,8 +1699,6 @@ TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) {
} }
TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
#if defined(USE_X11)
// TODO(kpschoedel): pending alternative to xevent.xany.send_event
// Remap Control to Alt. // Remap Control to Alt.
TestingPrefServiceSyncable prefs; TestingPrefServiceSyncable prefs;
chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
...@@ -1713,7 +1711,17 @@ TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { ...@@ -1713,7 +1711,17 @@ TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
rewriter.set_pref_service_for_testing(&prefs); rewriter.set_pref_service_for_testing(&prefs);
// Send left control press. // Send left control press.
std::string rewritten_event; {
ui::KeyEvent keyevent(
ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::EF_FINAL, false);
scoped_ptr<ui::Event> new_event;
// Control should NOT be remapped to Alt if EF_FINAL is set.
EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE,
rewriter.RewriteEvent(keyevent, &new_event));
EXPECT_FALSE(new_event);
}
#if defined(USE_X11)
// Send left control press, using XI2 native events.
{ {
ui::ScopedXI2Event xev; ui::ScopedXI2Event xev;
xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0);
......
...@@ -102,6 +102,8 @@ enum KeyEventFlags { ...@@ -102,6 +102,8 @@ enum KeyEventFlags {
// (Linux X11 only) // (Linux X11 only)
EF_IS_REPEAT = 1 << 18, EF_IS_REPEAT = 1 << 18,
EF_FUNCTION_KEY = 1 << 19, // Key originates from function key row EF_FUNCTION_KEY = 1 << 19, // Key originates from function key row
EF_FINAL = 1 << 20, // Do not remap; the event was created with
// the desired final values.
}; };
// Flags specific to mouse events // Flags specific to mouse events
......
...@@ -189,6 +189,7 @@ int GetEventFlagsFromXKeyEvent(XEvent* xevent) { ...@@ -189,6 +189,7 @@ int GetEventFlagsFromXKeyEvent(XEvent* xevent) {
#endif #endif
return GetEventFlagsFromXState(xevent->xkey.state) | return GetEventFlagsFromXState(xevent->xkey.state) |
(xevent->xkey.send_event ? ui::EF_FINAL : 0) |
(IsKeypadKey(XLookupKeysym(&xevent->xkey, 0)) ? ui::EF_NUMPAD_KEY : 0) | (IsKeypadKey(XLookupKeysym(&xevent->xkey, 0)) ? ui::EF_NUMPAD_KEY : 0) |
(IsFunctionKey(XLookupKeysym(&xevent->xkey, 0)) ? (IsFunctionKey(XLookupKeysym(&xevent->xkey, 0)) ?
ui::EF_FUNCTION_KEY : 0) | ui::EF_FUNCTION_KEY : 0) |
...@@ -201,6 +202,7 @@ int GetEventFlagsFromXGenericEvent(XEvent* xevent) { ...@@ -201,6 +202,7 @@ int GetEventFlagsFromXGenericEvent(XEvent* xevent) {
DCHECK((xievent->evtype == XI_KeyPress) || DCHECK((xievent->evtype == XI_KeyPress) ||
(xievent->evtype == XI_KeyRelease)); (xievent->evtype == XI_KeyRelease));
return GetEventFlagsFromXState(xievent->mods.effective) | return GetEventFlagsFromXState(xievent->mods.effective) |
(xevent->xkey.send_event ? ui::EF_FINAL : 0) |
(IsKeypadKey( (IsKeypadKey(
XkbKeycodeToKeysym(xievent->display, xievent->detail, 0, 0)) XkbKeycodeToKeysym(xievent->display, xievent->detail, 0, 0))
? ui::EF_NUMPAD_KEY ? ui::EF_NUMPAD_KEY
......
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