• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "ui/aura/env.h"
6 
7 #include "base/command_line.h"
8 #include "ui/aura/env_observer.h"
9 #include "ui/aura/input_state_lookup.h"
10 #include "ui/aura/window.h"
11 #include "ui/compositor/compositor.h"
12 #include "ui/compositor/compositor_switches.h"
13 #include "ui/events/event_target_iterator.h"
14 
15 #if defined(USE_X11)
16 #include "base/message_loop/message_pump_x11.h"
17 #endif
18 
19 namespace aura {
20 
21 // static
22 Env* Env::instance_ = NULL;
23 
24 ////////////////////////////////////////////////////////////////////////////////
25 // Env, public:
26 
Env()27 Env::Env()
28     : mouse_button_flags_(0),
29       is_touch_down_(false),
30       input_state_lookup_(InputStateLookup::Create().Pass()) {
31 }
32 
~Env()33 Env::~Env() {
34 #if defined(USE_X11)
35   base::MessagePumpX11::Current()->RemoveObserver(
36       &device_list_updater_aurax11_);
37 #endif
38 
39   FOR_EACH_OBSERVER(EnvObserver, observers_, OnWillDestroyEnv());
40 
41   ui::Compositor::Terminate();
42 }
43 
44 //static
CreateInstance()45 void Env::CreateInstance() {
46   if (!instance_) {
47     instance_ = new Env;
48     instance_->Init();
49   }
50 }
51 
52 // static
GetInstance()53 Env* Env::GetInstance() {
54   DCHECK(instance_) << "Env::CreateInstance must be called before getting "
55                        "the instance of Env.";
56   return instance_;
57 }
58 
59 // static
DeleteInstance()60 void Env::DeleteInstance() {
61   delete instance_;
62   instance_ = NULL;
63 }
64 
AddObserver(EnvObserver * observer)65 void Env::AddObserver(EnvObserver* observer) {
66   observers_.AddObserver(observer);
67 }
68 
RemoveObserver(EnvObserver * observer)69 void Env::RemoveObserver(EnvObserver* observer) {
70   observers_.RemoveObserver(observer);
71 }
72 
IsMouseButtonDown() const73 bool Env::IsMouseButtonDown() const {
74   return input_state_lookup_.get() ? input_state_lookup_->IsMouseButtonDown() :
75       mouse_button_flags_ != 0;
76 }
77 
78 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) && \
79     !defined(USE_GTK_MESSAGE_PUMP)
GetDispatcher()80 base::MessageLoop::Dispatcher* Env::GetDispatcher() {
81 #if defined(USE_X11)
82   return base::MessagePumpX11::Current();
83 #else
84   return dispatcher_.get();
85 #endif
86 }
87 #endif
88 
RootWindowActivated(RootWindow * root_window)89 void Env::RootWindowActivated(RootWindow* root_window) {
90   FOR_EACH_OBSERVER(EnvObserver, observers_,
91                     OnRootWindowActivated(root_window));
92 }
93 
94 ////////////////////////////////////////////////////////////////////////////////
95 // Env, private:
96 
Init()97 void Env::Init() {
98 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(USE_X11) && \
99     !defined(USE_OZONE)
100   dispatcher_.reset(CreateDispatcher());
101 #endif
102 #if defined(USE_X11)
103   // We can't do this with a root window listener because XI_HierarchyChanged
104   // messages don't have a target window.
105   base::MessagePumpX11::Current()->AddObserver(
106       &device_list_updater_aurax11_);
107 #endif
108   ui::Compositor::Initialize();
109 }
110 
NotifyWindowInitialized(Window * window)111 void Env::NotifyWindowInitialized(Window* window) {
112   FOR_EACH_OBSERVER(EnvObserver, observers_, OnWindowInitialized(window));
113 }
114 
NotifyRootWindowInitialized(RootWindow * root_window)115 void Env::NotifyRootWindowInitialized(RootWindow* root_window) {
116   FOR_EACH_OBSERVER(EnvObserver,
117                     observers_,
118                     OnRootWindowInitialized(root_window));
119 }
120 
121 ////////////////////////////////////////////////////////////////////////////////
122 // Env, ui::EventTarget implementation:
123 
CanAcceptEvent(const ui::Event & event)124 bool Env::CanAcceptEvent(const ui::Event& event) {
125   return true;
126 }
127 
GetParentTarget()128 ui::EventTarget* Env::GetParentTarget() {
129   return NULL;
130 }
131 
GetChildIterator() const132 scoped_ptr<ui::EventTargetIterator> Env::GetChildIterator() const {
133   return scoped_ptr<ui::EventTargetIterator>();
134 }
135 
GetEventTargeter()136 ui::EventTargeter* Env::GetEventTargeter() {
137   NOTREACHED();
138   return NULL;
139 }
140 
141 }  // namespace aura
142