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