window_util.cc revision f2477e01787aa58f445919b809d89e252beef54f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_constants.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_properties.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/wm/window_state.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/activation_client.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/window_util.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/view.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/widget/widget.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace wm {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(beng): replace many of these functions with the corewm versions.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ActivateWindow(aura::Window* window) {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::corewm::ActivateWindow(window);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeactivateWindow(aura::Window* window) {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::corewm::DeactivateWindow(window);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsActiveWindow(aura::Window* window) {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return views::corewm::IsActiveWindow(window);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)aura::Window* GetActiveWindow() {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())->
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetActiveWindow();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)aura::Window* GetActivatableWindow(aura::Window* window) {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return views::corewm::GetActivatableWindow(window);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CanActivateWindow(aura::Window* window) {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return views::corewm::CanActivateWindow(window);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool IsWindowMinimized(aura::Window* window) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window->GetProperty(aura::client::kShowStateKey) ==
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SHOW_STATE_MINIMIZED;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CenterWindow(aura::Window* window) {
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window);
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!window_state->IsNormalShowState())
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Display display =
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetScreen()->GetDisplayNearestWindow(window);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect center = display.work_area();
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Size size = window_state->HasRestoreBounds() ?
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window_state->GetRestoreBoundsInScreen().size() :
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window->bounds().size();
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  center.ClampToCenteredSize(size);
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_state->SetRestoreBoundsInScreen(center);
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_state->Restore();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void AdjustBoundsToEnsureMinimumWindowVisibility(const gfx::Rect& visible_area,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 gfx::Rect* bounds) {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AdjustBoundsToEnsureWindowVisibility(
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      visible_area, kMinimumOnScreenArea, kMinimumOnScreenArea, bounds);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void AdjustBoundsToEnsureWindowVisibility(const gfx::Rect& visible_area,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          int min_width,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          int min_height,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          gfx::Rect* bounds) {
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bounds->set_width(std::min(bounds->width(), visible_area.width()));
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bounds->set_height(std::min(bounds->height(), visible_area.height()));
85bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  min_width = std::min(min_width, visible_area.width());
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  min_height = std::min(min_height, visible_area.height());
88bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (bounds->x() + min_width > visible_area.right()) {
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bounds->set_x(visible_area.right() - min_width);
91bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  } else if (bounds->right() - min_width < 0) {
92bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    bounds->set_x(min_width - bounds->width());
93bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  }
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (bounds->y() + min_height > visible_area.bottom()) {
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bounds->set_y(visible_area.bottom() - min_height);
96bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  } else if (bounds->bottom() - min_height < 0) {
97bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    bounds->set_y(min_height - bounds->height());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (bounds->y() < 0)
1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    bounds->set_y(0);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool MoveWindowToEventRoot(aura::Window* window, const ui::Event& event) {
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::View* target = static_cast<views::View*>(event.target());
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!target)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* target_root =
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      target->GetWidget()->GetNativeView()->GetRootWindow();
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!target_root || target_root == window->GetRootWindow())
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* window_container =
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ash::Shell::GetContainer(target_root, window->parent()->id());
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Move the window to the target launcher.
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  window_container->AddChild(window);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ReparentChildWithTransientChildren(aura::Window* window,
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        aura::Window* child) {
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window->AddChild(child);
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ReparentTransientChildrenOfChild(window, child);
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ReparentTransientChildrenOfChild(aura::Window* window,
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                      aura::Window* child) {
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (size_t i = 0; i < child->transient_children().size(); ++i)
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReparentChildWithTransientChildren(window, child->transient_children()[i]);
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace wm
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
132