window_util.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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/activation_controller.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_properties.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/compositor/layer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace wm {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ActivateWindow(aura::Window* window) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(window);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(window->GetRootWindow());
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::GetActivationClient(window->GetRootWindow())->ActivateWindow(
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeactivateWindow(aura::Window* window) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(window);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(window->GetRootWindow());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::GetActivationClient(window->GetRootWindow())->DeactivateWindow(
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsActiveWindow(aura::Window* window) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(window);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!window->GetRootWindow())
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::ActivationClient* client =
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::client::GetActivationClient(window->GetRootWindow());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return client && client->GetActiveWindow() == window;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)aura::Window* GetActiveWindow() {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())->
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetActiveWindow();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)aura::Window* GetActivatableWindow(aura::Window* window) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return internal::ActivationController::GetActivatableWindow(window, NULL);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsActiveWindowFullscreen() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window = GetActiveWindow();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (window) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (window->GetProperty(aura::client::kShowStateKey) ==
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::SHOW_STATE_FULLSCREEN) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window = window->parent();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CanActivateWindow(aura::Window* window) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(window);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!window->GetRootWindow())
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::ActivationClient* client =
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::client::GetActivationClient(window->GetRootWindow());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return client && client->CanActivateWindow(window);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CanMaximizeWindow(const aura::Window* window) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window->GetProperty(aura::client::kCanMaximizeKey);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsWindowNormal(const aura::Window* window) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IsWindowStateNormal(window->GetProperty(aura::client::kShowStateKey));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsWindowStateNormal(ui::WindowShowState state) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state == ui::SHOW_STATE_NORMAL || state == ui::SHOW_STATE_DEFAULT;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsWindowMaximized(const aura::Window* window) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window->GetProperty(aura::client::kShowStateKey) ==
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SHOW_STATE_MAXIMIZED;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsWindowMinimized(const aura::Window* window) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window->GetProperty(aura::client::kShowStateKey) ==
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SHOW_STATE_MINIMIZED;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsWindowFullscreen(const aura::Window* window) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window->GetProperty(aura::client::kShowStateKey) ==
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SHOW_STATE_FULLSCREEN;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MaximizeWindow(aura::Window* window) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MinimizeWindow(aura::Window* window) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RestoreWindow(aura::Window* window) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToggleMaximizedWindow(aura::Window* window) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ash::wm::IsWindowMaximized(window))
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ash::wm::RestoreWindow(window);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ash::wm::CanMaximizeWindow(window))
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ash::wm::MaximizeWindow(window);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CenterWindow(aura::Window* window) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Display display =
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetScreen()->GetDisplayNearestWindow(window);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect center = display.work_area();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  center.ClampToCenteredSize(window->bounds().size());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetBounds(center);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::Layer* RecreateWindowLayers(aura::Window* window, bool set_bounds) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect bounds = window->bounds();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Layer* old_layer = window->RecreateLayer();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(old_layer);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (aura::Window::Windows::const_iterator it = window->children().begin();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != window->children().end();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Maintain the hierarchy of the detached layers.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_layer->Add(RecreateWindowLayers(*it, set_bounds));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (set_bounds)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window->SetBounds(bounds);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return old_layer;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeepDeleteLayers(ui::Layer* layer) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<ui::Layer*> children = layer->children();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<ui::Layer*>::const_iterator it = children.begin();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != children.end();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::Layer* child = *it;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeepDeleteLayers(child);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete layer;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsWindowPositionManaged(const aura::Window* window) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window->GetProperty(ash::internal::kWindowPositionManagedKey);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetWindowPositionManaged(aura::Window* window, bool managed) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetProperty(ash::internal::kWindowPositionManagedKey, managed);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasUserChangedWindowPositionOrSize(const aura::Window* window) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window->GetProperty(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ash::internal::kUserChangedWindowPositionOrSizeKey);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetUserHasChangedWindowPositionOrSize(aura::Window* window, bool changed) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetProperty(ash::internal::kUserChangedWindowPositionOrSizeKey,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      changed);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::Rect* GetPreAutoManageWindowBounds(const aura::Window* window) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window->GetProperty(ash::internal::kPreAutoManagedWindowBoundsKey);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetPreAutoManageWindowBounds(aura::Window* window,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const gfx::Rect& bounds) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetProperty(ash::internal::kPreAutoManagedWindowBoundsKey,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      new gfx::Rect(bounds));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AdjustBoundsToEnsureWindowVisibility(gfx::Rect* bounds,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const gfx::Rect& work_area) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bounds->set_width(std::min(bounds->width(), work_area.width()));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bounds->set_height(std::min(bounds->height(), work_area.height()));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!work_area.Intersects(*bounds)) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int y_offset = 0;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (work_area.bottom() < bounds->y()) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      y_offset = work_area.bottom() - bounds->y() - kMinimumOnScreenArea;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (bounds->bottom() < work_area.y()) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      y_offset = work_area.y() - bounds->bottom() + kMinimumOnScreenArea;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int x_offset = 0;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (work_area.right() < bounds->x()) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      x_offset = work_area.right() - bounds->x() - kMinimumOnScreenArea;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (bounds->right() < work_area.x()) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      x_offset = work_area.x() - bounds->right() + kMinimumOnScreenArea;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds->Offset(x_offset, y_offset);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace wm
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
210