xinput_hierarchy_changed_event_listener.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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/message_loop/message_loop.h" 10#include "base/observer_list.h" 11#include "chrome/browser/chromeos/device_hierarchy_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 22 : public base::MessageLoopForUI::Observer { 23 public: 24 static XInputHierarchyChangedEventListener* GetInstance(); 25 26 void Stop(); 27 28 void AddObserver(DeviceHierarchyObserver* observer); 29 void RemoveObserver(DeviceHierarchyObserver* observer); 30 31 private: 32 // Defines the delete on exit Singleton traits we like. Best to have this 33 // and const/dest private as recommended for Singletons. 34 friend struct DefaultSingletonTraits<XInputHierarchyChangedEventListener>; 35 36 XInputHierarchyChangedEventListener(); 37 virtual ~XInputHierarchyChangedEventListener(); 38 39 // MessageLoopForUI::Observer overrides. 40 virtual base::EventStatus WillProcessEvent( 41 const base::NativeEvent& event) OVERRIDE; 42 virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE; 43 44 // Returns true if the event was processed, false otherwise. 45 virtual bool ProcessedXEvent(XEvent* xevent); 46 47 // Notify observers that a device has been added/removed. 48 void NotifyDeviceHierarchyChanged(); 49 50 bool stopped_; 51 int xiopcode_; 52 53 ObserverList<DeviceHierarchyObserver> observer_list_; 54 55 DISALLOW_COPY_AND_ASSIGN(XInputHierarchyChangedEventListener); 56}; 57 58} // namespace chromeos 59 60#endif // CHROME_BROWSER_CHROMEOS_EVENTS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_ 61