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#include "chrome/browser/chromeos/system/pointer_device_observer.h"
6
7#include "base/basictypes.h"
8#include "base/bind.h"
9#include "base/bind_helpers.h"
10#include "chrome/browser/chromeos/system/input_device_settings.h"
11#include "content/public/browser/browser_thread.h"
12
13#if defined(USE_X11)
14#include "chrome/browser/chromeos/events/xinput_hierarchy_changed_event_listener.h"
15#endif
16
17using content::BrowserThread;
18
19namespace chromeos {
20namespace system {
21
22PointerDeviceObserver::PointerDeviceObserver()
23    : weak_factory_(this) {
24}
25
26PointerDeviceObserver::~PointerDeviceObserver() {
27#if defined(USE_X11)
28  XInputHierarchyChangedEventListener::GetInstance()
29      ->RemoveObserver(this);
30#endif
31}
32
33void PointerDeviceObserver::Init() {
34#if defined(USE_X11)
35  XInputHierarchyChangedEventListener::GetInstance()
36      ->AddObserver(this);
37#endif
38}
39
40void PointerDeviceObserver::CheckDevices() {
41  CheckMouseExists();
42  CheckTouchpadExists();
43}
44
45void PointerDeviceObserver::AddObserver(Observer* observer) {
46  observers_.AddObserver(observer);
47}
48
49void PointerDeviceObserver::RemoveObserver(Observer* observer) {
50  observers_.RemoveObserver(observer);
51}
52
53void PointerDeviceObserver::DeviceHierarchyChanged() {
54  CheckDevices();
55}
56
57void PointerDeviceObserver::CheckTouchpadExists() {
58  InputDeviceSettings::Get()->TouchpadExists(
59      base::Bind(&PointerDeviceObserver::OnTouchpadExists,
60                 weak_factory_.GetWeakPtr()));
61}
62
63void PointerDeviceObserver::CheckMouseExists() {
64  InputDeviceSettings::Get()->MouseExists(
65      base::Bind(&PointerDeviceObserver::OnMouseExists,
66                 weak_factory_.GetWeakPtr()));
67}
68
69void PointerDeviceObserver::OnTouchpadExists(bool exists) {
70  FOR_EACH_OBSERVER(Observer, observers_, TouchpadExists(exists));
71}
72
73void PointerDeviceObserver::OnMouseExists(bool exists) {
74  FOR_EACH_OBSERVER(Observer, observers_, MouseExists(exists));
75}
76
77PointerDeviceObserver::Observer::~Observer() {
78}
79
80}  // namespace system
81}  // namespace chromeos
82