summaryrefslogtreecommitdiffstats
path: root/ash/root_window_controller.h
blob: 29f9c04b97bd8c3b615f812fcdbd3e202a66929d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_ROOT_WINDOW_CONTROLLER_H_
#define ASH_ROOT_WINDOW_CONTROLLER_H_

#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"

class SkBitmap;

namespace aura {
class EventFilter;
class RootWindow;
class Window;
namespace shared {
class InputMethodEventFilter;
class RootWindowEventFilter;
}  // namespace shared
}  // namespace aura

namespace ash {
class ToplevelWindowEventHandler;
namespace internal {

class EventClientImpl;
class RootWindowLayoutManager;
class ScreenDimmer;
class SystemBackgroundController;
class WorkspaceController;

// This class maintains the per root window state for ash. This class
// owns the root window and other dependent objects that should be
// deleted upon the deletion of the root window.  The RootWindowController
// for particular root window is stored as a property and can be obtained
// using |GetRootWindowController(aura::RootWindow*)| function.
class RootWindowController {
 public:
  explicit RootWindowController(aura::RootWindow* root_window);
  ~RootWindowController();

  aura::RootWindow* root_window() {
    return root_window_.get();
  }

  internal::RootWindowLayoutManager* root_window_layout() {
    return root_window_layout_;
  }

  internal::WorkspaceController* workspace_controller() {
    return workspace_controller_.get();
  }

  internal::ScreenDimmer* screen_dimmer() {
    return screen_dimmer_.get();
  }

  aura::Window* GetContainer(int container_id);

  void InitLayoutManagers();
  void CreateContainers();

  // Initializes |background_|.  |is_first_run_after_boot| determines the
  // background's initial color.
  void CreateSystemBackground(bool is_first_run_after_boot);

  // Updates |background_| to be black after the desktop background is visible.
  void HandleDesktopBackgroundVisible();

  // Deletes associated objects and clears the state, but doesn't delete
  // the root window yet. This is used to delete a secondary displays'
  // root window safely when the display disconnect signal is received,
  // which may come while we're in the nested message loop.
  void Shutdown();

  // Deletes all child windows and performs necessary cleanup.
  void CloseChildWindows();

  // Returns true if the workspace has a maximized or fullscreen window.
  bool IsInMaximizedMode() const;

  // Moves child windows to |dest|.
  void MoveWindowsTo(aura::RootWindow* dest);

 private:
  // Creates each of the special window containers that holds windows of various
  // types in the shell UI.
  void CreateContainersInRootWindow(aura::RootWindow* root_window);

  scoped_ptr<aura::RootWindow> root_window_;
  internal::RootWindowLayoutManager* root_window_layout_;

  // A background layer that's displayed beneath all other layers.  Without
  // this, portions of the root window that aren't covered by layers will be
  // painted white; this can show up if e.g. it takes a long time to decode the
  // desktop background image when displaying the login screen.
  scoped_ptr<SystemBackgroundController> background_;

  // An event filter that pre-handles all key events to send them to an IME.
  scoped_ptr<internal::EventClientImpl> event_client_;
  scoped_ptr<internal::ScreenDimmer> screen_dimmer_;
  scoped_ptr<internal::WorkspaceController> workspace_controller_;

  // We need to own event handlers for various containers.
  scoped_ptr<ToplevelWindowEventHandler> default_container_handler_;
  scoped_ptr<ToplevelWindowEventHandler> always_on_top_container_handler_;
  scoped_ptr<ToplevelWindowEventHandler> modal_container_handler_;
  scoped_ptr<ToplevelWindowEventHandler> lock_modal_container_handler_;

  DISALLOW_COPY_AND_ASSIGN(RootWindowController);
};

}  // namespace internal
}  // ash

#endif  //  ASH_ROOT_WINDOW_CONTROLLER_H_