Index: chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.cc |
=================================================================== |
--- chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.cc (revision 115428) |
+++ chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.cc (working copy) |
@@ -44,9 +44,9 @@ |
// Checks the |event| and asynchronously sets the XKB layout when necessary. |
void HandleHierarchyChangedEvent(XIHierarchyEvent* event) { |
- if (!(event->flags & XISlaveAdded)) { |
+ if (!(event->flags & XISlaveAdded)) |
return; |
- } |
+ |
for (int i = 0; i < event->num_info; ++i) { |
XIHierarchyInfo* info = &event->info[i]; |
if ((info->flags & XISlaveAdded) && (info->use == XIFloatingSlave)) { |
@@ -91,17 +91,39 @@ |
xiopcode_ = -1; |
} |
+void XInputHierarchyChangedEventListener::AddObserver( |
+ DeviceHierarchyObserver* observer) { |
+ observer_list_.AddObserver(observer); |
+} |
+ |
+void XInputHierarchyChangedEventListener::RemoveObserver( |
+ DeviceHierarchyObserver* observer) { |
+ observer_list_.RemoveObserver(observer); |
+} |
+ |
bool XInputHierarchyChangedEventListener::ProcessedXEvent(XEvent* xevent) { |
if ((xevent->xcookie.type != GenericEvent) || |
(xevent->xcookie.extension != xiopcode_)) { |
return false; |
} |
+ |
XGenericEventCookie* cookie = &(xevent->xcookie); |
- const bool should_consume = (cookie->evtype == XI_HierarchyChanged); |
- if (should_consume) |
- HandleHierarchyChangedEvent(static_cast<XIHierarchyEvent*>(cookie->data)); |
+ const bool hierarchy_changed = (cookie->evtype == XI_HierarchyChanged); |
- return should_consume; |
+ if (hierarchy_changed) { |
+ XIHierarchyEvent* event = static_cast<XIHierarchyEvent*>(cookie->data); |
+ HandleHierarchyChangedEvent(event); |
+ if (event->flags & XIDeviceEnabled || event->flags & XIDeviceDisabled) |
+ NotifyDeviceHierarchyChanged(); |
+ } |
+ |
+ return hierarchy_changed; |
} |
+void XInputHierarchyChangedEventListener::NotifyDeviceHierarchyChanged() { |
+ FOR_EACH_OBSERVER(DeviceHierarchyObserver, |
+ observer_list_, |
+ DeviceHierarchyChanged()); |
+} |
+ |
} // namespace chromeos |