Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "ash/wm/coordinate_conversion.h" | |
|
sky
2012/08/03 17:07:18
Can this file be moved to aura?
Yusuke Sato
2012/08/03 23:18:45
I think it's difficult right now since Aura does n
| |
| 6 | |
| 7 #include "ash/display/display_controller.h" | |
| 8 #include "ash/shell.h" | |
| 9 #include "ui/aura/root_window.h" | |
| 10 #include "ui/gfx/display.h" | |
| 11 #include "ui/gfx/point.h" | |
| 12 #include "ui/gfx/rect.h" | |
| 13 #include "ui/gfx/screen.h" | |
| 14 | |
| 15 namespace ash { | |
| 16 namespace wm { | |
| 17 | |
| 18 aura::RootWindow* GetRootWindowAt(const gfx::Point& point) { | |
| 19 const gfx::Display& display = gfx::Screen::GetDisplayNearestPoint(point); | |
| 20 return Shell::GetInstance()->display_controller()-> | |
| 21 GetRootWindowForDisplayId(display.id()); | |
| 22 } | |
| 23 | |
| 24 aura::RootWindow* GetRootWindowMatching(const gfx::Rect& rect) { | |
| 25 const gfx::Display& display = gfx::Screen::GetDisplayMatching(rect); | |
| 26 return Shell::GetInstance()->display_controller()-> | |
| 27 GetRootWindowForDisplayId(display.id()); | |
| 28 } | |
| 29 | |
| 30 std::pair<aura::RootWindow*, gfx::Point> GetRootWindowRelativeToWindow( | |
| 31 aura::Window* window, const gfx::Point& location) { | |
|
sky
2012/08/03 17:07:18
nit: wrap location to next line.
Yusuke Sato
2012/08/03 23:18:45
Done.
| |
| 32 aura::RootWindow* root_window = window->GetRootWindow(); | |
| 33 gfx::Point location_in_root(location); | |
| 34 aura::Window::ConvertPointToWindow(window, root_window, &location_in_root); | |
| 35 | |
| 36 #if defined(USE_X11) | |
| 37 // This conversion is necessary for dealing with the "pointer warp" feature in | |
| 38 // ash/display/display_controller.cc. For example, if we have two displays, | |
| 39 // say 1000x1000 (primary) and 500x500 (extended one on the right), and start | |
| 40 // dragging a window at (999, 123), and then move the cursor to the right, the | |
| 41 // cursor suddenly warps to the extended display. The destination is (0, 123) | |
| 42 // in the secondary root window's coordinates, or (1000, 123) in the screen | |
| 43 // coordinates. However, since the mouse cursor is captured during drag, a | |
| 44 // weird LocatedEvent, something like (0, 1123) in the *primary* root window's | |
| 45 // coordinates, is sent to Chrome (Remember that in the native X11 world, the | |
| 46 // two root windows are always stacked vertically regardless of the display | |
| 47 // layout in Ash). We need to figure out that (0, 1123) in the primary root | |
| 48 // window's coordinates is actually (0, 123) in the extended root window's | |
| 49 // coordinates. | |
| 50 if (!root_window->ContainsPointInRoot(location_in_root)) { | |
| 51 gfx::Point location_in_native = location_in_root; | |
| 52 root_window->ConvertPointToNativeScreen(&location_in_native); | |
| 53 | |
| 54 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); | |
| 55 for (size_t i = 0; i < root_windows.size(); ++i) { | |
| 56 gfx::Point native_origin = root_windows[i]->bounds().origin(); | |
| 57 root_windows[i]->ConvertPointToNativeScreen(&native_origin); | |
| 58 gfx::Rect native_bounds = root_windows[i]->bounds(); | |
| 59 native_bounds.set_origin(native_origin); | |
| 60 if (native_bounds.Contains(location_in_native)) { | |
| 61 root_window = root_windows[i]; | |
| 62 location_in_root = location_in_native; | |
| 63 location_in_root.Offset(-native_bounds.x(), -native_bounds.y()); | |
| 64 break; | |
| 65 } | |
| 66 } | |
| 67 } | |
| 68 #else | |
| 69 // TODO(yusukes): Support non-X11 platforms if necessary. | |
| 70 #endif | |
| 71 | |
| 72 return std::make_pair(root_window, location_in_root); | |
| 73 } | |
| 74 | |
| 75 } // namespace wm | |
| 76 } // namespace ash | |
| OLD | NEW |