| Index: ash/display/display_manager.cc
|
| diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc
|
| index 869517c2c009520400b099a3929b3a605aff292b..e257cf8f0bd95ee83a1c97da1c6e63dc59df7c57 100644
|
| --- a/ash/display/display_manager.cc
|
| +++ b/ash/display/display_manager.cc
|
| @@ -250,6 +250,7 @@ void DisplayManager::SetOverscanInsets(int64 display_id,
|
| iter != displays_.end(); ++iter) {
|
| display_info_list.push_back(GetDisplayInfo(iter->id()));
|
| }
|
| + AddMirrorDisplayInfoIfAny(&display_info_list);
|
| UpdateDisplays(display_info_list);
|
| }
|
|
|
| @@ -260,6 +261,7 @@ void DisplayManager::ClearCustomOverscanInsets(int64 display_id) {
|
| iter != displays_.end(); ++iter) {
|
| display_info_list.push_back(GetDisplayInfo(iter->id()));
|
| }
|
| + AddMirrorDisplayInfoIfAny(&display_info_list);
|
| UpdateDisplays(display_info_list);
|
| }
|
|
|
| @@ -278,6 +280,7 @@ void DisplayManager::SetDisplayRotation(int64 display_id,
|
| }
|
| display_info_list.push_back(info);
|
| }
|
| + AddMirrorDisplayInfoIfAny(&display_info_list);
|
| UpdateDisplays(display_info_list);
|
| }
|
|
|
| @@ -305,6 +308,7 @@ void DisplayManager::SetDisplayUIScale(int64 display_id,
|
| }
|
| display_info_list.push_back(info);
|
| }
|
| + AddMirrorDisplayInfoIfAny(&display_info_list);
|
| UpdateDisplays(display_info_list);
|
| }
|
|
|
| @@ -411,6 +415,7 @@ void DisplayManager::UpdateDisplays() {
|
| iter != displays_.end(); ++iter) {
|
| display_info_list.push_back(GetDisplayInfo(iter->id()));
|
| }
|
| + AddMirrorDisplayInfoIfAny(&display_info_list);
|
| UpdateDisplays(display_info_list);
|
| }
|
|
|
| @@ -432,16 +437,22 @@ void DisplayManager::UpdateDisplays(
|
| bool update_mouse_location = false;
|
|
|
| scoped_ptr<MirrorWindowUpdater> mirror_window_updater;
|
| - // TODO(oshima): We may want to use external as the source.
|
| + // Use the internal display or 1st as the mirror source, then scale
|
| + // the root window so that it matches the external display's
|
| + // resolution. This is necessary in order for scaling to work while
|
| + // mirrored.
|
| int mirrored_display_id = gfx::Display::kInvalidDisplayID;
|
| - if (software_mirroring_enabled_ && updated_display_info_list.size() == 2)
|
| - mirrored_display_id = updated_display_info_list[1].id();
|
| + if (software_mirroring_enabled_ && new_display_info_list.size() == 2)
|
| + mirrored_display_id = new_display_info_list[1].id();
|
|
|
| while (curr_iter != displays_.end() ||
|
| new_info_iter != new_display_info_list.end()) {
|
| if (new_info_iter != new_display_info_list.end() &&
|
| mirrored_display_id == new_info_iter->id()) {
|
| - InsertAndUpdateDisplayInfo(*new_info_iter);
|
| + DisplayInfo info = *new_info_iter;
|
| + info.SetOverscanInsets(true, gfx::Insets());
|
| + InsertAndUpdateDisplayInfo(info);
|
| +
|
| mirrored_display_ = CreateDisplayFromDisplayInfoById(new_info_iter->id());
|
| mirror_window_updater.reset(
|
| new MirrorWindowCreator(display_info_[new_info_iter->id()]));
|
| @@ -557,6 +568,7 @@ void DisplayManager::UpdateDisplays(
|
| iter != changed_display_indices.end(); ++iter) {
|
| Shell::GetInstance()->screen()->NotifyBoundsChanged(displays_[*iter]);
|
| }
|
| + mirror_window_updater.reset();
|
| display_controller->NotifyDisplayConfigurationChanged();
|
| if (update_mouse_location)
|
| display_controller->EnsurePointerInDisplays();
|
| @@ -648,7 +660,7 @@ const gfx::Display& DisplayManager::GetDisplayMatching(
|
| const DisplayInfo& DisplayManager::GetDisplayInfo(int64 display_id) const {
|
| std::map<int64, DisplayInfo>::const_iterator iter =
|
| display_info_.find(display_id);
|
| - CHECK(iter != display_info_.end());
|
| + CHECK(iter != display_info_.end()) << display_id;
|
| return iter->second;
|
| }
|
|
|
| @@ -708,6 +720,7 @@ void DisplayManager::AddRemoveDisplay() {
|
| "%d+%d-500x400", host_bounds.x(), host_bounds.bottom())));
|
| }
|
| num_connected_displays_ = new_display_info_list.size();
|
| + mirrored_display_ = gfx::Display();
|
| UpdateDisplays(new_display_info_list);
|
| }
|
|
|
| @@ -721,6 +734,7 @@ void DisplayManager::ToggleDisplayScaleFactor() {
|
| display_info.device_scale_factor() == 1.0f ? 2.0f : 1.0f);
|
| new_display_info_list.push_back(display_info);
|
| }
|
| + AddMirrorDisplayInfoIfAny(&new_display_info_list);
|
| UpdateDisplays(new_display_info_list);
|
| }
|
|
|
| @@ -732,9 +746,14 @@ void DisplayManager::OnRootWindowResized(const aura::RootWindow* root,
|
| display_info_[display.id()].SetBounds(
|
| gfx::Rect(root->GetHostOrigin(), root->GetHostSize()));
|
| const gfx::Size& new_root_size = root->bounds().size();
|
| + // It's tricky to support resizing mirror window on desktop.
|
| + if (software_mirroring_enabled_ && mirrored_display_.id() == display.id())
|
| + return;
|
| if (old_size != new_root_size) {
|
| display.SetSize(display_info_[display.id()].size_in_pixel());
|
| Shell::GetInstance()->screen()->NotifyBoundsChanged(display);
|
| + Shell::GetInstance()->mirror_window_controller()->
|
| + UpdateWindow();
|
| }
|
| }
|
| }
|
| @@ -798,6 +817,12 @@ gfx::Display& DisplayManager::FindDisplayForId(int64 id) {
|
| return GetInvalidDisplay();
|
| }
|
|
|
| +void DisplayManager::AddMirrorDisplayInfoIfAny(
|
| + std::vector<DisplayInfo>* display_info_list) {
|
| + if (software_mirroring_enabled_ && mirrored_display_.is_valid())
|
| + display_info_list->push_back(GetDisplayInfo(mirrored_display_.id()));
|
| +}
|
| +
|
| void DisplayManager::AddDisplayFromSpec(const std::string& spec) {
|
| DisplayInfo display_info = DisplayInfo::CreateFromSpec(spec);
|
| InsertAndUpdateDisplayInfo(display_info);
|
|
|