summaryrefslogtreecommitdiff
path: root/chromium/ash/wm/window_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/wm/window_util.cc')
-rw-r--r--chromium/ash/wm/window_util.cc145
1 files changed, 145 insertions, 0 deletions
diff --git a/chromium/ash/wm/window_util.cc b/chromium/ash/wm/window_util.cc
new file mode 100644
index 00000000000..def4b6d5bad
--- /dev/null
+++ b/chromium/ash/wm/window_util.cc
@@ -0,0 +1,145 @@
+// 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.
+
+#include "ash/wm/window_util.h"
+
+#include <vector>
+
+#include "ash/ash_constants.h"
+#include "ash/screen_ash.h"
+#include "ash/shell.h"
+#include "ash/wm/window_properties.h"
+#include "ash/wm/window_state.h"
+#include "ui/aura/client/activation_client.h"
+#include "ui/aura/client/aura_constants.h"
+#include "ui/aura/root_window.h"
+#include "ui/aura/window.h"
+#include "ui/gfx/display.h"
+#include "ui/gfx/rect.h"
+#include "ui/gfx/screen.h"
+#include "ui/views/corewm/window_util.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+
+namespace ash {
+namespace wm {
+
+// TODO(beng): replace many of these functions with the corewm versions.
+void ActivateWindow(aura::Window* window) {
+ views::corewm::ActivateWindow(window);
+}
+
+void DeactivateWindow(aura::Window* window) {
+ views::corewm::DeactivateWindow(window);
+}
+
+bool IsActiveWindow(aura::Window* window) {
+ return views::corewm::IsActiveWindow(window);
+}
+
+aura::Window* GetActiveWindow() {
+ return aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())->
+ GetActiveWindow();
+}
+
+aura::Window* GetActivatableWindow(aura::Window* window) {
+ return views::corewm::GetActivatableWindow(window);
+}
+
+bool CanActivateWindow(aura::Window* window) {
+ return views::corewm::CanActivateWindow(window);
+}
+
+bool IsWindowMinimized(aura::Window* window) {
+ return window->GetProperty(aura::client::kShowStateKey) ==
+ ui::SHOW_STATE_MINIMIZED;
+}
+
+void CenterWindow(aura::Window* window) {
+ wm::WindowState* window_state = wm::GetWindowState(window);
+ if (!window_state->IsNormalShowState())
+ return;
+ const gfx::Display display =
+ Shell::GetScreen()->GetDisplayNearestWindow(window);
+ gfx::Rect center = display.work_area();
+ gfx::Size size = window->bounds().size();
+ if (window_state->IsSnapped()) {
+ if (window_state->HasRestoreBounds())
+ size = window_state->GetRestoreBoundsInScreen().size();
+ center.ClampToCenteredSize(size);
+ window_state->SetRestoreBoundsInScreen(center);
+ window_state->Restore();
+ } else {
+ center = ScreenAsh::ConvertRectFromScreen(window->parent(),
+ center);
+ center.ClampToCenteredSize(size);
+ window->SetBounds(center);
+ }
+}
+
+void AdjustBoundsToEnsureMinimumWindowVisibility(const gfx::Rect& visible_area,
+ gfx::Rect* bounds) {
+ AdjustBoundsToEnsureWindowVisibility(
+ visible_area, kMinimumOnScreenArea, kMinimumOnScreenArea, bounds);
+}
+
+void AdjustBoundsToEnsureWindowVisibility(const gfx::Rect& visible_area,
+ int min_width,
+ int min_height,
+ gfx::Rect* bounds) {
+ bounds->set_width(std::min(bounds->width(), visible_area.width()));
+ bounds->set_height(std::min(bounds->height(), visible_area.height()));
+
+ min_width = std::min(min_width, visible_area.width());
+ min_height = std::min(min_height, visible_area.height());
+
+ if (bounds->x() + min_width > visible_area.right()) {
+ bounds->set_x(visible_area.right() - min_width);
+ } else if (bounds->right() - min_width < 0) {
+ bounds->set_x(min_width - bounds->width());
+ }
+ if (bounds->y() + min_height > visible_area.bottom()) {
+ bounds->set_y(visible_area.bottom() - min_height);
+ } else if (bounds->bottom() - min_height < 0) {
+ bounds->set_y(min_height - bounds->height());
+ }
+ if (bounds->y() < 0)
+ bounds->set_y(0);
+}
+
+bool MoveWindowToEventRoot(aura::Window* window, const ui::Event& event) {
+ views::View* target = static_cast<views::View*>(event.target());
+ if (!target)
+ return false;
+ aura::Window* target_root =
+ target->GetWidget()->GetNativeView()->GetRootWindow();
+ if (!target_root || target_root == window->GetRootWindow())
+ return false;
+ aura::Window* window_container =
+ ash::Shell::GetContainer(target_root, window->parent()->id());
+ // Move the window to the target launcher.
+ window_container->AddChild(window);
+ return true;
+}
+
+void ReparentChildWithTransientChildren(aura::Window* child,
+ aura::Window* old_parent,
+ aura::Window* new_parent) {
+ if (child->parent() == old_parent)
+ new_parent->AddChild(child);
+ ReparentTransientChildrenOfChild(child, old_parent, new_parent);
+}
+
+void ReparentTransientChildrenOfChild(aura::Window* child,
+ aura::Window* old_parent,
+ aura::Window* new_parent) {
+ for (size_t i = 0; i < child->transient_children().size(); ++i) {
+ ReparentChildWithTransientChildren(child->transient_children()[i],
+ old_parent,
+ new_parent);
+ }
+}
+
+} // namespace wm
+} // namespace ash