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/lazy_instance.h"
8#include "base/threading/thread_local.h"
9#include "ui/aura/env_observer.h"
10#include "ui/aura/input_state_lookup.h"
11#include "ui/events/event_target_iterator.h"
12#include "ui/events/platform/platform_event_source.h"
13
14#if defined(USE_OZONE)
15#include "ui/ozone/public/ozone_platform.h"
16#endif
17
18namespace aura {
19
20namespace {
21
22// Env is thread local so that aura may be used on multiple threads.
23base::LazyInstance<base::ThreadLocalPointer<Env> >::Leaky lazy_tls_ptr =
24    LAZY_INSTANCE_INITIALIZER;
25
26}  // namespace
27
28////////////////////////////////////////////////////////////////////////////////
29// Env, public:
30
31// static
32void Env::CreateInstance(bool create_event_source) {
33  if (!lazy_tls_ptr.Pointer()->Get())
34    (new Env())->Init(create_event_source);
35}
36
37// static
38Env* Env::GetInstance() {
39  Env* env = lazy_tls_ptr.Pointer()->Get();
40  DCHECK(env) << "Env::CreateInstance must be called before getting the "
41                 "instance of Env.";
42  return env;
43}
44
45// static
46void Env::DeleteInstance() {
47  delete lazy_tls_ptr.Pointer()->Get();
48}
49
50void Env::AddObserver(EnvObserver* observer) {
51  observers_.AddObserver(observer);
52}
53
54void Env::RemoveObserver(EnvObserver* observer) {
55  observers_.RemoveObserver(observer);
56}
57
58bool Env::IsMouseButtonDown() const {
59  return input_state_lookup_.get() ? input_state_lookup_->IsMouseButtonDown() :
60      mouse_button_flags_ != 0;
61}
62
63////////////////////////////////////////////////////////////////////////////////
64// Env, private:
65
66Env::Env()
67    : mouse_button_flags_(0),
68      is_touch_down_(false),
69      input_state_lookup_(InputStateLookup::Create().Pass()),
70      context_factory_(NULL) {
71  DCHECK(lazy_tls_ptr.Pointer()->Get() == NULL);
72  lazy_tls_ptr.Pointer()->Set(this);
73}
74
75Env::~Env() {
76  FOR_EACH_OBSERVER(EnvObserver, observers_, OnWillDestroyEnv());
77  DCHECK_EQ(this, lazy_tls_ptr.Pointer()->Get());
78  lazy_tls_ptr.Pointer()->Set(NULL);
79}
80
81void Env::Init(bool create_event_source) {
82#if defined(USE_OZONE)
83  // The ozone platform can provide its own event source. So initialize the
84  // platform before creating the default event source.
85  ui::OzonePlatform::InitializeForUI();
86#endif
87  if (create_event_source && !ui::PlatformEventSource::GetInstance())
88    event_source_ = ui::PlatformEventSource::CreateDefault();
89}
90
91void Env::NotifyWindowInitialized(Window* window) {
92  FOR_EACH_OBSERVER(EnvObserver, observers_, OnWindowInitialized(window));
93}
94
95void Env::NotifyHostInitialized(WindowTreeHost* host) {
96  FOR_EACH_OBSERVER(EnvObserver, observers_, OnHostInitialized(host));
97}
98
99void Env::NotifyHostActivated(WindowTreeHost* host) {
100  FOR_EACH_OBSERVER(EnvObserver, observers_, OnHostActivated(host));
101}
102
103////////////////////////////////////////////////////////////////////////////////
104// Env, ui::EventTarget implementation:
105
106bool Env::CanAcceptEvent(const ui::Event& event) {
107  return true;
108}
109
110ui::EventTarget* Env::GetParentTarget() {
111  return NULL;
112}
113
114scoped_ptr<ui::EventTargetIterator> Env::GetChildIterator() const {
115  return scoped_ptr<ui::EventTargetIterator>();
116}
117
118ui::EventTargeter* Env::GetEventTargeter() {
119  NOTREACHED();
120  return NULL;
121}
122
123}  // namespace aura
124