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