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