15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env_observer.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/aura/input_state_lookup.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor_switches.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/event_target_iterator.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/message_loop/message_pump_x11.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Env* Env::instance_ = NULL; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Env, public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Env::Env() 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : mouse_button_flags_(0), 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) is_touch_down_(false), 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) input_state_lookup_(InputStateLookup::Create().Pass()) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Env::~Env() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::MessagePumpX11::Current()->RemoveObserver( 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &device_list_updater_aurax11_); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(EnvObserver, observers_, OnWillDestroyEnv()); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Compositor::Terminate(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//static 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Env::CreateInstance() { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_ = new Env; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->Init(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Env* Env::GetInstance() { 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(instance_) << "Env::CreateInstance must be called before getting " 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "the instance of Env."; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance_; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Env::DeleteInstance() { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete instance_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_ = NULL; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Env::AddObserver(EnvObserver* observer) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Env::RemoveObserver(EnvObserver* observer) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool Env::IsMouseButtonDown() const { 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return input_state_lookup_.get() ? input_state_lookup_->IsMouseButtonDown() : 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mouse_button_flags_ != 0; 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_MACOSX) && !defined(OS_ANDROID) && \ 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) !defined(USE_GTK_MESSAGE_PUMP) 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::MessageLoop::Dispatcher* Env::GetDispatcher() { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return base::MessagePumpX11::Current(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dispatcher_.get(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Env::RootWindowActivated(RootWindow* root_window) { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(EnvObserver, observers_, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnRootWindowActivated(root_window)); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Env, private: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Env::Init() { 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(USE_X11) && \ 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) !defined(USE_OZONE) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher_.reset(CreateDispatcher()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can't do this with a root window listener because XI_HierarchyChanged 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // messages don't have a target window. 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::MessagePumpX11::Current()->AddObserver( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &device_list_updater_aurax11_); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::Compositor::Initialize(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Env::NotifyWindowInitialized(Window* window) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(EnvObserver, observers_, OnWindowInitialized(window)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Env::NotifyRootWindowInitialized(RootWindow* root_window) { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(EnvObserver, 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnRootWindowInitialized(root_window)); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Env, ui::EventTarget implementation: 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Env::CanAcceptEvent(const ui::Event& event) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventTarget* Env::GetParentTarget() { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)scoped_ptr<ui::EventTargetIterator> Env::GetChildIterator() const { 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return scoped_ptr<ui::EventTargetIterator>(); 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ui::EventTargeter* Env::GetEventTargeter() { 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace aura 142