14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 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) 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/wm/core/default_activation_client.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_change_observer.h" 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_delegate.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace wm { 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Takes care of observing root window destruction & destroying the client. 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass DefaultActivationClient::Deleter : public aura::WindowObserver { 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Deleter(DefaultActivationClient* client, aura::Window* root_window) 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : client_(client), 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu root_window_(root_window) { 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu root_window_->AddObserver(this); 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual ~Deleter() {} 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Overridden from WindowObserver: 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE { 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK_EQ(window, root_window_); 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu root_window_->RemoveObserver(this); 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete client_; 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete this; 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DefaultActivationClient* client_; 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura::Window* root_window_; 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DISALLOW_COPY_AND_ASSIGN(Deleter); 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// DefaultActivationClient, public: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDefaultActivationClient::DefaultActivationClient(aura::Window* root_window) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : last_active_(NULL) { 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura::client::SetActivationClient(root_window, this); 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu new Deleter(this, root_window); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// DefaultActivationClient, client::ActivationClient implementation: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DefaultActivationClient::AddObserver( 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura::client::ActivationChangeObserver* observer) { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_.AddObserver(observer); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DefaultActivationClient::RemoveObserver( 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura::client::ActivationChangeObserver* observer) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_.RemoveObserver(observer); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultActivationClient::ActivateWindow(aura::Window* window) { 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura::Window* last_active = GetActiveWindow(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_active == window) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_active_ = last_active; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveActiveWindow(window); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_windows_.push_back(window); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->parent()->StackChildAtTop(window); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->AddObserver(this); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(aura::client::ActivationChangeObserver, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnWindowActivated(window, last_active)); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::ActivationChangeObserver* observer = 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetActivationChangeObserver(last_active); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (observer) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer->OnWindowActivated(window, last_active); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer = aura::client::GetActivationChangeObserver(window); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (observer) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer->OnWindowActivated(window, last_active); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultActivationClient::DeactivateWindow(aura::Window* window) { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::ActivationChangeObserver* observer = 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetActivationChangeObserver(window); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (observer) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer->OnWindowActivated(NULL, window); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_active_) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ActivateWindow(last_active_); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuaura::Window* DefaultActivationClient::GetActiveWindow() { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (active_windows_.empty()) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return active_windows_.back(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuaura::Window* DefaultActivationClient::GetActivatableWindow( 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura::Window* window) { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuaura::Window* DefaultActivationClient::GetToplevelWindow(aura::Window* window) { 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool DefaultActivationClient::CanActivateWindow(aura::Window* window) const { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// DefaultActivationClient, aura::WindowObserver implementation: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultActivationClient::OnWindowDestroyed(aura::Window* window) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (window == last_active_) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_active_ = NULL; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window == GetActiveWindow()) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_windows_.pop_back(); 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura::Window* next_active = GetActiveWindow(); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (next_active && aura::client::GetActivationChangeObserver(next_active)) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetActivationChangeObserver(next_active)->OnWindowActivated( 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_active, NULL); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveActiveWindow(window); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu//////////////////////////////////////////////////////////////////////////////// 1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// DefaultActivationClient, private: 1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDefaultActivationClient::~DefaultActivationClient() { 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (unsigned int i = 0; i < active_windows_.size(); ++i) { 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu active_windows_[i]->RemoveObserver(this); 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DefaultActivationClient::RemoveActiveWindow(aura::Window* window) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < active_windows_.size(); ++i) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (active_windows_[i] == window) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_windows_.erase(active_windows_.begin() + i); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->RemoveObserver(this); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace wm 153