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