1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifndef ASH_WM_MRU_WINDOW_TRACKER_H_ 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define ASH_WM_MRU_WINDOW_TRACKER_H_ 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <list> 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <vector> 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ash/ash_export.h" 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/basictypes.h" 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/aura/client/activation_change_observer.h" 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/aura/window_observer.h" 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace aura { 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class RootWindow; 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class Window; 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace client { 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class ActivationClient; 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace ash { 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Maintains a most recently used list of windows. This is used for window 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// cycling using Alt+Tab and overview mode. 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class ASH_EXPORT MruWindowTracker 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) : public aura::client::ActivationChangeObserver, 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public aura::WindowObserver { 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) typedef std::vector<aura::Window*> WindowList; 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) explicit MruWindowTracker( 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) aura::client::ActivationClient* activation_client); 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~MruWindowTracker(); 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Set up the observers to handle window changes for the containers we care 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // about. Called when a new root window is added. 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void OnRootWindowAdded(aura::RootWindow* root_window); 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Returns the set of windows which can be cycled through. This method creates 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the vector based on the current set of windows across all valid root 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // windows. As a result it is not necessarily the same as the set of 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // windows being iterated over. 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If |top_most_at_end| the window list will return in ascending (lowest 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // window in stacking order first) order instead of the default descending 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // (top most window first) order. 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static WindowList BuildWindowList(bool top_most_at_end); 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Returns the set of windows which can be cycled through using the tracked 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // list of most recently used windows. 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WindowList BuildMruWindowList(); 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Starts or stops ignoring window activations. If no longer ignoring 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // activations the currently active window is moved to the front of the 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // MRU window list. Used by WindowCycleList to avoid adding all cycled 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // windows to the front of the MRU window list. 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void SetIgnoreActivations(bool ignore); 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Checks if the window represents a container whose children we track. 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static bool IsTrackedContainer(aura::Window* window); 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Overridden from aura::client::ActivationChangeObserver: 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnWindowActivated(aura::Window* gained_active, 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) aura::Window* lost_active) OVERRIDE; 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Overridden from WindowObserver: 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE; 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnWindowDestroying(aura::Window* window) OVERRIDE; 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // List of windows that have been activated in containers that we cycle 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // through, sorted by most recently used. 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::list<aura::Window*> mru_windows_; 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) aura::client::ActivationClient* activation_client_; 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool ignore_window_activations_; 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MruWindowTracker); 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace ash 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif // ASH_WM_MRU_WINDOW_TRACKER_H_ 88