| Index: chrome/browser/chromeos/events/event_rewriter.cc
|
| diff --git a/chrome/browser/chromeos/events/event_rewriter.cc b/chrome/browser/chromeos/events/event_rewriter.cc
|
| index f1f50999f49c799fbd53a85b998be885739093bd..eee24f7c2c6ca6a0ae2a9ad1a4d5fe39cd99f77f 100644
|
| --- a/chrome/browser/chromeos/events/event_rewriter.cc
|
| +++ b/chrome/browser/chromeos/events/event_rewriter.cc
|
| @@ -184,9 +184,7 @@ EventRewriter::DeviceType EventRewriter::DeviceAddedForTesting(
|
|
|
| void EventRewriter::RewriteLocatedEventForTesting(const ui::Event& event,
|
| int* flags) {
|
| - MutableKeyState state = {*flags, ui::VKEY_UNKNOWN};
|
| - RewriteLocatedEvent(event, &state);
|
| - *flags = state.flags;
|
| + RewriteLocatedEvent(event, flags);
|
| }
|
|
|
| ui::EventRewriteStatus EventRewriter::RewriteEvent(
|
| @@ -201,56 +199,17 @@ ui::EventRewriteStatus EventRewriter::RewriteEvent(
|
| #endif
|
| switch (event.type()) {
|
| case ui::ET_KEY_PRESSED:
|
| - case ui::ET_KEY_RELEASED: {
|
| - const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event);
|
| - MutableKeyState state = {key_event.flags(), key_event.key_code()};
|
| - RewriteModifierKeys(key_event, &state);
|
| - RewriteNumPadKeys(key_event, &state);
|
| - RewriteExtendedKeys(key_event, &state);
|
| - RewriteFunctionKeys(key_event, &state);
|
| - if ((key_event.flags() != state.flags) ||
|
| - (key_event.key_code() != state.key_code)) {
|
| - ui::KeyEvent* rewritten_key_event = new ui::KeyEvent(key_event);
|
| - rewritten_event->reset(rewritten_key_event);
|
| - rewritten_key_event->set_flags(state.flags);
|
| - rewritten_key_event->set_key_code(state.key_code);
|
| - rewritten_key_event->set_character(
|
| - ui::GetCharacterFromKeyCode(state.key_code, state.flags));
|
| - rewritten_key_event->NormalizeFlags();
|
| -#if defined(USE_X11)
|
| - xev = rewritten_key_event->native_event();
|
| - if (xev) {
|
| - XKeyEvent* xkey = &(xev->xkey);
|
| - UpdateX11EventMask(state.flags, &xkey->state);
|
| - xkey->keycode = XKeysymToKeycode(
|
| - gfx::GetXDisplay(),
|
| - ui::XKeysymForWindowsKeyCode(state.key_code,
|
| - state.flags & ui::EF_SHIFT_DOWN));
|
| - }
|
| -#endif
|
| - return ui::EVENT_REWRITE_REWRITTEN;
|
| - }
|
| - return ui::EVENT_REWRITE_CONTINUE;
|
| - }
|
| + case ui::ET_KEY_RELEASED:
|
| + return RewriteKeyEvent(static_cast<const ui::KeyEvent&>(event),
|
| + rewritten_event);
|
| case ui::ET_MOUSE_PRESSED:
|
| case ui::ET_MOUSE_RELEASED:
|
| + return RewriteMouseEvent(static_cast<const ui::MouseEvent&>(event),
|
| + rewritten_event);
|
| case ui::ET_TOUCH_PRESSED:
|
| - case ui::ET_TOUCH_RELEASED: {
|
| - MutableKeyState state = {event.flags(), ui::VKEY_UNKNOWN};
|
| - RewriteLocatedEvent(event, &state);
|
| - if (event.flags() != state.flags) {
|
| - if (event.IsMouseEvent()) {
|
| - rewritten_event->reset(
|
| - new ui::MouseEvent(static_cast<const ui::MouseEvent&>(event)));
|
| - } else {
|
| - rewritten_event->reset(
|
| - new ui::TouchEvent(static_cast<const ui::TouchEvent&>(event)));
|
| - }
|
| - rewritten_event->get()->set_flags(state.flags);
|
| - return ui::EVENT_REWRITE_REWRITTEN;
|
| - }
|
| - return ui::EVENT_REWRITE_CONTINUE;
|
| - }
|
| + case ui::ET_TOUCH_RELEASED:
|
| + return RewriteTouchEvent(static_cast<const ui::TouchEvent&>(event),
|
| + rewritten_event);
|
| default:
|
| return ui::EVENT_REWRITE_CONTINUE;
|
| }
|
| @@ -370,6 +329,101 @@ bool EventRewriter::RewriteWithKeyboardRemappingsByKeyCode(
|
| return false;
|
| }
|
|
|
| +ui::EventRewriteStatus EventRewriter::RewriteKeyEvent(
|
| + const ui::KeyEvent& key_event,
|
| + scoped_ptr<ui::Event>* rewritten_event) {
|
| + MutableKeyState state = {key_event.flags(), key_event.key_code()};
|
| + RewriteModifierKeys(key_event, &state);
|
| + RewriteNumPadKeys(key_event, &state);
|
| + RewriteExtendedKeys(key_event, &state);
|
| + RewriteFunctionKeys(key_event, &state);
|
| + if ((key_event.flags() == state.flags) &&
|
| + (key_event.key_code() == state.key_code)) {
|
| + return ui::EVENT_REWRITE_CONTINUE;
|
| + }
|
| + ui::KeyEvent* rewritten_key_event = new ui::KeyEvent(key_event);
|
| + rewritten_event->reset(rewritten_key_event);
|
| + rewritten_key_event->set_flags(state.flags);
|
| + rewritten_key_event->set_key_code(state.key_code);
|
| + rewritten_key_event->set_character(
|
| + ui::GetCharacterFromKeyCode(state.key_code, state.flags));
|
| + rewritten_key_event->NormalizeFlags();
|
| +#if defined(USE_X11)
|
| + XEvent* xev = rewritten_key_event->native_event();
|
| + if (xev) {
|
| + CHECK(xev->type == KeyPress || xev->type == KeyRelease);
|
| + XKeyEvent* xkey = &(xev->xkey);
|
| + UpdateX11EventMask(rewritten_key_event->flags(), &xkey->state);
|
| + xkey->keycode =
|
| + XKeysymToKeycode(gfx::GetXDisplay(),
|
| + ui::XKeysymForWindowsKeyCode(
|
| + state.key_code, state.flags & ui::EF_SHIFT_DOWN));
|
| + }
|
| +#endif
|
| + return ui::EVENT_REWRITE_REWRITTEN;
|
| +}
|
| +
|
| +ui::EventRewriteStatus EventRewriter::RewriteMouseEvent(
|
| + const ui::MouseEvent& mouse_event,
|
| + scoped_ptr<ui::Event>* rewritten_event) {
|
| + int flags = mouse_event.flags();
|
| + RewriteLocatedEvent(mouse_event, &flags);
|
| + if (mouse_event.flags() == flags)
|
| + return ui::EVENT_REWRITE_CONTINUE;
|
| + ui::MouseEvent* rewritten_mouse_event = new ui::MouseEvent(mouse_event);
|
| + rewritten_event->reset(rewritten_mouse_event);
|
| + rewritten_mouse_event->set_flags(flags);
|
| +#if defined(USE_X11)
|
| + XEvent* xev = rewritten_mouse_event->native_event();
|
| + if (xev) {
|
| + switch (xev->type) {
|
| + case ButtonPress:
|
| + case ButtonRelease: {
|
| + XButtonEvent* xbutton = &(xev->xbutton);
|
| + UpdateX11EventMask(rewritten_mouse_event->flags(), &xbutton->state);
|
| + break;
|
| + }
|
| + case GenericEvent: {
|
| + XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
|
| + CHECK(xievent->evtype == XI_ButtonPress ||
|
| + xievent->evtype == XI_ButtonRelease);
|
| + UpdateX11EventMask(
|
| + rewritten_mouse_event->flags(),
|
| + reinterpret_cast<unsigned int*>(&xievent->mods.effective));
|
| + break;
|
| + }
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| + }
|
| +#endif
|
| + return ui::EVENT_REWRITE_REWRITTEN;
|
| +}
|
| +
|
| +ui::EventRewriteStatus EventRewriter::RewriteTouchEvent(
|
| + const ui::TouchEvent& touch_event,
|
| + scoped_ptr<ui::Event>* rewritten_event) {
|
| + int flags = touch_event.flags();
|
| + RewriteLocatedEvent(touch_event, &flags);
|
| + if (touch_event.flags() == flags)
|
| + return ui::EVENT_REWRITE_CONTINUE;
|
| + ui::TouchEvent* rewritten_touch_event = new ui::TouchEvent(touch_event);
|
| + rewritten_event->reset(rewritten_touch_event);
|
| + rewritten_touch_event->set_flags(flags);
|
| +#if defined(USE_X11)
|
| + XEvent* xev = rewritten_touch_event->native_event();
|
| + if (xev) {
|
| + XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
|
| + if (xievent) {
|
| + UpdateX11EventMask(
|
| + rewritten_touch_event->flags(),
|
| + reinterpret_cast<unsigned int*>(&xievent->mods.effective));
|
| + }
|
| + }
|
| +#endif
|
| + return ui::EVENT_REWRITE_REWRITTEN;
|
| +}
|
| +
|
| void EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event,
|
| MutableKeyState* state) {
|
| DCHECK(key_event.type() == ui::ET_KEY_PRESSED ||
|
| @@ -659,13 +713,13 @@ void EventRewriter::RewriteFunctionKeys(const ui::KeyEvent& key_event,
|
| }
|
|
|
| void EventRewriter::RewriteLocatedEvent(const ui::Event& event,
|
| - MutableKeyState* state) {
|
| + int* flags) {
|
| const PrefService* pref_service = GetPrefService();
|
| if (!pref_service)
|
| return;
|
|
|
| // First, remap modifier masks.
|
| - state->flags = GetRemappedModifierMasks(*pref_service, event, state->flags);
|
| + *flags = GetRemappedModifierMasks(*pref_service, event, *flags);
|
|
|
| #if defined(USE_X11)
|
| // TODO(kpschoedel): de-X11 with unified device ids from crbug.com/360377
|
| @@ -675,13 +729,15 @@ void EventRewriter::RewriteLocatedEvent(const ui::Event& event,
|
| XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data);
|
| if (xievent->evtype != XI_ButtonPress && xievent->evtype != XI_ButtonRelease)
|
| return;
|
| + UpdateX11EventMask(*flags,
|
| + reinterpret_cast<unsigned int*>(&xievent->mods.effective));
|
|
|
| // Then, remap Alt+Button1 to Button3.
|
| if ((xievent->evtype == XI_ButtonPress ||
|
| pressed_device_ids_.count(xievent->sourceid)) &&
|
| (xievent->mods.effective & Mod1Mask) && xievent->detail == Button1) {
|
| - state->flags &= ~(ui::EF_ALT_DOWN | ui::EF_LEFT_MOUSE_BUTTON);
|
| - state->flags |= ui::EF_RIGHT_MOUSE_BUTTON;
|
| + *flags &= ~(ui::EF_ALT_DOWN | ui::EF_LEFT_MOUSE_BUTTON);
|
| + *flags |= ui::EF_RIGHT_MOUSE_BUTTON;
|
| xievent->mods.effective &= ~Mod1Mask;
|
| xievent->detail = Button3;
|
| if (xievent->evtype == XI_ButtonRelease) {
|
|
|