Chromium Code Reviews| Index: ash/display/display_manager.cc |
| diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc |
| index ce3024f0fb9cfba3b907dce8ea1d05f1be67cda8..775f1f208370f88e1e23ee1920f26d435d460fe6 100644 |
| --- a/ash/display/display_manager.cc |
| +++ b/ash/display/display_manager.cc |
| @@ -358,6 +358,8 @@ void DisplayManager::UpdateDisplays( |
| DisplayInfoList::const_iterator new_info_iter = new_display_info_list.begin(); |
| DisplayList new_displays; |
| + bool update_mouse_location = false; |
| + |
| while (curr_iter != displays_.end() || |
| new_info_iter != new_display_info_list.end()) { |
| if (curr_iter == displays_.end()) { |
| @@ -371,6 +373,7 @@ void DisplayManager::UpdateDisplays( |
| // more displays in current list. |
| removed_displays.push_back(*curr_iter); |
| ++curr_iter; |
| + update_mouse_location = true; |
| } else if (curr_iter->id() == new_info_iter->id()) { |
| const gfx::Display& current_display = *curr_iter; |
| // Copy the info because |CreateDisplayFromInfo| updates the instance. |
| @@ -380,17 +383,27 @@ void DisplayManager::UpdateDisplays( |
| gfx::Display new_display = |
| CreateDisplayFromDisplayInfoById(new_info_iter->id()); |
| const DisplayInfo& new_display_info = GetDisplayInfo(new_display.id()); |
| + |
| + bool host_window_bounds_changed = |
| + current_display_info.bounds_in_pixel() != |
| + new_display_info.bounds_in_pixel(); |
| + |
| // TODO(oshima): Rotating square dislay doesn't work as the size |
| // won't change. This doesn't cause a problem now as there is no |
| // such display. This will be fixed by comparing the rotation as |
| // well when the rotation variable is added to gfx::Display. |
| if (force_bounds_changed_ || |
| - (current_display_info.bounds_in_pixel() != |
| - new_display_info.bounds_in_pixel()) || |
| + host_window_bounds_changed || |
| (current_display.device_scale_factor() != |
| new_display.device_scale_factor()) || |
| (current_display_info.size_in_pixel() != |
| new_display.GetSizeInPixel())) { |
| + |
| + // Don't update mouse location if the display size has |
| + // changed due to rotation or zooming. |
| + if (host_window_bounds_changed) |
| + update_mouse_location = true; |
| + |
| changed_display_indices.push_back(new_displays.size()); |
| } |
| @@ -402,6 +415,7 @@ void DisplayManager::UpdateDisplays( |
| // more displays in current list between ids, which means it is deleted. |
| removed_displays.push_back(*curr_iter); |
| ++curr_iter; |
| + update_mouse_location = true; |
| } else { |
| // more displays in new list between ids, which means it is added. |
| added_display_indices.push_back(new_displays.size()); |
| @@ -420,6 +434,15 @@ void DisplayManager::UpdateDisplays( |
| return; |
| } |
| + DisplayController* display_controller = |
| + Shell::GetInstance()->display_controller(); |
| + gfx::Point native_mouse_location; |
|
Jun Mukai
2013/04/06 03:13:39
mouse_location_in_native would be more consistent?
oshima
2013/04/08 18:00:40
Done.
|
| + // |display_controller| is NULL during the bootstrap. |
| + if (display_controller) { |
| + display_controller->NotifyDisplayConfigurationChanging(); |
| + native_mouse_location = display_controller->GetNativeMouseCursorLocation(); |
| + } |
| + |
| displays_ = new_displays; |
| base::AutoReset<bool> resetter(&change_display_upon_host_resize_, false); |
| @@ -428,11 +451,6 @@ void DisplayManager::UpdateDisplays( |
| // being removed are accessed during shutting down the root. |
| displays_.insert(displays_.end(), removed_displays.begin(), |
| removed_displays.end()); |
| - DisplayController* display_controller = |
| - Shell::GetInstance()->display_controller(); |
| - // |display_controller| is NULL during the bootstrap. |
| - if (display_controller) |
| - display_controller->NotifyDisplayConfigurationChanging(); |
| for (DisplayList::const_reverse_iterator iter = removed_displays.rbegin(); |
| iter != removed_displays.rend(); ++iter) { |
| @@ -447,10 +465,13 @@ void DisplayManager::UpdateDisplays( |
| iter != changed_display_indices.end(); ++iter) { |
| Shell::GetInstance()->screen()->NotifyBoundsChanged(displays_[*iter]); |
| } |
| - if (display_controller) |
| + if (display_controller) { |
| display_controller->NotifyDisplayConfigurationChanged(); |
| - |
| - EnsurePointerInDisplays(); |
| + if (update_mouse_location) |
| + display_controller->EnsurePointerInDisplays(); |
| + else |
| + display_controller->UpdateMouseCursor(native_mouse_location); |
|
Jun Mukai
2013/04/06 03:13:39
Why this needs to be called?
oshima
2013/04/08 18:00:40
Yes, we need to update the cursor when rotated.
|
| + } |
| #if defined(USE_X11) && defined(OS_CHROMEOS) |
| if (!changed_display_indices.empty() && base::chromeos::IsRunningOnChromeOS()) |
| ui::ClearX11DefaultRootWindow(); |
| @@ -655,44 +676,6 @@ void DisplayManager::AddDisplayFromSpec(const std::string& spec) { |
| displays_.push_back(display); |
| } |
| -void DisplayManager::EnsurePointerInDisplays() { |
| - // Don't try to move the pointer during the boot/startup. |
| - if (!DisplayController::HasPrimaryDisplay()) |
| - return; |
| - gfx::Point location_in_screen = Shell::GetScreen()->GetCursorScreenPoint(); |
| - gfx::Point target_location; |
| - int64 closest_distance_squared = -1; |
| - |
| - for (DisplayList::const_iterator iter = displays_.begin(); |
| - iter != displays_.end(); ++iter) { |
| - const gfx::Rect& display_bounds = iter->bounds(); |
| - |
| - if (display_bounds.Contains(location_in_screen)) { |
| - target_location = location_in_screen; |
| - break; |
| - } |
| - gfx::Point center = display_bounds.CenterPoint(); |
| - // Use the distance squared from the center of the dislay. This is not |
| - // exactly "closest" display, but good enough to pick one |
| - // appropriate (and there are at most two displays). |
| - // We don't care about actual distance, only relative to other displays, so |
| - // using the LengthSquared() is cheaper than Length(). |
| - int64 distance_squared = (center - location_in_screen).LengthSquared(); |
| - if (closest_distance_squared < 0 || |
| - closest_distance_squared > distance_squared) { |
| - target_location = center; |
| - closest_distance_squared = distance_squared; |
| - } |
| - } |
| - |
| - aura::RootWindow* root_window = Shell::GetPrimaryRootWindow(); |
| - aura::client::ScreenPositionClient* client = |
| - aura::client::GetScreenPositionClient(root_window); |
| - client->ConvertPointFromScreen(root_window, &target_location); |
| - |
| - root_window->MoveCursorTo(target_location); |
| -} |
| - |
| void DisplayManager::InsertAndUpdateDisplayInfo(const DisplayInfo& new_info) { |
| std::map<int64, DisplayInfo>::iterator info = |
| display_info_.find(new_info.id()); |