OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/wm/overview/window_selector_item.h" | 5 #include "ash/wm/overview/window_selector_item.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "ash/screen_util.h" | 10 #include "ash/screen_util.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 rb.GetImageSkiaNamed(IDR_AURA_WINDOW_OVERVIEW_CLOSE_H)); | 106 rb.GetImageSkiaNamed(IDR_AURA_WINDOW_OVERVIEW_CLOSE_H)); |
107 SetImage(views::CustomButton::STATE_PRESSED, | 107 SetImage(views::CustomButton::STATE_PRESSED, |
108 rb.GetImageSkiaNamed(IDR_AURA_WINDOW_OVERVIEW_CLOSE_P)); | 108 rb.GetImageSkiaNamed(IDR_AURA_WINDOW_OVERVIEW_CLOSE_P)); |
109 } | 109 } |
110 | 110 |
111 OverviewCloseButton::~OverviewCloseButton() { | 111 OverviewCloseButton::~OverviewCloseButton() { |
112 } | 112 } |
113 | 113 |
114 } // namespace | 114 } // namespace |
115 | 115 |
116 WindowSelectorItem::WindowSelectorItem(aura::Window* root_window) | 116 WindowSelectorItem::WindowSelectorItem(aura::Window* window) |
117 : dimmed_(false), | 117 : dimmed_(false), |
118 root_window_(root_window), | 118 root_window_(window->GetRootWindow()), |
| 119 transform_window_(window), |
119 in_bounds_update_(false), | 120 in_bounds_update_(false), |
120 window_label_view_(nullptr), | 121 window_label_view_(nullptr), |
121 close_button_(new OverviewCloseButton(this)), | 122 close_button_(new OverviewCloseButton(this)), |
122 selector_item_activate_window_button_( | 123 selector_item_activate_window_button_( |
123 new TransparentActivateWindowButton(root_window, this)) { | 124 new TransparentActivateWindowButton(root_window_, this)) { |
124 views::Widget::InitParams params; | 125 views::Widget::InitParams params; |
125 params.type = views::Widget::InitParams::TYPE_POPUP; | 126 params.type = views::Widget::InitParams::TYPE_POPUP; |
126 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 127 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
127 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; | 128 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
128 params.parent = Shell::GetContainer(root_window, | 129 params.parent = Shell::GetContainer(root_window_, |
129 kShellWindowId_OverlayContainer); | 130 kShellWindowId_OverlayContainer); |
130 close_button_widget_.set_focus_on_creation(false); | 131 close_button_widget_.set_focus_on_creation(false); |
131 close_button_widget_.Init(params); | 132 close_button_widget_.Init(params); |
132 close_button_->SetVisible(false); | 133 close_button_->SetVisible(false); |
133 close_button_widget_.SetContentsView(close_button_); | 134 close_button_widget_.SetContentsView(close_button_); |
134 close_button_widget_.SetSize(close_button_->GetPreferredSize()); | 135 close_button_widget_.SetSize(close_button_->GetPreferredSize()); |
135 close_button_widget_.Show(); | 136 close_button_widget_.Show(); |
136 | 137 |
137 gfx::Rect close_button_rect(close_button_widget_.GetNativeWindow()->bounds()); | 138 gfx::Rect close_button_rect(close_button_widget_.GetNativeWindow()->bounds()); |
138 // Align the center of the button with position (0, 0) so that the | 139 // Align the center of the button with position (0, 0) so that the |
139 // translate transform does not need to take the button dimensions into | 140 // translate transform does not need to take the button dimensions into |
140 // account. | 141 // account. |
141 close_button_rect.set_x(-close_button_rect.width() / 2); | 142 close_button_rect.set_x(-close_button_rect.width() / 2); |
142 close_button_rect.set_y(-close_button_rect.height() / 2); | 143 close_button_rect.set_y(-close_button_rect.height() / 2); |
143 close_button_widget_.GetNativeWindow()->SetBounds(close_button_rect); | 144 close_button_widget_.GetNativeWindow()->SetBounds(close_button_rect); |
| 145 |
| 146 GetWindow()->AddObserver(this); |
| 147 |
| 148 UpdateCloseButtonAccessibilityName(); |
144 } | 149 } |
145 | 150 |
146 WindowSelectorItem::~WindowSelectorItem() { | 151 WindowSelectorItem::~WindowSelectorItem() { |
147 for (auto* transform_window : transform_windows_) { | 152 GetWindow()->RemoveObserver(this); |
148 transform_window->window()->RemoveObserver(this); | |
149 } | |
150 } | 153 } |
151 | 154 |
152 void WindowSelectorItem::AddWindow(aura::Window* window) { | 155 aura::Window* WindowSelectorItem::GetWindow() { |
153 DCHECK(window->GetRootWindow() == root_window_); | 156 return transform_window_.window(); |
154 window->AddObserver(this); | |
155 ScopedTransformOverviewWindow* transform_window = | |
156 new ScopedTransformOverviewWindow(window); | |
157 transform_windows_.push_back(transform_window); | |
158 // The transparent overlays are added at the front of the z-order when | |
159 // created so make sure the selector item's transparent overlay is behind the | |
160 // overlay for the window that was just added. | |
161 transform_window->activate_button()->StackAbove( | |
162 selector_item_activate_window_button_.get()); | |
163 | |
164 UpdateSelectorButtons(); | |
165 UpdateCloseButtonAccessibilityName(); | |
166 } | 157 } |
167 | 158 |
168 bool WindowSelectorItem::HasSelectableWindow(const aura::Window* window) const { | 159 void WindowSelectorItem::RestoreWindow() { |
169 for (auto* transform_window : transform_windows_) { | 160 transform_window_.RestoreWindow(); |
170 if (transform_window->window() == window) | 161 } |
171 return true; | 162 |
172 } | 163 void WindowSelectorItem::ShowWindowOnExit() { |
173 return false; | 164 transform_window_.ShowWindowOnExit(); |
| 165 } |
| 166 |
| 167 void WindowSelectorItem::PrepareForOverview() { |
| 168 transform_window_.PrepareForOverview(); |
174 } | 169 } |
175 | 170 |
176 bool WindowSelectorItem::Contains(const aura::Window* target) const { | 171 bool WindowSelectorItem::Contains(const aura::Window* target) const { |
177 for (auto* transform_window : transform_windows_) { | 172 return transform_window_.Contains(target); |
178 if (transform_window->Contains(target)) | |
179 return true; | |
180 } | |
181 return false; | |
182 } | 173 } |
183 | 174 |
184 void WindowSelectorItem::RestoreWindowOnExit(aura::Window* window) { | 175 void WindowSelectorItem::SetBounds(const gfx::Rect& target_bounds, |
185 for (auto* transform_window : transform_windows_) { | |
186 if (transform_window->Contains(window)) { | |
187 transform_window->RestoreWindowOnExit(); | |
188 break; | |
189 } | |
190 } | |
191 } | |
192 | |
193 aura::Window* WindowSelectorItem::SelectionWindow() const { | |
194 return SelectionTransformWindow()->window(); | |
195 } | |
196 | |
197 void WindowSelectorItem::RemoveWindow(const aura::Window* window) { | |
198 bool window_found = false; | |
199 | |
200 for (TransformWindows::iterator iter = transform_windows_.begin(); | |
201 iter != transform_windows_.end(); | |
202 ++iter) { | |
203 ScopedTransformOverviewWindow* transform_window = *iter; | |
204 | |
205 if (transform_window->window() == window) { | |
206 transform_window->window()->RemoveObserver(this); | |
207 transform_window->OnWindowDestroyed(); | |
208 transform_windows_.erase(iter); | |
209 window_found = true; | |
210 break; | |
211 } | |
212 } | |
213 CHECK(window_found); | |
214 | |
215 | |
216 // If empty WindowSelectorItem will be destroyed immediately after this by | |
217 // its owner. | |
218 if (empty()) | |
219 return; | |
220 | |
221 UpdateCloseButtonAccessibilityName(); | |
222 window_label_.reset(); | |
223 UpdateWindowLabels(target_bounds_, | |
224 OverviewAnimationType::OVERVIEW_ANIMATION_NONE); | |
225 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); | |
226 UpdateSelectorButtons(); | |
227 } | |
228 | |
229 bool WindowSelectorItem::empty() const { | |
230 return transform_windows_.empty(); | |
231 } | |
232 | |
233 void WindowSelectorItem::PrepareForOverview() { | |
234 for (auto* transform_window : transform_windows_) | |
235 transform_window->PrepareForOverview(); | |
236 } | |
237 | |
238 void WindowSelectorItem::SetBounds(aura::Window* root_window, | |
239 const gfx::Rect& target_bounds, | |
240 OverviewAnimationType animation_type) { | 176 OverviewAnimationType animation_type) { |
241 if (in_bounds_update_) | 177 if (in_bounds_update_) |
242 return; | 178 return; |
243 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); | 179 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); |
244 target_bounds_ = target_bounds; | 180 target_bounds_ = target_bounds; |
245 | 181 |
246 UpdateWindowLabels(target_bounds, animation_type); | 182 UpdateWindowLabels(target_bounds, animation_type); |
247 | 183 |
248 gfx::Rect inset_bounds(target_bounds); | 184 gfx::Rect inset_bounds(target_bounds); |
249 inset_bounds.Inset(kWindowMargin, kWindowMargin); | 185 inset_bounds.Inset(kWindowMargin, kWindowMargin); |
250 SetItemBounds(root_window, inset_bounds, animation_type); | 186 SetItemBounds(inset_bounds, animation_type); |
251 | 187 |
252 // SetItemBounds is called before UpdateCloseButtonLayout so the close button | 188 // SetItemBounds is called before UpdateCloseButtonLayout so the close button |
253 // can properly use the updated windows bounds. | 189 // can properly use the updated windows bounds. |
254 UpdateCloseButtonLayout(animation_type); | 190 UpdateCloseButtonLayout(animation_type); |
255 UpdateSelectorButtons(); | 191 UpdateSelectorButtons(); |
256 } | 192 } |
257 | 193 |
258 void WindowSelectorItem::RecomputeWindowTransforms() { | 194 void WindowSelectorItem::RecomputeWindowTransforms() { |
259 if (in_bounds_update_ || target_bounds_.IsEmpty()) | 195 if (in_bounds_update_ || target_bounds_.IsEmpty()) |
260 return; | 196 return; |
261 DCHECK(root_window_); | |
262 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); | 197 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); |
263 gfx::Rect inset_bounds(target_bounds_); | 198 gfx::Rect inset_bounds(target_bounds_); |
264 inset_bounds.Inset(kWindowMargin, kWindowMargin); | 199 inset_bounds.Inset(kWindowMargin, kWindowMargin); |
265 SetItemBounds(root_window_, inset_bounds, | 200 SetItemBounds(inset_bounds, OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
266 OverviewAnimationType::OVERVIEW_ANIMATION_NONE); | |
267 | 201 |
268 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); | 202 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
269 UpdateSelectorButtons(); | 203 UpdateSelectorButtons(); |
270 } | 204 } |
271 | 205 |
272 void WindowSelectorItem::SendFocusAlert() const { | 206 void WindowSelectorItem::SendFocusAlert() const { |
273 selector_item_activate_window_button_->SendFocusAlert(); | 207 selector_item_activate_window_button_->SendFocusAlert(); |
274 } | 208 } |
275 | 209 |
276 void WindowSelectorItem::SetDimmed(bool dimmed) { | 210 void WindowSelectorItem::SetDimmed(bool dimmed) { |
277 dimmed_ = dimmed; | 211 dimmed_ = dimmed; |
278 SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f); | 212 SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f); |
279 } | 213 } |
280 | 214 |
281 void WindowSelectorItem::ButtonPressed(views::Button* sender, | 215 void WindowSelectorItem::ButtonPressed(views::Button* sender, |
282 const ui::Event& event) { | 216 const ui::Event& event) { |
283 CHECK(!transform_windows_.empty()); | 217 transform_window_.Close(); |
284 SelectionTransformWindow()->Close(); | 218 } |
| 219 |
| 220 void WindowSelectorItem::OnWindowDestroying(aura::Window* window) { |
| 221 window->RemoveObserver(this); |
| 222 transform_window_.OnWindowDestroyed(); |
285 } | 223 } |
286 | 224 |
287 void WindowSelectorItem::OnWindowTitleChanged(aura::Window* window) { | 225 void WindowSelectorItem::OnWindowTitleChanged(aura::Window* window) { |
288 // TODO(flackr): Maybe add the new title to a vector of titles so that we can | 226 // TODO(flackr): Maybe add the new title to a vector of titles so that we can |
289 // filter any of the titles the window had while in the overview session. | 227 // filter any of the titles the window had while in the overview session. |
290 if (window == SelectionWindow()) { | 228 if (window == GetWindow()) { |
291 window_label_view_->SetText(window->title()); | 229 window_label_view_->SetText(window->title()); |
292 UpdateCloseButtonAccessibilityName(); | 230 UpdateCloseButtonAccessibilityName(); |
293 } | 231 } |
294 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); | 232 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
295 UpdateSelectorButtons(); | 233 UpdateSelectorButtons(); |
296 } | 234 } |
297 | 235 |
298 void WindowSelectorItem::Select() { | 236 void WindowSelectorItem::Select() { |
299 aura::Window* selection_window = SelectionWindow(); | 237 aura::Window* selection_window = GetWindow(); |
300 if (selection_window) | 238 if (selection_window) |
301 wm::GetWindowState(selection_window)->Activate(); | 239 wm::GetWindowState(selection_window)->Activate(); |
302 } | 240 } |
303 | 241 |
304 void WindowSelectorItem::SetItemBounds(aura::Window* root_window, | 242 void WindowSelectorItem::SetItemBounds(const gfx::Rect& target_bounds, |
305 const gfx::Rect& target_bounds, | |
306 OverviewAnimationType animation_type) { | 243 OverviewAnimationType animation_type) { |
307 gfx::Rect bounding_rect; | 244 DCHECK(root_window_ == GetWindow()->GetRootWindow()); |
308 for (auto* transform_window : transform_windows_) { | 245 gfx::Rect screen_bounds = transform_window_.GetTargetBoundsInScreen(); |
309 bounding_rect.Union( | 246 gfx::Rect selector_item_bounds = |
310 transform_window->GetTargetBoundsInScreen()); | |
311 } | |
312 gfx::Rect bounds = | |
313 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( | 247 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( |
314 bounding_rect, target_bounds); | 248 screen_bounds, target_bounds); |
315 gfx::Transform bounding_transform = | 249 gfx::Transform transform = |
316 ScopedTransformOverviewWindow::GetTransformForRect(bounding_rect, bounds); | 250 ScopedTransformOverviewWindow::GetTransformForRect(screen_bounds, |
317 for (auto* transform_window : transform_windows_) { | 251 selector_item_bounds); |
318 gfx::Rect target_bounds = transform_window->GetTargetBoundsInScreen(); | 252 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; |
319 gfx::Transform transform = TransformAboutPivot( | 253 transform_window_.BeginScopedAnimation(animation_type, &animation_settings); |
320 gfx::Point(bounding_rect.x() - target_bounds.x(), | 254 transform_window_.SetTransform(root_window_, transform); |
321 bounding_rect.y() - target_bounds.y()), | 255 transform_window_.set_overview_transform(transform); |
322 bounding_transform); | |
323 | |
324 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; | |
325 transform_window->BeginScopedAnimation(animation_type, &animation_settings); | |
326 transform_window->SetTransform(root_window, transform); | |
327 transform_window->set_overview_transform(transform); | |
328 } | |
329 } | 256 } |
330 | 257 |
331 void WindowSelectorItem::SetOpacity(float opacity) { | 258 void WindowSelectorItem::SetOpacity(float opacity) { |
332 window_label_->GetNativeWindow()->layer()->SetOpacity(opacity); | 259 window_label_->GetNativeWindow()->layer()->SetOpacity(opacity); |
333 close_button_widget_.GetNativeWindow()->layer()->SetOpacity(opacity); | 260 close_button_widget_.GetNativeWindow()->layer()->SetOpacity(opacity); |
334 | 261 |
335 // TODO(flackr): find a way to make panels that are hidden behind other panels | 262 transform_window_.SetOpacity(opacity); |
336 // look nice. | |
337 for (auto* transform_window : transform_windows_) { | |
338 transform_window->SetOpacity(opacity); | |
339 } | |
340 } | 263 } |
341 | 264 |
342 void WindowSelectorItem::UpdateWindowLabels( | 265 void WindowSelectorItem::UpdateWindowLabels( |
343 const gfx::Rect& window_bounds, | 266 const gfx::Rect& window_bounds, |
344 OverviewAnimationType animation_type) { | 267 OverviewAnimationType animation_type) { |
345 // If the root window has changed, force the window label to be recreated | |
346 // and faded in on the new root window. | |
347 DCHECK(!window_label_ || | |
348 window_label_->GetNativeWindow()->GetRootWindow() == root_window_); | |
349 | 268 |
350 if (!window_label_) { | 269 if (!window_label_) { |
351 CreateWindowLabel(SelectionWindow()->title()); | 270 CreateWindowLabel(GetWindow()->title()); |
352 SetupFadeInAfterLayout(window_label_->GetNativeWindow()); | 271 SetupFadeInAfterLayout(window_label_->GetNativeWindow()); |
353 } | 272 } |
354 | 273 |
355 gfx::Rect converted_bounds = ScreenUtil::ConvertRectFromScreen(root_window_, | 274 gfx::Rect converted_bounds = ScreenUtil::ConvertRectFromScreen(root_window_, |
356 window_bounds); | 275 window_bounds); |
357 gfx::Rect label_bounds(converted_bounds.x(), | 276 gfx::Rect label_bounds(converted_bounds.x(), |
358 converted_bounds.bottom(), | 277 converted_bounds.bottom(), |
359 converted_bounds.width(), | 278 converted_bounds.width(), |
360 0); | 279 0); |
361 label_bounds.set_height(window_label_->GetContentsView()-> | 280 label_bounds.set_height(window_label_->GetContentsView()-> |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 views::BoxLayout* layout = new views::BoxLayout(views::BoxLayout::kVertical, | 314 views::BoxLayout* layout = new views::BoxLayout(views::BoxLayout::kVertical, |
396 0, | 315 0, |
397 kVerticalLabelPadding, | 316 kVerticalLabelPadding, |
398 0); | 317 0); |
399 window_label_view_->SetLayoutManager(layout); | 318 window_label_view_->SetLayoutManager(layout); |
400 window_label_->SetContentsView(window_label_view_); | 319 window_label_->SetContentsView(window_label_view_); |
401 window_label_->Show(); | 320 window_label_->Show(); |
402 } | 321 } |
403 | 322 |
404 void WindowSelectorItem::UpdateSelectorButtons() { | 323 void WindowSelectorItem::UpdateSelectorButtons() { |
405 CHECK(!transform_windows_.empty()); | 324 aura::Window* window = GetWindow(); |
406 | 325 |
407 selector_item_activate_window_button_->SetBounds(target_bounds()); | 326 selector_item_activate_window_button_->SetBounds(target_bounds()); |
408 selector_item_activate_window_button_->SetAccessibleName( | 327 selector_item_activate_window_button_->SetAccessibleName(window->title()); |
409 transform_windows_.front()->window()->title()); | |
410 | 328 |
411 for (auto* transform_window : transform_windows_) { | 329 TransparentActivateWindowButton* activate_button = |
412 TransparentActivateWindowButton* activate_button = | 330 transform_window_.activate_button(); |
413 transform_window->activate_button(); | 331 activate_button->SetBounds(target_bounds()); |
414 | 332 activate_button->SetAccessibleName(window->title()); |
415 // If there is only one window in this, then expand the transparent overlay | |
416 // so that touch exploration in ChromVox only provides spoken feedback once | |
417 // within |this| selector item's bounds. | |
418 gfx::Rect bounds = transform_windows_.size() == 1 | |
419 ? target_bounds() : GetTransformedBounds(transform_window->window()); | |
420 activate_button->SetBounds(bounds); | |
421 activate_button->SetAccessibleName(transform_window->window()->title()); | |
422 } | |
423 } | 333 } |
424 | 334 |
425 void WindowSelectorItem::UpdateCloseButtonLayout( | 335 void WindowSelectorItem::UpdateCloseButtonLayout( |
426 OverviewAnimationType animation_type) { | 336 OverviewAnimationType animation_type) { |
427 if (!close_button_->visible()) { | 337 if (!close_button_->visible()) { |
428 close_button_->SetVisible(true); | 338 close_button_->SetVisible(true); |
429 SetupFadeInAfterLayout(close_button_widget_.GetNativeWindow()); | 339 SetupFadeInAfterLayout(close_button_widget_.GetNativeWindow()); |
430 } | 340 } |
431 ScopedOverviewAnimationSettings animation_settings(animation_type, | 341 ScopedOverviewAnimationSettings animation_settings(animation_type, |
432 close_button_widget_.GetNativeWindow()); | 342 close_button_widget_.GetNativeWindow()); |
433 | 343 |
434 gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen( | 344 gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen( |
435 close_button_widget_.GetNativeWindow()->GetRootWindow(), | 345 close_button_widget_.GetNativeWindow()->GetRootWindow(), |
436 GetTransformedBounds(SelectionWindow())); | 346 GetTransformedBounds(GetWindow())); |
437 | 347 |
438 gfx::Transform close_button_transform; | 348 gfx::Transform close_button_transform; |
439 close_button_transform.Translate(transformed_window_bounds.right(), | 349 close_button_transform.Translate(transformed_window_bounds.right(), |
440 transformed_window_bounds.y()); | 350 transformed_window_bounds.y()); |
441 close_button_widget_.GetNativeWindow()->SetTransform( | 351 close_button_widget_.GetNativeWindow()->SetTransform( |
442 close_button_transform); | 352 close_button_transform); |
443 } | 353 } |
444 | 354 |
445 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { | 355 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { |
446 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( | 356 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( |
447 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, | 357 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, |
448 SelectionWindow()->title())); | 358 GetWindow()->title())); |
449 } | |
450 | |
451 ScopedTransformOverviewWindow* | |
452 WindowSelectorItem::SelectionTransformWindow() const { | |
453 CHECK(!transform_windows_.empty()); | |
454 return transform_windows_.front(); | |
455 } | 359 } |
456 | 360 |
457 } // namespace ash | 361 } // namespace ash |
OLD | NEW |