1 // Copyright (c) 2012 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/wm/window_util.h"
6
7 #include <vector>
8
9 #include "ash/ash_constants.h"
10 #include "ash/screen_ash.h"
11 #include "ash/shell.h"
12 #include "ash/wm/window_properties.h"
13 #include "ash/wm/window_state.h"
14 #include "ui/aura/client/activation_client.h"
15 #include "ui/aura/client/aura_constants.h"
16 #include "ui/aura/root_window.h"
17 #include "ui/aura/window.h"
18 #include "ui/gfx/display.h"
19 #include "ui/gfx/rect.h"
20 #include "ui/gfx/screen.h"
21 #include "ui/views/corewm/window_util.h"
22 #include "ui/views/view.h"
23 #include "ui/views/widget/widget.h"
24
25 namespace ash {
26 namespace wm {
27
28 // TODO(beng): replace many of these functions with the corewm versions.
ActivateWindow(aura::Window * window)29 void ActivateWindow(aura::Window* window) {
30 views::corewm::ActivateWindow(window);
31 }
32
DeactivateWindow(aura::Window * window)33 void DeactivateWindow(aura::Window* window) {
34 views::corewm::DeactivateWindow(window);
35 }
36
IsActiveWindow(aura::Window * window)37 bool IsActiveWindow(aura::Window* window) {
38 return views::corewm::IsActiveWindow(window);
39 }
40
GetActiveWindow()41 aura::Window* GetActiveWindow() {
42 return aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())->
43 GetActiveWindow();
44 }
45
GetActivatableWindow(aura::Window * window)46 aura::Window* GetActivatableWindow(aura::Window* window) {
47 return views::corewm::GetActivatableWindow(window);
48 }
49
CanActivateWindow(aura::Window * window)50 bool CanActivateWindow(aura::Window* window) {
51 return views::corewm::CanActivateWindow(window);
52 }
53
IsWindowMinimized(aura::Window * window)54 bool IsWindowMinimized(aura::Window* window) {
55 return window->GetProperty(aura::client::kShowStateKey) ==
56 ui::SHOW_STATE_MINIMIZED;
57 }
58
CenterWindow(aura::Window * window)59 void CenterWindow(aura::Window* window) {
60 wm::WindowState* window_state = wm::GetWindowState(window);
61 if (!window_state->IsNormalShowState())
62 return;
63 const gfx::Display display =
64 Shell::GetScreen()->GetDisplayNearestWindow(window);
65 gfx::Rect center = display.work_area();
66 gfx::Size size = window->bounds().size();
67 if (window_state->IsSnapped()) {
68 if (window_state->HasRestoreBounds())
69 size = window_state->GetRestoreBoundsInScreen().size();
70 center.ClampToCenteredSize(size);
71 window_state->SetRestoreBoundsInScreen(center);
72 window_state->Restore();
73 } else {
74 center = ScreenAsh::ConvertRectFromScreen(window->parent(),
75 center);
76 center.ClampToCenteredSize(size);
77 window->SetBounds(center);
78 }
79 }
80
AdjustBoundsToEnsureMinimumWindowVisibility(const gfx::Rect & visible_area,gfx::Rect * bounds)81 void AdjustBoundsToEnsureMinimumWindowVisibility(const gfx::Rect& visible_area,
82 gfx::Rect* bounds) {
83 AdjustBoundsToEnsureWindowVisibility(
84 visible_area, kMinimumOnScreenArea, kMinimumOnScreenArea, bounds);
85 }
86
AdjustBoundsToEnsureWindowVisibility(const gfx::Rect & visible_area,int min_width,int min_height,gfx::Rect * bounds)87 void AdjustBoundsToEnsureWindowVisibility(const gfx::Rect& visible_area,
88 int min_width,
89 int min_height,
90 gfx::Rect* bounds) {
91 bounds->set_width(std::min(bounds->width(), visible_area.width()));
92 bounds->set_height(std::min(bounds->height(), visible_area.height()));
93
94 min_width = std::min(min_width, visible_area.width());
95 min_height = std::min(min_height, visible_area.height());
96
97 if (bounds->x() + min_width > visible_area.right()) {
98 bounds->set_x(visible_area.right() - min_width);
99 } else if (bounds->right() - min_width < 0) {
100 bounds->set_x(min_width - bounds->width());
101 }
102 if (bounds->y() + min_height > visible_area.bottom()) {
103 bounds->set_y(visible_area.bottom() - min_height);
104 } else if (bounds->bottom() - min_height < 0) {
105 bounds->set_y(min_height - bounds->height());
106 }
107 if (bounds->y() < 0)
108 bounds->set_y(0);
109 }
110
MoveWindowToEventRoot(aura::Window * window,const ui::Event & event)111 bool MoveWindowToEventRoot(aura::Window* window, const ui::Event& event) {
112 views::View* target = static_cast<views::View*>(event.target());
113 if (!target)
114 return false;
115 aura::Window* target_root =
116 target->GetWidget()->GetNativeView()->GetRootWindow();
117 if (!target_root || target_root == window->GetRootWindow())
118 return false;
119 aura::Window* window_container =
120 ash::Shell::GetContainer(target_root, window->parent()->id());
121 // Move the window to the target launcher.
122 window_container->AddChild(window);
123 return true;
124 }
125
ReparentChildWithTransientChildren(aura::Window * child,aura::Window * old_parent,aura::Window * new_parent)126 void ReparentChildWithTransientChildren(aura::Window* child,
127 aura::Window* old_parent,
128 aura::Window* new_parent) {
129 if (child->parent() == old_parent)
130 new_parent->AddChild(child);
131 ReparentTransientChildrenOfChild(child, old_parent, new_parent);
132 }
133
ReparentTransientChildrenOfChild(aura::Window * child,aura::Window * old_parent,aura::Window * new_parent)134 void ReparentTransientChildrenOfChild(aura::Window* child,
135 aura::Window* old_parent,
136 aura::Window* new_parent) {
137 for (size_t i = 0; i < child->transient_children().size(); ++i) {
138 ReparentChildWithTransientChildren(child->transient_children()[i],
139 old_parent,
140 new_parent);
141 }
142 }
143
144 } // namespace wm
145 } // namespace ash
146