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.
4
5#ifndef CHROME_BROWSER_CHROMEOS_EVENTS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_
6#define CHROME_BROWSER_CHROMEOS_EVENTS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_
7
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"
12
13typedef union _XEvent XEvent;
14
15namespace chromeos {
16
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.
21class XInputHierarchyChangedEventListener : public ui::PlatformEventObserver {
22 public:
23  static XInputHierarchyChangedEventListener* GetInstance();
24
25  void Stop();
26
27  void AddObserver(DeviceHierarchyObserver* observer);
28  void RemoveObserver(DeviceHierarchyObserver* observer);
29
30 private:
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>;
34
35  XInputHierarchyChangedEventListener();
36  virtual ~XInputHierarchyChangedEventListener();
37
38  // ui::PlatformEventObserver:
39  virtual void WillProcessEvent(const ui::PlatformEvent& event) OVERRIDE;
40  virtual void DidProcessEvent(const ui::PlatformEvent& event) OVERRIDE;
41
42  // Returns true if the event was processed, false otherwise.
43  void ProcessedXEvent(XEvent* xevent);
44
45  // Notify observers that a device has been added/removed.
46  void NotifyDeviceHierarchyChanged();
47
48  bool stopped_;
49
50  ObserverList<DeviceHierarchyObserver> observer_list_;
51
52  DISALLOW_COPY_AND_ASSIGN(XInputHierarchyChangedEventListener);
53};
54
55}  // namespace chromeos
56
57#endif  // CHROME_BROWSER_CHROMEOS_EVENTS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_
58