1// Copyright (c) 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_DISPLAY_MIRROR_WINDOW_CONTROLLER_H_
6#define ASH_DISPLAY_MIRROR_WINDOW_CONTROLLER_H_
7
8#include "ash/ash_export.h"
9#include "base/compiler_specific.h"
10#include "base/memory/ref_counted.h"
11#include "base/memory/scoped_ptr.h"
12#include "ui/aura/window_tree_host_observer.h"
13#include "ui/gfx/native_widget_types.h"
14#include "ui/gfx/size.h"
15
16namespace aura {
17class Window;
18}
19
20namespace ui {
21class Reflector;
22}
23
24namespace ash {
25class AshWindowTreeHost;
26class DisplayInfo;
27class RootWindowTransformer;
28
29namespace test{
30class MirrorWindowTestApi;
31}
32
33// An object that copies the content of the primary root window to a
34// mirror window. This also draws a mouse cursor as the mouse cursor
35// is typically drawn by the window system.
36class ASH_EXPORT MirrorWindowController : public aura::WindowTreeHostObserver {
37 public:
38  MirrorWindowController();
39  virtual ~MirrorWindowController();
40
41  // Updates the root window's bounds using |display_info|.
42  // Creates the new root window if one doesn't exist.
43  void UpdateWindow(const DisplayInfo& display_info);
44
45  // Same as above, but using existing display info
46  // for the mirrored display.
47  void UpdateWindow();
48
49  // Close the mirror window.
50  void Close();
51
52  // aura::WindowTreeHostObserver overrides:
53  virtual void OnHostResized(const aura::WindowTreeHost* host) OVERRIDE;
54
55  // Return the root window used to mirror the content. NULL if the
56  // display is not mirrored by the compositor path.
57  aura::Window* GetWindow();
58
59 private:
60  friend class test::MirrorWindowTestApi;
61
62  // Creates a RootWindowTransformer for current display
63  // configuration.
64  scoped_ptr<RootWindowTransformer> CreateRootWindowTransformer() const;
65
66  scoped_ptr<AshWindowTreeHost> ash_host_;
67  gfx::Size mirror_window_host_size_;
68  scoped_refptr<ui::Reflector> reflector_;
69
70  DISALLOW_COPY_AND_ASSIGN(MirrorWindowController);
71};
72
73}  // namespace ash
74
75#endif  // ASH_DISPLAY_MIRROR_WINDOW_CONTROLLER_H_
76