Skip to content

Commit bba2d99

Browse files
mitoshimaCommit bot
authored and
Commit bot
committed
Save and restore unified mode
BUG=489809 TEST=DisplayPreferenceTest.SaveUnifiedMode/RestoreUnifiedMode Committed: https://crrev.com/b83c400b39840d0c18bd113559ea0040eb3c6b46 Cr-Commit-Position: refs/heads/master@{#331076} Review URL: https://codereview.chromium.org/1150913002 Cr-Commit-Position: refs/heads/master@{#331149}
1 parent 942991b commit bba2d99

17 files changed

+216
-43
lines changed

ash/display/display_controller.cc

+4-1
Original file line numberDiff line numberDiff line change
@@ -844,7 +844,10 @@ void DisplayController::PostDisplayConfigurationChange() {
844844
DisplayLayoutStore* layout_store = display_manager->layout_store();
845845
if (display_manager->num_connected_displays() > 1) {
846846
DisplayIdPair pair = display_manager->GetCurrentDisplayIdPair();
847-
layout_store->UpdateMirrorStatus(pair, display_manager->IsInMirrorMode());
847+
layout_store->UpdateMultiDisplayState(
848+
pair, display_manager->IsInMirrorMode(),
849+
display_manager->default_multi_display_mode() ==
850+
DisplayManager::UNIFIED);
848851

849852
if (Shell::GetScreen()->GetNumDisplays() > 1 ) {
850853
DisplayLayout layout = layout_store->GetRegisteredDisplayLayout(pair);

ash/display/display_layout.cc

+9-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const int kMaxValidOffset = 10000;
2424
const char kPositionKey[] = "position";
2525
const char kOffsetKey[] = "offset";
2626
const char kMirroredKey[] = "mirrored";
27+
const char kDefaultUnifiedKey[] = "default_unified";
2728
const char kPrimaryIdKey[] = "primary-id";
2829

2930
typedef std::map<DisplayLayout::Position, std::string> PositionToStringMap;
@@ -69,13 +70,15 @@ DisplayLayout::DisplayLayout()
6970
: position(RIGHT),
7071
offset(0),
7172
mirrored(false),
73+
default_unified(false),
7274
primary_id(gfx::Display::kInvalidDisplayID) {
7375
}
7476

7577
DisplayLayout::DisplayLayout(DisplayLayout::Position position, int offset)
7678
: position(position),
7779
offset(offset),
7880
mirrored(false),
81+
default_unified(false),
7982
primary_id(gfx::Display::kInvalidDisplayID) {
8083
DCHECK_LE(TOP, position);
8184
DCHECK_GE(LEFT, position);
@@ -127,15 +130,16 @@ bool DisplayLayout::ConvertToValue(const DisplayLayout& layout,
127130
dict_value->SetString(kPositionKey, position_str);
128131
dict_value->SetInteger(kOffsetKey, layout.offset);
129132
dict_value->SetBoolean(kMirroredKey, layout.mirrored);
133+
dict_value->SetBoolean(kDefaultUnifiedKey, layout.default_unified);
130134
dict_value->SetString(kPrimaryIdKey, base::Int64ToString(layout.primary_id));
131135
return true;
132136
}
133137

134138
std::string DisplayLayout::ToString() const {
135139
const std::string position_str = GetStringFromPosition(position);
136-
return base::StringPrintf(
137-
"%s, %d%s",
138-
position_str.c_str(), offset, mirrored ? ", mirrored" : "");
140+
return base::StringPrintf("%s, %d%s%s", position_str.c_str(), offset,
141+
mirrored ? ", mirrored" : "",
142+
default_unified ? ", unified" : "");
139143
}
140144

141145
// static
@@ -145,6 +149,8 @@ void DisplayLayout::RegisterJSONConverter(
145149
kPositionKey, &DisplayLayout::position, &GetPositionFromString);
146150
converter->RegisterIntField(kOffsetKey, &DisplayLayout::offset);
147151
converter->RegisterBoolField(kMirroredKey, &DisplayLayout::mirrored);
152+
converter->RegisterBoolField(kDefaultUnifiedKey,
153+
&DisplayLayout::default_unified);
148154
converter->RegisterCustomField<int64>(
149155
kPrimaryIdKey, &DisplayLayout::primary_id, &GetDisplayIdFromString);
150156
}

ash/display/display_layout.h

+3
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ struct ASH_EXPORT DisplayLayout {
5959
// True if displays are mirrored.
6060
bool mirrored;
6161

62+
// True if multi displays should default to unified mode.
63+
bool default_unified;
64+
6265
// The id of the display used as a primary display.
6366
int64 primary_id;
6467

ash/display/display_layout_store.cc

+9-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
#include "ash/ash_switches.h"
88
#include "ash/display/display_layout_store.h"
9+
#include "ash/display/display_manager.h"
10+
#include "ash/shell.h"
911
#include "base/command_line.h"
1012
#include "base/logging.h"
1113
#include "ui/gfx/display.h"
@@ -67,11 +69,13 @@ DisplayLayout DisplayLayoutStore::ComputeDisplayLayoutForDisplayIdPair(
6769
pair.first == layout.primary_id) ? layout : layout.Invert();
6870
}
6971

70-
void DisplayLayoutStore::UpdateMirrorStatus(const DisplayIdPair& pair,
71-
bool mirrored) {
72+
void DisplayLayoutStore::UpdateMultiDisplayState(const DisplayIdPair& pair,
73+
bool mirrored,
74+
bool default_unified) {
7275
if (paired_layouts_.find(pair) == paired_layouts_.end())
7376
CreateDisplayLayout(pair);
7477
paired_layouts_[pair].mirrored = mirrored;
78+
paired_layouts_[pair].default_unified = default_unified;
7579
}
7680

7781
void DisplayLayoutStore::UpdatePrimaryDisplayId(const DisplayIdPair& pair,
@@ -84,6 +88,9 @@ void DisplayLayoutStore::UpdatePrimaryDisplayId(const DisplayIdPair& pair,
8488
DisplayLayout DisplayLayoutStore::CreateDisplayLayout(
8589
const DisplayIdPair& pair) {
8690
DisplayLayout layout = default_display_layout_;
91+
layout.default_unified =
92+
Shell::GetInstance()->display_manager()->default_multi_display_mode() ==
93+
DisplayManager::UNIFIED;
8794
layout.primary_id = pair.first;
8895
paired_layouts_[pair] = layout;
8996
return layout;

ash/display/display_layout_store.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ class ASH_EXPORT DisplayLayoutStore {
3737
DisplayLayout ComputeDisplayLayoutForDisplayIdPair(
3838
const DisplayIdPair& display_pair);
3939

40-
// Update the mirrored flag in the display layout for
40+
// Update the multi display state in the display layout for
4141
// |display_pair|. This creates new display layout if no layout is
4242
// registered for |display_pair|.
43-
void UpdateMirrorStatus(const DisplayIdPair& display_pair,
44-
bool mirrored);
43+
void UpdateMultiDisplayState(const DisplayIdPair& display_pair,
44+
bool mirrored,
45+
bool default_unified);
4546

4647
// Update the |primary_id| in the display layout for
4748
// |display_pair|. This creates new display layout if no layout is

ash/display/display_manager.cc

+21-3
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,6 @@ DisplayManager::DisplayManager()
140140
if (base::SysInfo::IsRunningOnChromeOS())
141141
DisplayInfo::SetUse125DSFForUIScaling(true);
142142

143-
if (switches::UnifiedDesktopEnabled())
144-
default_multi_display_mode_ = UNIFIED;
145-
146143
change_display_upon_host_resize_ = !base::SysInfo::IsRunningOnChromeOS();
147144
#endif
148145
gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_ALTERNATE, screen_.get());
@@ -641,13 +638,34 @@ void DisplayManager::OnNativeDisplaysChanged(
641638
if (gfx::Display::HasInternalDisplay() && !internal_display_connected &&
642639
display_info_.find(gfx::Display::InternalDisplayId()) ==
643640
display_info_.end()) {
641+
// Create a dummy internal display if the chrome restarted
642+
// in docked mode.
644643
DisplayInfo internal_display_info(
645644
gfx::Display::InternalDisplayId(),
646645
l10n_util::GetStringUTF8(IDS_ASH_INTERNAL_DISPLAY_NAME),
647646
false /*Internal display must not have overscan */);
648647
internal_display_info.SetBounds(gfx::Rect(0, 0, 800, 600));
649648
display_info_[gfx::Display::InternalDisplayId()] = internal_display_info;
650649
}
650+
651+
#if defined(OS_CHROMEOS)
652+
if (new_display_info_list.size() > 1) {
653+
std::sort(new_display_info_list.begin(), new_display_info_list.end(),
654+
DisplayInfoSortFunctor());
655+
DisplayIdPair pair = std::make_pair(new_display_info_list[0].id(),
656+
new_display_info_list[1].id());
657+
DisplayLayout layout = layout_store_->GetRegisteredDisplayLayout(pair);
658+
default_multi_display_mode_ =
659+
(layout.default_unified && switches::UnifiedDesktopEnabled())
660+
? UNIFIED
661+
: EXTENDED;
662+
// Mirror mode is set by DisplayConfigurator on the device.
663+
// Emulate it when running on linux desktop.
664+
if (!base::SysInfo::IsRunningOnChromeOS() && layout.mirrored)
665+
SetMultiDisplayMode(MIRRORING);
666+
}
667+
#endif
668+
651669
UpdateDisplays(new_display_info_list);
652670
}
653671

ash/display/display_manager_unittest.cc

+6
Original file line numberDiff line numberDiff line change
@@ -1463,6 +1463,8 @@ TEST_F(DisplayManagerTest, MAYBE_UpdateDisplayWithHostOrigin) {
14631463
TEST_F(DisplayManagerTest, UnifiedDesktopBasic) {
14641464
if (!SupportsMultipleDisplays())
14651465
return;
1466+
test::DisplayManagerTestApi::EnableUnifiedDesktopForTest();
1467+
14661468
// Don't check root window destruction in unified mode.
14671469
Shell::GetPrimaryRootWindow()->RemoveObserver(this);
14681470

@@ -1517,6 +1519,8 @@ TEST_F(DisplayManagerTest, ConfigureUnifiedTwice) {
15171519
TEST_F(DisplayManagerTest, RotateUnifiedDesktop) {
15181520
if (!SupportsMultipleDisplays())
15191521
return;
1522+
test::DisplayManagerTestApi::EnableUnifiedDesktopForTest();
1523+
15201524
// Don't check root window destruction in unified mode.
15211525
Shell::GetPrimaryRootWindow()->RemoveObserver(this);
15221526

@@ -1544,6 +1548,8 @@ TEST_F(DisplayManagerTest, RotateUnifiedDesktop) {
15441548
TEST_F(DisplayManagerTest, UnifiedWithDockWindows) {
15451549
if (!SupportsMultipleDisplays())
15461550
return;
1551+
test::DisplayManagerTestApi::EnableUnifiedDesktopForTest();
1552+
15471553
// Don't check root window destruction in unified mode.
15481554
Shell::GetPrimaryRootWindow()->RemoveObserver(this);
15491555

ash/display/unified_mouse_warp_controller_unittest.cc

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class UnifiedMouseWarpControllerTest : public test::AshTestBase {
2424

2525
void SetUp() override {
2626
test::AshTestBase::SetUp();
27+
test::DisplayManagerTestApi::EnableUnifiedDesktopForTest();
2728
DisplayManager* display_manager = Shell::GetInstance()->display_manager();
2829
display_manager->SetDefaultMultiDisplayMode(DisplayManager::UNIFIED);
2930
display_manager->SetMultiDisplayMode(DisplayManager::UNIFIED);

ash/magnifier/magnification_controller_unittest.cc

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "ash/display/display_manager.h"
88
#include "ash/shell.h"
99
#include "ash/test/ash_test_base.h"
10+
#include "ash/test/display_manager_test_api.h"
1011
#include "base/strings/stringprintf.h"
1112
#include "ui/aura/client/aura_constants.h"
1213
#include "ui/aura/env.h"
@@ -587,6 +588,7 @@ TEST_F(MagnificationControllerTest, FollowTextInputFieldKeyPress) {
587588
TEST_F(MagnificationControllerTest, EnableMagnifierInUnifiedDesktop) {
588589
if (!SupportsMultipleDisplays())
589590
return;
591+
test::DisplayManagerTestApi::EnableUnifiedDesktopForTest();
590592

591593
DisplayManager* display_manager = Shell::GetInstance()->display_manager();
592594
display_manager->SetDefaultMultiDisplayMode(DisplayManager::UNIFIED);

ash/root_window_controller_unittest.cc

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "ash/shell_window_ids.h"
1212
#include "ash/system/tray/system_tray_delegate.h"
1313
#include "ash/test/ash_test_base.h"
14+
#include "ash/test/display_manager_test_api.h"
1415
#include "ash/wm/system_modal_container_layout_manager.h"
1516
#include "ash/wm/window_properties.h"
1617
#include "ash/wm/window_state.h"
@@ -294,6 +295,8 @@ TEST_F(RootWindowControllerTest, MoveWindows_Modal) {
294295
TEST_F(RootWindowControllerTest, MoveWindows_LockWindowsInUnified) {
295296
if (!SupportsMultipleDisplays())
296297
return;
298+
test::DisplayManagerTestApi::EnableUnifiedDesktopForTest();
299+
297300
DisplayManager* display_manager = Shell::GetInstance()->display_manager();
298301
display_manager->SetDefaultMultiDisplayMode(DisplayManager::UNIFIED);
299302
display_manager->SetMultiDisplayMode(DisplayManager::UNIFIED);

ash/screen_util_unittest.cc

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "ash/shelf/shelf_widget.h"
1111
#include "ash/shell.h"
1212
#include "ash/test/ash_test_base.h"
13+
#include "ash/test/display_manager_test_api.h"
1314
#include "ash/wm/window_util.h"
1415
#include "ui/aura/env.h"
1516
#include "ui/aura/window.h"
@@ -116,6 +117,8 @@ TEST_F(ScreenUtilTest, ConvertRect) {
116117
TEST_F(ScreenUtilTest, ShelfDisplayBoundsInUnifiedDesktop) {
117118
if (!SupportsMultipleDisplays())
118119
return;
120+
test::DisplayManagerTestApi::EnableUnifiedDesktopForTest();
121+
119122
DisplayManager* display_manager = Shell::GetInstance()->display_manager();
120123
display_manager->SetDefaultMultiDisplayMode(DisplayManager::UNIFIED);
121124
display_manager->SetMultiDisplayMode(DisplayManager::UNIFIED);

ash/shell.cc

+1-3
Original file line numberDiff line numberDiff line change
@@ -486,11 +486,9 @@ void Shell::RemoveShellObserver(ShellObserver* observer) {
486486

487487
#if defined(OS_CHROMEOS)
488488
bool Shell::ShouldSaveDisplaySettings() {
489-
// TODO(oshima): Allow saving the settings even in unified desktop mode.
490489
return !(screen_orientation_controller_
491490
->ignore_display_configuration_updates() ||
492-
resolution_notification_controller_->DoesNotificationTimeout()) &&
493-
!switches::UnifiedDesktopEnabled();
491+
resolution_notification_controller_->DoesNotificationTimeout());
494492
}
495493
#endif
496494

ash/system/chromeos/tray_display_unittest.cc

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "ash/shell.h"
1111
#include "ash/system/tray/system_tray.h"
1212
#include "ash/test/ash_test_base.h"
13+
#include "ash/test/display_manager_test_api.h"
1314
#include "ash/test/test_system_tray_delegate.h"
1415
#include "base/strings/string16.h"
1516
#include "base/strings/string_util.h"
@@ -313,6 +314,7 @@ TEST_F(TrayDisplayTest, InternalDisplayResized) {
313314
CheckAccessibleName();
314315

315316
// Unified mode
317+
test::DisplayManagerTestApi::EnableUnifiedDesktopForTest();
316318
display_manager->SetDefaultMultiDisplayMode(DisplayManager::UNIFIED);
317319
display_manager->SetMultiDisplayMode(DisplayManager::UNIFIED);
318320
UpdateDisplay("300x200,400x500");

ash/test/display_manager_test_api.cc

+10
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66

77
#include <vector>
88

9+
#include "ash/ash_switches.h"
910
#include "ash/display/display_info.h"
1011
#include "ash/display/display_manager.h"
1112
#include "ash/display/display_util.h"
1213
#include "ash/display/extended_mouse_warp_controller.h"
1314
#include "ash/display/mouse_cursor_event_filter.h"
1415
#include "ash/display/unified_mouse_warp_controller.h"
1516
#include "ash/shell.h"
17+
#include "base/command_line.h"
1618
#include "base/strings/string_split.h"
1719
#include "ui/aura/env.h"
1820
#include "ui/aura/window_event_dispatcher.h"
@@ -92,6 +94,14 @@ bool DisplayManagerTestApi::TestIfMouseWarpsAt(
9294
}
9395
}
9496

97+
// static
98+
void DisplayManagerTestApi::EnableUnifiedDesktopForTest() {
99+
#if defined(OS_CHROMEOS)
100+
base::CommandLine::ForCurrentProcess()->AppendSwitch(
101+
switches::kAshEnableUnifiedDesktop);
102+
#endif
103+
}
104+
95105
DisplayManagerTestApi::DisplayManagerTestApi(DisplayManager* display_manager)
96106
: display_manager_(display_manager) {}
97107

ash/test/display_manager_test_api.h

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class DisplayManagerTestApi {
3333
static bool TestIfMouseWarpsAt(ui::test::EventGenerator& event_generator,
3434
const gfx::Point& point_in_screen);
3535

36+
static void EnableUnifiedDesktopForTest();
37+
3638
explicit DisplayManagerTestApi(DisplayManager* display_manager);
3739
virtual ~DisplayManagerTestApi();
3840

chrome/browser/chromeos/display/display_preferences.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "base/strings/string_number_conversions.h"
1616
#include "base/strings/string_split.h"
1717
#include "base/strings/string_util.h"
18+
#include "base/sys_info.h"
1819
#include "base/values.h"
1920
#include "chrome/browser/browser_process.h"
2021
#include "chrome/common/pref_names.h"
@@ -227,8 +228,7 @@ void StoreDisplayLayoutPref(const ash::DisplayIdPair& pair,
227228
void StoreCurrentDisplayLayoutPrefs() {
228229
ash::DisplayManager* display_manager = GetDisplayManager();
229230
if (!UserCanSaveDisplayPreference() ||
230-
display_manager->num_connected_displays() < 2 ||
231-
display_manager->IsInUnifiedMode()) {
231+
display_manager->num_connected_displays() < 2) {
232232
return;
233233
}
234234

0 commit comments

Comments
 (0)