diff options
author | tengs@chromium.org <tengs@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-16 05:06:41 +0000 |
---|---|---|
committer | tengs@chromium.org <tengs@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-16 05:06:41 +0000 |
commit | 602eada5b11fe3ed10e9c9704cf38d410d79442a (patch) | |
tree | 2a812732d815f434ae9cac3a66cc1693de05d789 /ash/sticky_keys | |
parent | 312c58b439e9a4dbeb43b10af7f2174ebe14076e (diff) | |
download | chromium_src-602eada5b11fe3ed10e9c9704cf38d410d79442a.zip chromium_src-602eada5b11fe3ed10e9c9704cf38d410d79442a.tar.gz chromium_src-602eada5b11fe3ed10e9c9704cf38d410d79442a.tar.bz2 |
Fix sticky key clicks not working for high DPI displays.
Mouse events are transformed during an event dispatch, so redispatching
a mouse event will effectively apply the transform to the mouse event location
twice. Instead, we create a new mouse event from the native event, which has
the original location and redispatch this event.
BUG=347660
TEST=new test split in another CL for ease of merging
Review URL: https://codereview.chromium.org/191293010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257358 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash/sticky_keys')
-rw-r--r-- | ash/sticky_keys/sticky_keys_controller.cc | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/ash/sticky_keys/sticky_keys_controller.cc b/ash/sticky_keys/sticky_keys_controller.cc index 919d0a6..dd80cf1 100644 --- a/ash/sticky_keys/sticky_keys_controller.cc +++ b/ash/sticky_keys/sticky_keys_controller.cc @@ -68,10 +68,10 @@ void StickyKeysHandlerDelegateImpl::DispatchMouseEvent(ui::MouseEvent* event, DCHECK(target); // We need to send a new, untransformed mouse event to the host. if (event->IsMouseWheelEvent()) { - ui::MouseWheelEvent new_event(*static_cast<ui::MouseWheelEvent*>(event)); + ui::MouseWheelEvent new_event(event->native_event()); DispatchEvent(&new_event, target); } else { - ui::MouseEvent new_event(*event, target, target->GetRootWindow()); + ui::MouseEvent new_event(event->native_event()); DispatchEvent(&new_event, target); } } @@ -466,10 +466,29 @@ void StickyKeysHandler::AppendModifier(ui::KeyEvent* event) { void StickyKeysHandler::AppendModifier(ui::MouseEvent* event) { #if defined(USE_X11) + // The native mouse event can either be a classic X button event or an + // XInput2 button event. XEvent* xev = event->native_event(); if (xev) { - XButtonEvent* xkey = &(xev->xbutton); - AppendNativeEventMask(&xkey->state); + switch (xev->type) { + case ButtonPress: + case ButtonRelease: { + XButtonEvent* xkey = &(xev->xbutton); + AppendNativeEventMask(&xkey->state); + break; + } + case GenericEvent: { + XIDeviceEvent* xievent = + static_cast<XIDeviceEvent*>(xev->xcookie.data); + CHECK(xievent->evtype == XI_ButtonPress || + xievent->evtype == XI_ButtonRelease); + AppendNativeEventMask( + reinterpret_cast<unsigned int*>(&xievent->mods.effective)); + break; + } + default: + NOTREACHED(); + } } #elif defined(USE_OZONE) NOTIMPLEMENTED() << "Modifier key is not handled"; |