Index: ash/display/display_controller.cc |
diff --git a/ash/display/display_controller.cc b/ash/display/display_controller.cc |
index 7a3b6f9959daef8f7b0067eec767a425a89924be..132d68a47cec845d0e11f10751edf285517566d9 100644 |
--- a/ash/display/display_controller.cc |
+++ b/ash/display/display_controller.cc |
@@ -39,6 +39,7 @@ |
#include "ui/compositor/compositor_vsync_manager.h" |
#include "ui/gfx/display.h" |
#include "ui/gfx/screen.h" |
+#include "ui/wm/core/coordinate_conversion.h" |
#include "ui/wm/public/activation_client.h" |
#if defined(OS_CHROMEOS) |
@@ -569,18 +570,39 @@ void DisplayController::EnsurePointerInDisplays() { |
if (closest_distance_squared < 0 || |
closest_distance_squared > distance_squared) { |
aura::Window* root_window = GetRootWindowForDisplayId(display.id()); |
- aura::client::ScreenPositionClient* client = |
- aura::client::GetScreenPositionClient(root_window); |
- client->ConvertPointFromScreen(root_window, ¢er); |
+ ::wm::ConvertPointFromScreen(root_window, ¢er); |
root_window->GetHost()->ConvertPointToNativeScreen(¢er); |
dst_root_window = root_window; |
target_location_in_native = center; |
closest_distance_squared = distance_squared; |
} |
} |
+ |
+ gfx::Point target_location_in_root = target_location_in_native; |
dst_root_window->GetHost()->ConvertPointFromNativeScreen( |
- &target_location_in_native); |
- dst_root_window->MoveCursorTo(target_location_in_native); |
+ &target_location_in_root); |
+ |
+#if defined(USE_OZONE) |
+ gfx::Point target_location_in_screen = target_location_in_root; |
+ ::wm::ConvertPointToScreen(dst_root_window, &target_location_in_root); |
Jun Mukai
2015/02/18 23:14:21
&target_location_in_screen?
pkotwicz
2015/02/19 01:01:17
Thanks for noticing!
|
+ |
+ // Do not move the cursor if the cursor's location did not change. This avoids |
+ // moving (and showing) the cursor on startup. |
+ // |cursor_location_in_native_coords_for_restore_| may refer to a different |
+ // display than when it was set. This occurs when swapping the primary |
+ // display. Ozone takes care of moving the cursor in this case. |
+ if (target_location_in_native != |
+ cursor_location_in_native_coords_for_restore_ || |
+ target_location_in_screen != |
+ cursor_location_in_screen_coords_for_restore_) { |
Jun Mukai
2015/02/18 23:14:21
EnsurePointerInDisplay ensures mouse left outside
pkotwicz
2015/02/19 01:01:17
In some cases we still need to call WindowTreeHost
Jun Mukai
2015/02/19 01:50:06
Aah, right. thanks.
|
+ dst_root_window->MoveCursorTo(target_location_in_root); |
+ } |
+#else |
+ // X11 does not move the cursor if |
+ // |cursor_location_in_native_coords_for_restore_| refers to a different |
+ // display than when it was set. |
+ dst_root_window->MoveCursorTo(target_location_in_root); |
+#endif |
} |
bool DisplayController::UpdateWorkAreaOfDisplayNearestWindow( |
@@ -713,14 +735,14 @@ void DisplayController::PreDisplayConfigurationChange(bool clear_focus) { |
focus_activation_store_->Store(clear_focus); |
gfx::Screen* screen = Shell::GetScreen(); |
gfx::Point point_in_screen = screen->GetCursorScreenPoint(); |
+ cursor_location_in_screen_coords_for_restore_ = point_in_screen; |
+ |
+ gfx::Point point_in_native = point_in_screen; |
gfx::Display display = screen->GetDisplayNearestPoint(point_in_screen); |
aura::Window* root_window = GetRootWindowForDisplayId(display.id()); |
- |
- aura::client::ScreenPositionClient* client = |
- aura::client::GetScreenPositionClient(root_window); |
- client->ConvertPointFromScreen(root_window, &point_in_screen); |
- root_window->GetHost()->ConvertPointToNativeScreen(&point_in_screen); |
- cursor_location_in_native_coords_for_restore_ = point_in_screen; |
+ ::wm::ConvertPointFromScreen(root_window, &point_in_native); |
+ root_window->GetHost()->ConvertPointToNativeScreen(&point_in_native); |
+ cursor_location_in_native_coords_for_restore_ = point_in_native; |
} |
void DisplayController::PostDisplayConfigurationChange() { |