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/window_observer.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_change_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) // Returns the set of windows which can be cycled through. This method creates 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the vector based on the current set of windows across all valid root 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // windows. As a result it is not necessarily the same as the set of 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // windows being iterated over. 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If |top_most_at_end| the window list will return in ascending (lowest 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // window in stacking order first) order instead of the default descending 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // (top most window first) order. 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static WindowList BuildWindowList(bool top_most_at_end); 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Returns the set of windows which can be cycled through using the tracked 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // list of most recently used windows. 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WindowList BuildMruWindowList(); 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Starts or stops ignoring window activations. If no longer ignoring 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // activations the currently active window is moved to the front of the 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // MRU window list. Used by WindowCycleList to avoid adding all cycled 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // windows to the front of the MRU window list. 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void SetIgnoreActivations(bool ignore); 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Updates the mru_windows_ list to insert/move |active_window| at/to the 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // front. 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void SetActiveWindow(aura::Window* active_window); 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Overridden from aura::client::ActivationChangeObserver: 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnWindowActivated(aura::Window* gained_active, 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) aura::Window* lost_active) OVERRIDE; 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Overridden from WindowObserver: 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // List of windows that have been activated in containers that we cycle 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // through, sorted by most recently used. 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::list<aura::Window*> mru_windows_; 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) aura::client::ActivationClient* activation_client_; 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool ignore_window_activations_; 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MruWindowTracker); 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace ash 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif // ASH_WM_MRU_WINDOW_TRACKER_H_ 84