summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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";