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