summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortengs@chromium.org <tengs@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-16 05:06:41 +0000
committertengs@chromium.org <tengs@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-16 05:06:41 +0000
commit602eada5b11fe3ed10e9c9704cf38d410d79442a (patch)
tree2a812732d815f434ae9cac3a66cc1693de05d789
parent312c58b439e9a4dbeb43b10af7f2174ebe14076e (diff)
downloadchromium_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
-rw-r--r--ash/sticky_keys/sticky_keys_controller.cc27
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";