blob: 1937c5e74fa091f8ba66936955b9b5e6b0454074 [file] [log] [blame]
// 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>;
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<DeviceHierarchyObserver> observer_list_;
DISALLOW_COPY_AND_ASSIGN(XInputHierarchyChangedEventListener);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_XINPUT_HIERARCHY_CHANGED_EVENT_LISTENER_H_