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/root_window_host.h" 10 #include "ui/aura/window.h" 11 #include "ui/compositor/compositor.h" 12 #include "ui/compositor/compositor_switches.h" 13 14 #if defined(USE_X11) 15 #include "base/message_loop/message_pump_aurax11.h" 16 #endif 17 18 namespace aura { 19 20 // static 21 Env* Env::instance_ = NULL; 22 23 //////////////////////////////////////////////////////////////////////////////// 24 // Env, public: 25 26 Env::Env() 27 : mouse_button_flags_(0), 28 is_touch_down_(false) { 29 } 30 31 Env::~Env() { 32 #if defined(USE_X11) 33 base::MessagePumpAuraX11::Current()->RemoveObserver( 34 &device_list_updater_aurax11_); 35 #endif 36 37 FOR_EACH_OBSERVER(EnvObserver, observers_, OnWillDestroyEnv()); 38 39 ui::Compositor::Terminate(); 40 } 41 42 // static 43 Env* Env::GetInstance() { 44 if (!instance_) { 45 instance_ = new Env; 46 instance_->Init(); 47 } 48 return instance_; 49 } 50 51 // static 52 void Env::DeleteInstance() { 53 delete instance_; 54 instance_ = NULL; 55 } 56 57 void Env::AddObserver(EnvObserver* observer) { 58 observers_.AddObserver(observer); 59 } 60 61 void Env::RemoveObserver(EnvObserver* observer) { 62 observers_.RemoveObserver(observer); 63 } 64 65 #if !defined(OS_MACOSX) 66 base::MessageLoop::Dispatcher* Env::GetDispatcher() { 67 #if defined(USE_X11) 68 return base::MessagePumpAuraX11::Current(); 69 #else 70 return dispatcher_.get(); 71 #endif 72 } 73 #endif 74 75 void Env::RootWindowActivated(RootWindow* root_window) { 76 FOR_EACH_OBSERVER(EnvObserver, observers_, 77 OnRootWindowActivated(root_window)); 78 } 79 80 //////////////////////////////////////////////////////////////////////////////// 81 // Env, private: 82 83 void Env::Init() { 84 #if !defined(USE_X11) && !defined(USE_OZONE) 85 dispatcher_.reset(CreateDispatcher()); 86 #endif 87 #if defined(USE_X11) 88 // We can't do this with a root window listener because XI_HierarchyChanged 89 // messages don't have a target window. 90 base::MessagePumpAuraX11::Current()->AddObserver( 91 &device_list_updater_aurax11_); 92 #endif 93 ui::Compositor::Initialize(); 94 } 95 96 void Env::NotifyWindowInitialized(Window* window) { 97 FOR_EACH_OBSERVER(EnvObserver, observers_, OnWindowInitialized(window)); 98 } 99 100 void Env::NotifyRootWindowInitialized(RootWindow* root_window) { 101 FOR_EACH_OBSERVER(EnvObserver, 102 observers_, 103 OnRootWindowInitialized(root_window)); 104 } 105 106 //////////////////////////////////////////////////////////////////////////////// 107 // Env, ui::EventTarget implementation: 108 109 bool Env::CanAcceptEvent(const ui::Event& event) { 110 return true; 111 } 112 113 ui::EventTarget* Env::GetParentTarget() { 114 return NULL; 115 } 116 117 } // namespace aura 118