1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_CHROMEOS_EVENTS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_
6 #define CHROME_BROWSER_CHROMEOS_EVENTS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_
8 #include "base/memory/singleton.h"
9 #include "base/observer_list.h"
10 #include "chrome/browser/chromeos/device_hierarchy_observer.h"
11 #include "ui/events/platform/platform_event_observer.h"
13 typedef union _XEvent XEvent;
17 // XInputHierarchyChangedEventListener listens for an XI_HierarchyChanged event,
18 // which is sent to Chrome when X detects a system or USB keyboard (or mouse),
19 // then tells X to change the current XKB keyboard layout. Start by just calling
20 // instance() to get it going.
21 class XInputHierarchyChangedEventListener : public ui::PlatformEventObserver {
23 static XInputHierarchyChangedEventListener* GetInstance();
27 void AddObserver(DeviceHierarchyObserver* observer);
28 void RemoveObserver(DeviceHierarchyObserver* observer);
31 // Defines the delete on exit Singleton traits we like. Best to have this
32 // and const/dest private as recommended for Singletons.
33 friend struct DefaultSingletonTraits<XInputHierarchyChangedEventListener>;
35 XInputHierarchyChangedEventListener();
36 virtual ~XInputHierarchyChangedEventListener();
38 // ui::PlatformEventObserver:
39 virtual void WillProcessEvent(const ui::PlatformEvent& event) OVERRIDE;
40 virtual void DidProcessEvent(const ui::PlatformEvent& event) OVERRIDE;
42 // Returns true if the event was processed, false otherwise.
43 void ProcessedXEvent(XEvent* xevent);
45 // Notify observers that a device has been added/removed.
46 void NotifyDeviceHierarchyChanged();
50 ObserverList<DeviceHierarchyObserver> observer_list_;
52 DISALLOW_COPY_AND_ASSIGN(XInputHierarchyChangedEventListener);
55 } // namespace chromeos
57 #endif // CHROME_BROWSER_CHROMEOS_EVENTS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_