Home | History | Annotate | Download | only in aura
      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