OLD | NEW |
| (Empty) |
1 // Copyright 2016 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 #include "ash/root_window_controller_common.h" | |
6 | |
7 #include "ash/common/wm/wm_globals.h" | |
8 #include "ash/common/wm/wm_window.h" | |
9 #include "ash/shell_window_ids.h" | |
10 #include "ash/wm/root_window_layout_manager.h" | |
11 #include "base/memory/ptr_util.h" | |
12 | |
13 namespace ash { | |
14 namespace { | |
15 | |
16 // Creates a new window for use as a container. | |
17 wm::WmWindow* CreateContainer(int window_id, | |
18 const char* name, | |
19 wm::WmWindow* parent) { | |
20 wm::WmWindow* window = wm::WmGlobals::Get()->NewContainerWindow(); | |
21 window->SetShellWindowId(window_id); | |
22 window->SetName(name); | |
23 parent->AddChild(window); | |
24 if (window_id != kShellWindowId_UnparentedControlContainer) | |
25 window->Show(); | |
26 return window; | |
27 } | |
28 | |
29 } // namespace | |
30 | |
31 RootWindowControllerCommon::RootWindowControllerCommon(wm::WmWindow* root) | |
32 : root_(root), root_window_layout_(nullptr) {} | |
33 | |
34 RootWindowControllerCommon::~RootWindowControllerCommon() {} | |
35 | |
36 void RootWindowControllerCommon::CreateContainers() { | |
37 // These containers are just used by PowerButtonController to animate groups | |
38 // of containers simultaneously without messing up the current transformations | |
39 // on those containers. These are direct children of the root window; all of | |
40 // the other containers are their children. | |
41 | |
42 // The desktop background container is not part of the lock animation, so it | |
43 // is not included in those animate groups. | |
44 // When screen is locked desktop background is moved to lock screen background | |
45 // container (moved back on unlock). We want to make sure that there's an | |
46 // opaque layer occluding the non-lock-screen layers. | |
47 wm::WmWindow* desktop_background_container = | |
48 CreateContainer(kShellWindowId_DesktopBackgroundContainer, | |
49 "DesktopBackgroundContainer", root_); | |
50 desktop_background_container->SetChildWindowVisibilityChangesAnimated(); | |
51 | |
52 wm::WmWindow* non_lock_screen_containers = | |
53 CreateContainer(kShellWindowId_NonLockScreenContainersContainer, | |
54 "NonLockScreenContainersContainer", root_); | |
55 // Clip all windows inside this container, as half pixel of the window's | |
56 // texture may become visible when the screen is scaled. crbug.com/368591. | |
57 non_lock_screen_containers->SetMasksToBounds(true); | |
58 | |
59 wm::WmWindow* lock_background_containers = | |
60 CreateContainer(kShellWindowId_LockScreenBackgroundContainer, | |
61 "LockScreenBackgroundContainer", root_); | |
62 lock_background_containers->SetChildWindowVisibilityChangesAnimated(); | |
63 | |
64 wm::WmWindow* lock_screen_containers = | |
65 CreateContainer(kShellWindowId_LockScreenContainersContainer, | |
66 "LockScreenContainersContainer", root_); | |
67 wm::WmWindow* lock_screen_related_containers = | |
68 CreateContainer(kShellWindowId_LockScreenRelatedContainersContainer, | |
69 "LockScreenRelatedContainersContainer", root_); | |
70 | |
71 CreateContainer(kShellWindowId_UnparentedControlContainer, | |
72 "UnparentedControlContainer", non_lock_screen_containers); | |
73 | |
74 wm::WmWindow* default_container = | |
75 CreateContainer(kShellWindowId_DefaultContainer, "DefaultContainer", | |
76 non_lock_screen_containers); | |
77 default_container->SetChildWindowVisibilityChangesAnimated(); | |
78 default_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
79 default_container->SetBoundsInScreenBehaviorForChildren( | |
80 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
81 default_container->SetChildrenUseExtendedHitRegion(); | |
82 | |
83 wm::WmWindow* always_on_top_container = | |
84 CreateContainer(kShellWindowId_AlwaysOnTopContainer, | |
85 "AlwaysOnTopContainer", non_lock_screen_containers); | |
86 always_on_top_container->SetChildWindowVisibilityChangesAnimated(); | |
87 always_on_top_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
88 always_on_top_container->SetBoundsInScreenBehaviorForChildren( | |
89 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
90 | |
91 wm::WmWindow* docked_container = | |
92 CreateContainer(kShellWindowId_DockedContainer, "DockedContainer", | |
93 non_lock_screen_containers); | |
94 docked_container->SetChildWindowVisibilityChangesAnimated(); | |
95 docked_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
96 docked_container->SetBoundsInScreenBehaviorForChildren( | |
97 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
98 docked_container->SetChildrenUseExtendedHitRegion(); | |
99 | |
100 wm::WmWindow* shelf_container = | |
101 CreateContainer(kShellWindowId_ShelfContainer, "ShelfContainer", | |
102 non_lock_screen_containers); | |
103 shelf_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
104 shelf_container->SetBoundsInScreenBehaviorForChildren( | |
105 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
106 shelf_container->SetDescendantsStayInSameRootWindow(true); | |
107 | |
108 wm::WmWindow* panel_container = | |
109 CreateContainer(kShellWindowId_PanelContainer, "PanelContainer", | |
110 non_lock_screen_containers); | |
111 panel_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
112 panel_container->SetBoundsInScreenBehaviorForChildren( | |
113 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
114 | |
115 wm::WmWindow* shelf_bubble_container = | |
116 CreateContainer(kShellWindowId_ShelfBubbleContainer, | |
117 "ShelfBubbleContainer", non_lock_screen_containers); | |
118 shelf_bubble_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
119 shelf_bubble_container->SetBoundsInScreenBehaviorForChildren( | |
120 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
121 shelf_bubble_container->SetDescendantsStayInSameRootWindow(true); | |
122 | |
123 wm::WmWindow* app_list_container = | |
124 CreateContainer(kShellWindowId_AppListContainer, "AppListContainer", | |
125 non_lock_screen_containers); | |
126 app_list_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
127 app_list_container->SetBoundsInScreenBehaviorForChildren( | |
128 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
129 | |
130 wm::WmWindow* modal_container = | |
131 CreateContainer(kShellWindowId_SystemModalContainer, | |
132 "SystemModalContainer", non_lock_screen_containers); | |
133 modal_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
134 modal_container->SetChildWindowVisibilityChangesAnimated(); | |
135 modal_container->SetBoundsInScreenBehaviorForChildren( | |
136 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
137 modal_container->SetChildrenUseExtendedHitRegion(); | |
138 | |
139 // TODO(beng): Figure out if we can make this use | |
140 // SystemModalContainerEventFilter instead of stops_event_propagation. | |
141 wm::WmWindow* lock_container = | |
142 CreateContainer(kShellWindowId_LockScreenContainer, "LockScreenContainer", | |
143 lock_screen_containers); | |
144 lock_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
145 lock_container->SetBoundsInScreenBehaviorForChildren( | |
146 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
147 // TODO(beng): stopsevents | |
148 | |
149 wm::WmWindow* lock_modal_container = | |
150 CreateContainer(kShellWindowId_LockSystemModalContainer, | |
151 "LockSystemModalContainer", lock_screen_containers); | |
152 lock_modal_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
153 lock_modal_container->SetChildWindowVisibilityChangesAnimated(); | |
154 lock_modal_container->SetBoundsInScreenBehaviorForChildren( | |
155 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
156 lock_modal_container->SetChildrenUseExtendedHitRegion(); | |
157 | |
158 wm::WmWindow* status_container = | |
159 CreateContainer(kShellWindowId_StatusContainer, "StatusContainer", | |
160 lock_screen_related_containers); | |
161 status_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
162 status_container->SetBoundsInScreenBehaviorForChildren( | |
163 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
164 status_container->SetDescendantsStayInSameRootWindow(true); | |
165 | |
166 wm::WmWindow* settings_bubble_container = | |
167 CreateContainer(kShellWindowId_SettingBubbleContainer, | |
168 "SettingBubbleContainer", lock_screen_related_containers); | |
169 settings_bubble_container->SetChildWindowVisibilityChangesAnimated(); | |
170 settings_bubble_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
171 settings_bubble_container->SetBoundsInScreenBehaviorForChildren( | |
172 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
173 settings_bubble_container->SetDescendantsStayInSameRootWindow(true); | |
174 | |
175 wm::WmWindow* virtual_keyboard_parent_container = CreateContainer( | |
176 kShellWindowId_ImeWindowParentContainer, "VirtualKeyboardParentContainer", | |
177 lock_screen_related_containers); | |
178 virtual_keyboard_parent_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
179 virtual_keyboard_parent_container->SetBoundsInScreenBehaviorForChildren( | |
180 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
181 | |
182 wm::WmWindow* menu_container = | |
183 CreateContainer(kShellWindowId_MenuContainer, "MenuContainer", | |
184 lock_screen_related_containers); | |
185 menu_container->SetChildWindowVisibilityChangesAnimated(); | |
186 menu_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
187 menu_container->SetBoundsInScreenBehaviorForChildren( | |
188 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
189 | |
190 wm::WmWindow* drag_drop_container = CreateContainer( | |
191 kShellWindowId_DragImageAndTooltipContainer, | |
192 "DragImageAndTooltipContainer", lock_screen_related_containers); | |
193 drag_drop_container->SetChildWindowVisibilityChangesAnimated(); | |
194 drag_drop_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
195 drag_drop_container->SetBoundsInScreenBehaviorForChildren( | |
196 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
197 | |
198 wm::WmWindow* overlay_container = | |
199 CreateContainer(kShellWindowId_OverlayContainer, "OverlayContainer", | |
200 lock_screen_related_containers); | |
201 overlay_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
202 overlay_container->SetBoundsInScreenBehaviorForChildren( | |
203 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
204 | |
205 #if defined(OS_CHROMEOS) | |
206 wm::WmWindow* mouse_cursor_container = CreateContainer( | |
207 kShellWindowId_MouseCursorContainer, "MouseCursorContainer", root_); | |
208 mouse_cursor_container->SetBoundsInScreenBehaviorForChildren( | |
209 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
210 #endif | |
211 | |
212 CreateContainer(kShellWindowId_PowerButtonAnimationContainer, | |
213 "PowerButtonAnimationContainer", root_); | |
214 } | |
215 | |
216 void RootWindowControllerCommon::CreateLayoutManagers() { | |
217 root_window_layout_ = new wm::RootWindowLayoutManager(root_); | |
218 root_->SetLayoutManager(base::WrapUnique(root_window_layout_)); | |
219 } | |
220 | |
221 } // namespace ash | |
OLD | NEW |