summaryrefslogtreecommitdiffstats
path: root/ash/display/display_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ash/display/display_manager.cc')
-rw-r--r--ash/display/display_manager.cc35
1 files changed, 30 insertions, 5 deletions
diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc
index 869517c..e257cf8 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);