// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_ #define CHROME_BROWSER_CHROMEOS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_ #include "base/memory/singleton.h" #include "base/message_loop/message_loop.h" #include "base/observer_list.h" #include "chrome/browser/chromeos/device_hierarchy_observer.h" typedef union _XEvent XEvent; namespace chromeos { // XInputHierarchyChangedEventListener listens for an XI_HierarchyChanged event, // which is sent to Chrome when X detects a system or USB keyboard (or mouse), // then tells X to change the current XKB keyboard layout. Start by just calling // instance() to get it going. class XInputHierarchyChangedEventListener : public base::MessageLoopForUI::Observer { public: static XInputHierarchyChangedEventListener* GetInstance(); void Stop(); void AddObserver(DeviceHierarchyObserver* observer); void RemoveObserver(DeviceHierarchyObserver* observer); private: // Defines the delete on exit Singleton traits we like. Best to have this // and const/dest private as recommended for Singletons. friend struct DefaultSingletonTraits; XInputHierarchyChangedEventListener(); virtual ~XInputHierarchyChangedEventListener(); void Init(); void StopImpl(); // MessageLoopForUI::Observer overrides. virtual base::EventStatus WillProcessEvent( const base::NativeEvent& event) OVERRIDE; virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE; // Returns true if the event was processed, false otherwise. virtual bool ProcessedXEvent(XEvent* xevent); // Notify observers that a device has been added/removed. void NotifyDeviceHierarchyChanged(); bool stopped_; int xiopcode_; ObserverList observer_list_; DISALLOW_COPY_AND_ASSIGN(XInputHierarchyChangedEventListener); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_