Index: ash/display/display_manager.cc |
diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc |
index 08eb87ffb5172e1e9bda281688ca987b9d6ee146..90be1bd1caeeb3bbcf306d5844e1b6f19c8e7d31 100644 |
--- a/ash/display/display_manager.cc |
+++ b/ash/display/display_manager.cc |
@@ -345,7 +345,7 @@ void DisplayManager::SetLayoutForCurrentDisplays( |
screen_ash_->NotifyMetricsChanged( |
ScreenUtil::GetSecondaryDisplay(), |
gfx::DisplayObserver::DISPLAY_METRIC_BOUNDS | |
- gfx::DisplayObserver::DISPLAY_METRIC_WORK_AREA); |
+ gfx::DisplayObserver::DISPLAY_METRIC_WORK_AREA); |
if (delegate_) |
delegate_->PostDisplayConfigurationChange(); |
} |
@@ -838,6 +838,9 @@ void DisplayManager::UpdateDisplays( |
++new_info_iter; |
} |
} |
+ gfx::Display old_primary; |
+ if (delegate_) |
+ old_primary = screen_ash_->GetPrimaryDisplay(); |
// Clear focus if the display has been removed, but don't clear focus if |
// the destkop has been moved from one display to another |
@@ -903,11 +906,40 @@ void DisplayManager::UpdateDisplays( |
screen_ash_->NotifyDisplayAdded(displays_[*iter]); |
} |
+ bool notify_primary_change = |
+ delegate_ ? old_primary.id() != screen_->GetPrimaryDisplay().id() : false; |
+ |
for (std::map<size_t, uint32_t>::iterator iter = display_changes.begin(); |
iter != display_changes.end(); |
++iter) { |
- screen_ash_->NotifyMetricsChanged(displays_[iter->first], iter->second); |
+ uint32_t metrics = iter->second; |
+ const gfx::Display& updated_display = displays_[iter->first]; |
+ |
+ if (notify_primary_change && |
+ updated_display.id() == screen_->GetPrimaryDisplay().id()) { |
+ metrics |= gfx::DisplayObserver::DISPLAY_METRIC_PRIMARY; |
+ notify_primary_change = false; |
+ } |
+ screen_ash_->NotifyMetricsChanged(updated_display, metrics); |
} |
+ |
+ if (notify_primary_change) { |
+ // This happens when a primary display has moved to anther display without |
+ // bounds change. |
+ const gfx::Display& primary = screen_->GetPrimaryDisplay(); |
+ if (primary.id() != old_primary.id()) { |
+ uint32_t metrics = gfx::DisplayObserver::DISPLAY_METRIC_PRIMARY; |
+ if (primary.size() != old_primary.size()) { |
+ metrics |= (gfx::DisplayObserver::DISPLAY_METRIC_BOUNDS | |
+ gfx::DisplayObserver::DISPLAY_METRIC_WORK_AREA); |
+ } |
+ if (primary.device_scale_factor() != old_primary.device_scale_factor()) |
+ metrics |= gfx::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR; |
+ |
+ screen_ash_->NotifyMetricsChanged(primary, metrics); |
+ } |
+ } |
+ |
if (delegate_) |
delegate_->PostDisplayConfigurationChange(); |