Commit f10c9e62 authored by Weidong Guo's avatar Weidong Guo Committed by Commit Bot

Fix mirror mode restoring after resume

Background:
Upon suspend, DisplayManager::SetSoftwareMirroring(true) will be called to
clear current mirroring source and destination displays. But mirror mode
is not enabled because DisplayManager::OnNativeDisplaysChanged() will
receive empty display info and stop before reconfiguration. Later upon
resume, mirror mode will not be restored because the mirror info is cleared.

Changes:
Prevent DisplayManager::SetSoftwareMirroring(true) from clearing the
mirroring source and destination displays as they will be cleared later
in DisplayManager::OnNativeDisplaysChanged().

Bug: 797016
Change-Id: I3b987e5bc13a72313f5273262e96ed26b7ca347c
Reviewed-on: https://chromium-review.googlesource.com/857548
Commit-Queue: Weidong Guo <weidongg@chromium.org>
Reviewed-by: default avatarMitsuru Oshima <oshima@chromium.org>
Cr-Commit-Position: refs/heads/master@{#532505}
parent 9f04a28e
...@@ -4405,4 +4405,32 @@ TEST_F(DisplayManagerTest, MixedMirrorModeRestore) { ...@@ -4405,4 +4405,32 @@ TEST_F(DisplayManagerTest, MixedMirrorModeRestore) {
EXPECT_EQ(first_display_id, destination_ids[0]); EXPECT_EQ(first_display_id, destination_ids[0]);
} }
TEST_F(DisplayManagerTest, MirrorModeRestoreAfterResume) {
const int64_t internal_display_id =
display::test::DisplayManagerTestApi(display_manager())
.SetFirstDisplayAsInternalDisplay();
constexpr int64_t external_display_id = 210000001;
std::vector<display::ManagedDisplayInfo> display_info_list;
display_info_list.emplace_back(display::CreateDisplayInfo(
internal_display_id, gfx::Rect(0, 0, 100, 100)));
display_info_list.emplace_back(display::CreateDisplayInfo(
external_display_id, gfx::Rect(1, 1, 500, 500)));
// Turn on mirror mode.
display_manager()->OnNativeDisplaysChanged(display_info_list);
display_manager()->SetMirrorMode(display::MirrorMode::kNormal, base::nullopt);
EXPECT_TRUE(display_manager()->IsInMirrorMode());
// Suspend.
display_manager()->SetMultiDisplayMode(display::DisplayManager::MIRRORING);
display_manager()->OnNativeDisplaysChanged(
std::vector<display::ManagedDisplayInfo>());
EXPECT_TRUE(display_manager()->IsInMirrorMode());
// Resume.
display_manager()->SetMultiDisplayMode(display::DisplayManager::MIRRORING);
display_manager()->OnNativeDisplaysChanged(display_info_list);
EXPECT_TRUE(display_manager()->IsInMirrorMode());
}
} // namespace ash } // namespace ash
...@@ -867,17 +867,17 @@ void DisplayManager::OnNativeDisplaysChanged( ...@@ -867,17 +867,17 @@ void DisplayManager::OnNativeDisplaysChanged(
[](const ManagedDisplayInfo& display_info) { [](const ManagedDisplayInfo& display_info) {
return display_info.id(); return display_info.id();
}); });
multi_display_mode_ = (base::CommandLine::ForCurrentProcess()->HasSwitch( bool should_enable_software_mirroring =
::switches::kEnableSoftwareMirroring) || base::CommandLine::ForCurrentProcess()->HasSwitch(
ShouldSetMirrorModeOn(list)) ::switches::kEnableSoftwareMirroring) ||
? MIRRORING ShouldSetMirrorModeOn(list);
: EXTENDED; SetSoftwareMirroring(should_enable_software_mirroring);
} }
#endif #endif
// Do not clear current mirror state before calling ShouldSetMirrorModeOn() // Do not clear current mirror state before calling ShouldSetMirrorModeOn()
// as it depends on the state. // as it depends on the state.
software_mirroring_display_list_.clear(); ClearMirroringSourceAndDestination();
hardware_mirroring_display_id_list_ = hardware_mirroring_display_id_list; hardware_mirroring_display_id_list_ = hardware_mirroring_display_id_list;
mirroring_source_id_ = mirroring_source_id; mirroring_source_id_ = mirroring_source_id;
num_connected_displays_ = updated_displays.size(); num_connected_displays_ = updated_displays.size();
...@@ -1517,7 +1517,6 @@ void DisplayManager::SetDefaultMultiDisplayModeForCurrentDisplays( ...@@ -1517,7 +1517,6 @@ void DisplayManager::SetDefaultMultiDisplayModeForCurrentDisplays(
void DisplayManager::SetMultiDisplayMode(MultiDisplayMode mode) { void DisplayManager::SetMultiDisplayMode(MultiDisplayMode mode) {
multi_display_mode_ = mode; multi_display_mode_ = mode;
ClearMirroringSourceAndDestination();
} }
void DisplayManager::ReconfigureDisplays() { void DisplayManager::ReconfigureDisplays() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment