screen_position_controller.cc revision 3551c9c881056c480085172ff9840cab31610854
151125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremenek// Copyright (c) 2012 The Chromium Authors. All rights reserved.
24241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek// Use of this source code is governed by a BSD-style license that can be
34241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek// found in the LICENSE file.
44241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
54241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ash/display/screen_position_controller.h"
64241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
74241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ash/display/display_controller.h"
84241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ash/root_window_controller.h"
94241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ash/shell.h"
1051125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremenek#include "ash/shell_window_ids.h"
1151125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremenek#include "ash/wm/coordinate_conversion.h"
124241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ash/wm/system_modal_container_layout_manager.h"
134241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ash/wm/window_properties.h"
144241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ui/aura/client/activation_client.h"
154241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ui/aura/client/capture_client.h"
164241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ui/aura/client/focus_client.h"
174241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ui/aura/client/stacking_client.h"
184a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek#include "ui/aura/root_window.h"
1963bbe5312cd89ce0ceb684bff68c5baef636e93cTed Kremenek#include "ui/aura/window_tracker.h"
204241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ui/compositor/dip_util.h"
214241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "ui/gfx/display.h"
22f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek#include "ui/gfx/screen.h"
234241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
24ede5a4ba111f0590879670b6cb07f4d6d0bd9075Ted Kremeneknamespace ash {
254a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremeneknamespace {
264a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
2763bbe5312cd89ce0ceb684bff68c5baef636e93cTed Kremenek// Return true if the window or its ancestor has |kStayInSameRootWindowkey|
284241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek// property.
294241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenekbool ShouldStayInSameRootWindow(const aura::Window* window) {
304a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  return window &&
314d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek      (window->GetProperty(internal::kStayInSameRootWindowKey) ||
3237d887c6c8e3c653fc581183d012a646d1653f57Ted Kremenek       ShouldStayInSameRootWindow(window->parent()));
3311062b118476368fa5b294954713e5df97d8599fTed Kremenek}
3411062b118476368fa5b294954713e5df97d8599fTed Kremenek
3511062b118476368fa5b294954713e5df97d8599fTed Kremenek// Move all transient children to |dst_root|, including the ones in
36f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek// the child windows and transient children of the transient children.
377d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenekvoid MoveAllTransientChildrenToNewRoot(const gfx::Display& display,
38754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                                       aura::Window* window) {
39daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek  aura::RootWindow* dst_root = Shell::GetInstance()->display_controller()->
4011062b118476368fa5b294954713e5df97d8599fTed Kremenek      GetRootWindowForDisplayId(display.id());
414a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  aura::Window::Windows transient_children = window->transient_children();
424a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  for (aura::Window::Windows::iterator iter = transient_children.begin();
434a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek       iter != transient_children.end(); ++iter) {
444a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    aura::Window* transient_child = *iter;
454d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek    int container_id = transient_child->parent()->id();
46f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek    DCHECK_GE(container_id, 0);
477d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek    aura::Window* container = Shell::GetContainer(dst_root, container_id);
48754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek    gfx::Rect parent_bounds_in_screen = transient_child->GetBoundsInScreen();
49daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek    container->AddChild(transient_child);
5011062b118476368fa5b294954713e5df97d8599fTed Kremenek    transient_child->SetBoundsInScreen(parent_bounds_in_screen, display);
514a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
524c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek    // Transient children may have transient children.
53b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek    MoveAllTransientChildrenToNewRoot(display, transient_child);
544c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek  }
554c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek  // Move transient children of the child windows if any.
56ee98546b0d5f3439c4a590b0d7d1545af794a0ecTed Kremenek  aura::Window::Windows children = window->children();
57596f0a1e54f610926e8bfded9efa1c639f824dedTed Kremenek  for (aura::Window::Windows::iterator iter = children.begin();
58ee98546b0d5f3439c4a590b0d7d1545af794a0ecTed Kremenek       iter != children.end(); ++iter)
59ee98546b0d5f3439c4a590b0d7d1545af794a0ecTed Kremenek    MoveAllTransientChildrenToNewRoot(display, *iter);
60ee98546b0d5f3439c4a590b0d7d1545af794a0ecTed Kremenek}
61ffe0f43806d4823271c2406c1fccc2373115c36aTed Kremenek
62b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek// Finds the root window at |location| in |window|'s coordinates and returns a
63ee98546b0d5f3439c4a590b0d7d1545af794a0ecTed Kremenek// pair of root window and location in that root window's coordinates. The
64ee98546b0d5f3439c4a590b0d7d1545af794a0ecTed Kremenek// function usually returns |window->GetRootWindow()|, but if the mouse pointer
65ee98546b0d5f3439c4a590b0d7d1545af794a0ecTed Kremenek// is moved outside the |window|'s root while the mouse is captured, it returns
66ee98546b0d5f3439c4a590b0d7d1545af794a0ecTed Kremenek// the other root window.
67ee98546b0d5f3439c4a590b0d7d1545af794a0ecTed Kremenekstd::pair<aura::RootWindow*, gfx::Point> GetRootWindowRelativeToWindow(
684c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek    aura::Window* window,
694c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek    const gfx::Point& location) {
704c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek  aura::RootWindow* root_window = window->GetRootWindow();
714c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek  gfx::Point location_in_root(location);
729eb49a40df510313132eef147419c5abefff23ebTed Kremenek  aura::Window::ConvertPointToTarget(window, root_window, &location_in_root);
734c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek
745d5480380d7b7c3590a0283ddf239220e514e576Ted Kremenek#if defined(USE_X11)
754c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek  if (!root_window->ContainsPointInRoot(location_in_root)) {
765d5480380d7b7c3590a0283ddf239220e514e576Ted Kremenek    // This conversion is necessary to deal with X's passive input
774c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek    // grab while dragging window. For example, if we have two
785d5480380d7b7c3590a0283ddf239220e514e576Ted Kremenek    // displays, say 1000x1000 (primary) and 500x500 (extended one
794c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek    // on the right), and start dragging a window at (999, 123), and
80ffe0f43806d4823271c2406c1fccc2373115c36aTed Kremenek    // then move the pointer to the right, the pointer suddenly
814c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek    // warps to the extended display. The destination is (0, 123) in
829eb49a40df510313132eef147419c5abefff23ebTed Kremenek    // the secondary root window's coordinates, or (1000, 123) in
83f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek    // the screen coordinates. However, since the mouse is captured
84b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek    // by X during drag, a weird LocatedEvent, something like (0, 1123)
85ffe0f43806d4823271c2406c1fccc2373115c36aTed Kremenek    // in the *primary* root window's coordinates, is sent to Chrome
86ffe0f43806d4823271c2406c1fccc2373115c36aTed Kremenek    // (Remember that in the native X11 world, the two root windows
87f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek    // are always stacked vertically regardless of the display
88f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek    // layout in Ash). We need to figure out that (0, 1123) in the
89b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek    // primary root window's coordinates is actually (0, 123) in the
90b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek    // extended root window's coordinates.
91f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
92b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek    gfx::Point location_in_native(location_in_root);
934c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek    root_window->ConvertPointToNativeScreen(&location_in_native);
944a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
954a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
964a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    for (size_t i = 0; i < root_windows.size(); ++i) {
974a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      const gfx::Rect native_bounds(
984323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek          root_windows[i]->GetHostOrigin(),
994323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek          root_windows[i]->GetHostSize());  // in px.
1004a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      if (native_bounds.Contains(location_in_native)) {
1014a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        root_window = root_windows[i];
1024c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek        location_in_root = location_in_native;
1034a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        root_window->ConvertPointFromNativeScreen(&location_in_root);
1044a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        break;
1054c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek      }
1064a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    }
1074a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  }
1084323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek#else
1094a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  // TODO(yusukes): Support non-X11 platforms if necessary.
1104a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek#endif
1114a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
112f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek  return std::make_pair(root_window, location_in_root);
11345b8789258b282769b03cbeb68e9f5b0308f067bTed Kremenek}
1144a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
1154a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}  // namespace
116d880c1829395f55129fee31e2df542a475ec3cd7Ted Kremenek
1174a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremeneknamespace internal {
1180f9063c116b7c3b05d8042b5976463c2dae04861Ted Kremenek
1194a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenekvoid ScreenPositionController::ConvertPointToScreen(
1204a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    const aura::Window* window,
1214a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    gfx::Point* point) {
1224a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  const aura::RootWindow* root = window->GetRootWindow();
1230e8a3c743b9b3e3039e329a1736122d3b5b5fed9Ted Kremenek  aura::Window::ConvertPointToTarget(window, root, point);
124f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek  const gfx::Point display_origin = Shell::GetScreen()->GetDisplayNearestWindow(
125ffe0f43806d4823271c2406c1fccc2373115c36aTed Kremenek      const_cast<aura::RootWindow*>(root)).bounds().origin();
1262e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek  point->Offset(display_origin.x(), display_origin.y());
1272e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek}
1282e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek
1292e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenekvoid ScreenPositionController::ConvertPointFromScreen(
1302e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek    const aura::Window* window,
1312e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek    gfx::Point* point) {
1322e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek  const aura::RootWindow* root = window->GetRootWindow();
1332e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek  const gfx::Point display_origin = Shell::GetScreen()->GetDisplayNearestWindow(
1342e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek      const_cast<aura::RootWindow*>(root)).bounds().origin();
1352e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek  point->Offset(-display_origin.x(), -display_origin.y());
1362e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek  aura::Window::ConvertPointToTarget(root, window, point);
1372e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek}
1382e287540c90255e14208e7e5f43f07cb752a1fd7Ted Kremenek
1394a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenekvoid ScreenPositionController::ConvertHostPointToScreen(
1404a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    aura::RootWindow* root_window,
1414a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    gfx::Point* point) {
1424a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  root_window->ConvertPointFromHost(point);
1434a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  std::pair<aura::RootWindow*, gfx::Point> pair =
144e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek      GetRootWindowRelativeToWindow(root_window, *point);
145e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek  *point = pair.second;
1464a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  ConvertPointToScreen(pair.first, point);
1474a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}
1484a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
1494a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenekvoid ScreenPositionController::SetBounds(aura::Window* window,
1504a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                                         const gfx::Rect& bounds,
1514a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                                         const gfx::Display& display) {
1524a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  DCHECK_NE(-1, display.id());
1534a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  if (!window->parent()->GetProperty(internal::kUsesScreenCoordinatesKey)) {
1544a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    window->SetBounds(bounds);
1554323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek    return;
156e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek  }
1574a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
1584a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  // Don't move a window to other root window if:
1594323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek  // a) the window is a transient window. It moves when its
1604323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek  //    transient_parent moves.
1614a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  // b) if the window or its ancestor has kStayInSameRootWindowkey. It's
1624a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  //    intentionally kept in the same root window even if the bounds is
1634a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  //    outside of the display.
1647fa6a4079fd68344e4d38c30f7681b3a7d30fbd1Ted Kremenek  if (!window->transient_parent() &&
1657fa6a4079fd68344e4d38c30f7681b3a7d30fbd1Ted Kremenek      !ShouldStayInSameRootWindow(window)) {
1667fa6a4079fd68344e4d38c30f7681b3a7d30fbd1Ted Kremenek    aura::RootWindow* dst_root =
1674323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek        Shell::GetInstance()->display_controller()->GetRootWindowForDisplayId(
1687fa6a4079fd68344e4d38c30f7681b3a7d30fbd1Ted Kremenek            display.id());
1697fa6a4079fd68344e4d38c30f7681b3a7d30fbd1Ted Kremenek    DCHECK(dst_root);
1707fa6a4079fd68344e4d38c30f7681b3a7d30fbd1Ted Kremenek    aura::Window* dst_container = NULL;
1717fa6a4079fd68344e4d38c30f7681b3a7d30fbd1Ted Kremenek    if (dst_root != window->GetRootWindow()) {
1724a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      int container_id = window->parent()->id();
1737fa6a4079fd68344e4d38c30f7681b3a7d30fbd1Ted Kremenek      // All containers that uses screen coordinates must have valid window ids.
1744a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      DCHECK_GE(container_id, 0);
1754a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      // Don't move modal background.
176a43a1eb6e7c773b79898541794bf819601719493Ted Kremenek      if (!SystemModalContainerLayoutManager::IsModalBackground(window))
177a43a1eb6e7c773b79898541794bf819601719493Ted Kremenek        dst_container = Shell::GetContainer(dst_root, container_id);
178a43a1eb6e7c773b79898541794bf819601719493Ted Kremenek    }
179a43a1eb6e7c773b79898541794bf819601719493Ted Kremenek
1804a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    if (dst_container && window->parent() != dst_container) {
1814a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      aura::Window* focused = aura::client::GetFocusClient(window)->
1823148eb4a75f70f2636075c364d03104223f004d3Ted Kremenek          GetFocusedWindow();
1834a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      aura::client::ActivationClient* activation_client =
1843148eb4a75f70f2636075c364d03104223f004d3Ted Kremenek          aura::client::GetActivationClient(window->GetRootWindow());
1854a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      aura::Window* active = activation_client->GetActiveWindow();
18637d887c6c8e3c653fc581183d012a646d1653f57Ted Kremenek
18737d887c6c8e3c653fc581183d012a646d1653f57Ted Kremenek      aura::WindowTracker tracker;
1884a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      if (focused)
1894a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        tracker.Add(focused);
1904a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      if (active && focused != active)
1914a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        tracker.Add(active);
1924a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
1934a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      dst_container->AddChild(window);
1944a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
1954a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      MoveAllTransientChildrenToNewRoot(display, window);
19637d887c6c8e3c653fc581183d012a646d1653f57Ted Kremenek
19737d887c6c8e3c653fc581183d012a646d1653f57Ted Kremenek      // Restore focused/active window.
1984a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      if (tracker.Contains(focused)) {
1994a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        aura::client::GetFocusClient(window)->FocusWindow(focused);
2004a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        ash::Shell::GetInstance()->set_active_root_window(
2014a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek            focused->GetRootWindow());
2024a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      } else if (tracker.Contains(active)) {
2034a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        activation_client->ActivateWindow(active);
2044a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek      }
2054a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    }
2064a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  }
2074a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
2084241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek  gfx::Point origin(bounds.origin());
2094241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek  const gfx::Point display_origin = Shell::GetScreen()->GetDisplayNearestWindow(
2104d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek      window).bounds().origin();
211f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek  origin.Offset(-display_origin.x(), -display_origin.y());
2127d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek  window->SetBounds(gfx::Rect(origin, bounds.size()));
213754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek}
214daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek
21511062b118476368fa5b294954713e5df97d8599fTed Kremenek}  // internal
2164241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek}  // ash
2174241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek