Index: ui/events/platform/x11/x11_event_source.cc |
diff --git a/ui/events/platform/x11/x11_event_source.cc b/ui/events/platform/x11/x11_event_source.cc |
index 337273f189ed4abb2d15bf270e5031434208116f..ea5638d34ec9fc54873db958277a390feb370098 100644 |
--- a/ui/events/platform/x11/x11_event_source.cc |
+++ b/ui/events/platform/x11/x11_event_source.cc |
@@ -206,9 +206,24 @@ void X11EventSource::ExtractCookieDataDispatchEvent(XEvent* xevent) { |
} |
void X11EventSource::PostDispatchEvent(XEvent* xevent) { |
- if (xevent->type == GenericEvent && |
- (xevent->xgeneric.evtype == XI_HierarchyChanged || |
- xevent->xgeneric.evtype == XI_DeviceChanged)) { |
+ bool should_update_device_list = false; |
+ |
+ if (xevent->type == GenericEvent) { |
+ if (xevent->xgeneric.evtype == XI_HierarchyChanged) { |
+ should_update_device_list = true; |
+ } else if (xevent->xgeneric.evtype == XI_DeviceChanged) { |
+ XIDeviceChangedEvent* xev = |
+ static_cast<XIDeviceChangedEvent*>(xevent->xcookie.data); |
+ if (xev->reason == XIDeviceChange) { |
+ should_update_device_list = true; |
+ } else if (xev->reason == XISlaveSwitch) { |
+ ui::DeviceDataManagerX11::GetInstance()->InvalidateScrollClasses( |
+ xev->sourceid); |
+ } |
+ } |
+ } |
+ |
+ if (should_update_device_list) { |
UpdateDeviceList(); |
hotplug_event_handler_->OnHotplugEvent(); |
} |
@@ -217,7 +232,8 @@ void X11EventSource::PostDispatchEvent(XEvent* xevent) { |
xevent->xcrossing.detail != NotifyInferior && |
xevent->xcrossing.mode != NotifyUngrab) { |
// Clear stored scroll data |
- ui::DeviceDataManagerX11::GetInstance()->InvalidateScrollClasses(); |
+ ui::DeviceDataManagerX11::GetInstance()->InvalidateScrollClasses( |
+ DeviceDataManagerX11::kAllDevices); |
} |
} |