Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(339)

Side by Side Diff: ui/display/chromeos/display_change_observer.cc

Issue 2524863003: Move DisplayChangeObserver + tests from ash to ui. (Closed)
Patch Set: Replace with static method. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/display/display_change_observer_chromeos.h" 5 #include "ui/display/chromeos/display_change_observer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
11 #include <utility> 11 #include <utility>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "ui/base/user_activity/user_activity_detector.h"
16 #include "ui/display/chromeos/touchscreen_util.h" 15 #include "ui/display/chromeos/touchscreen_util.h"
17 #include "ui/display/display.h" 16 #include "ui/display/display.h"
18 #include "ui/display/manager/display_layout.h" 17 #include "ui/display/manager/display_layout.h"
19 #include "ui/display/manager/display_layout_store.h" 18 #include "ui/display/manager/display_layout_store.h"
20 #include "ui/display/manager/display_manager.h" 19 #include "ui/display/manager/display_manager.h"
21 #include "ui/display/manager/display_manager_utilities.h" 20 #include "ui/display/manager/display_manager_utilities.h"
22 #include "ui/display/types/display_mode.h" 21 #include "ui/display/types/display_mode.h"
23 #include "ui/display/types/display_snapshot.h" 22 #include "ui/display/types/display_snapshot.h"
24 #include "ui/display/util/display_util.h" 23 #include "ui/display/util/display_util.h"
25 #include "ui/events/devices/input_device_manager.h" 24 #include "ui/events/devices/input_device_manager.h"
26 #include "ui/events/devices/touchscreen_device.h" 25 #include "ui/events/devices/touchscreen_device.h"
27 26
28 namespace ash { 27 namespace display {
29 28
30 using ui::DisplayConfigurator; 29 using ui::DisplayConfigurator;
31 30
32 namespace { 31 namespace {
33 32
34 // 1 inch in mm. 33 // 1 inch in mm.
35 const float kInchInMm = 25.4f; 34 const float kInchInMm = 25.4f;
36 35
37 // The minimum pixel width whose monitor can be called as '4K'. 36 // The minimum pixel width whose monitor can be called as '4K'.
38 const int kMinimumWidthFor4K = 3840; 37 const int kMinimumWidthFor4K = 3840;
39 38
40 // The list of device scale factors (in addition to 1.0f) which is 39 // The list of device scale factors (in addition to 1.0f) which is
41 // available in external large monitors. 40 // available in external large monitors.
42 const float kAdditionalDeviceScaleFactorsFor4k[] = {1.25f, 2.0f}; 41 const float kAdditionalDeviceScaleFactorsFor4k[] = {1.25f, 2.0f};
43 42
44 void UpdateInternalDisplayId( 43 void UpdateInternalDisplayId(
45 const ui::DisplayConfigurator::DisplayStateList& display_states) { 44 const ui::DisplayConfigurator::DisplayStateList& display_states) {
46 for (auto* state : display_states) { 45 for (auto* state : display_states) {
47 if (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) { 46 if (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) {
48 if (display::Display::HasInternalDisplay()) 47 if (Display::HasInternalDisplay())
49 DCHECK_EQ(display::Display::InternalDisplayId(), state->display_id()); 48 DCHECK_EQ(Display::InternalDisplayId(), state->display_id());
50 display::Display::SetInternalDisplayId(state->display_id()); 49 Display::SetInternalDisplayId(state->display_id());
51 } 50 }
52 } 51 }
53 } 52 }
54 53
55 } // namespace 54 } // namespace
56 55
57 // static 56 // static
58 display::ManagedDisplayInfo::ManagedDisplayModeList 57 ManagedDisplayInfo::ManagedDisplayModeList
59 DisplayChangeObserver::GetInternalManagedDisplayModeList( 58 DisplayChangeObserver::GetInternalManagedDisplayModeList(
60 const display::ManagedDisplayInfo& display_info, 59 const ManagedDisplayInfo& display_info,
61 const ui::DisplaySnapshot& output) { 60 const ui::DisplaySnapshot& output) {
62 const ui::DisplayMode* ui_native_mode = output.native_mode(); 61 const ui::DisplayMode* ui_native_mode = output.native_mode();
63 scoped_refptr<display::ManagedDisplayMode> native_mode = 62 scoped_refptr<ManagedDisplayMode> native_mode = new ManagedDisplayMode(
64 new display::ManagedDisplayMode(ui_native_mode->size(), 63 ui_native_mode->size(), ui_native_mode->refresh_rate(),
65 ui_native_mode->refresh_rate(), 64 ui_native_mode->is_interlaced(), true, 1.0,
66 ui_native_mode->is_interlaced(), true, 65 display_info.device_scale_factor());
67 1.0, display_info.device_scale_factor());
68 66
69 return display::CreateInternalManagedDisplayModeList(native_mode); 67 return CreateInternalManagedDisplayModeList(native_mode);
70 } 68 }
71 69
72 // static 70 // static
73 display::ManagedDisplayInfo::ManagedDisplayModeList 71 ManagedDisplayInfo::ManagedDisplayModeList
74 DisplayChangeObserver::GetExternalManagedDisplayModeList( 72 DisplayChangeObserver::GetExternalManagedDisplayModeList(
75 const ui::DisplaySnapshot& output) { 73 const ui::DisplaySnapshot& output) {
76 using DisplayModeMap = 74 using DisplayModeMap =
77 std::map<std::pair<int, int>, scoped_refptr<display::ManagedDisplayMode>>; 75 std::map<std::pair<int, int>, scoped_refptr<ManagedDisplayMode>>;
78 DisplayModeMap display_mode_map; 76 DisplayModeMap display_mode_map;
79 77
80 scoped_refptr<display::ManagedDisplayMode> native_mode = 78 scoped_refptr<ManagedDisplayMode> native_mode = new ManagedDisplayMode();
81 new display::ManagedDisplayMode();
82 for (const auto& mode_info : output.modes()) { 79 for (const auto& mode_info : output.modes()) {
83 const std::pair<int, int> size(mode_info->size().width(), 80 const std::pair<int, int> size(mode_info->size().width(),
84 mode_info->size().height()); 81 mode_info->size().height());
85 scoped_refptr<display::ManagedDisplayMode> display_mode = 82 scoped_refptr<ManagedDisplayMode> display_mode = new ManagedDisplayMode(
86 new display::ManagedDisplayMode( 83 mode_info->size(), mode_info->refresh_rate(),
87 mode_info->size(), mode_info->refresh_rate(), 84 mode_info->is_interlaced(), output.native_mode() == mode_info.get(),
88 mode_info->is_interlaced(), output.native_mode() == mode_info.get(), 85 1.0, 1.0);
89 1.0, 1.0);
90 if (display_mode->native()) 86 if (display_mode->native())
91 native_mode = display_mode; 87 native_mode = display_mode;
92 88
93 // Add the display mode if it isn't already present and override interlaced 89 // Add the display mode if it isn't already present and override interlaced
94 // display modes with non-interlaced ones. 90 // display modes with non-interlaced ones.
95 auto display_mode_it = display_mode_map.find(size); 91 auto display_mode_it = display_mode_map.find(size);
96 if (display_mode_it == display_mode_map.end()) 92 if (display_mode_it == display_mode_map.end())
97 display_mode_map.insert(std::make_pair(size, display_mode)); 93 display_mode_map.insert(std::make_pair(size, display_mode));
98 else if (display_mode_it->second->is_interlaced() && 94 else if (display_mode_it->second->is_interlaced() &&
99 !display_mode->is_interlaced()) 95 !display_mode->is_interlaced())
100 display_mode_it->second = std::move(display_mode); 96 display_mode_it->second = std::move(display_mode);
101 } 97 }
102 98
103 display::ManagedDisplayInfo::ManagedDisplayModeList display_mode_list; 99 ManagedDisplayInfo::ManagedDisplayModeList display_mode_list;
104 for (const auto& display_mode_pair : display_mode_map) 100 for (const auto& display_mode_pair : display_mode_map)
105 display_mode_list.push_back(std::move(display_mode_pair.second)); 101 display_mode_list.push_back(std::move(display_mode_pair.second));
106 102
107 if (output.native_mode()) { 103 if (output.native_mode()) {
108 const std::pair<int, int> size(native_mode->size().width(), 104 const std::pair<int, int> size(native_mode->size().width(),
109 native_mode->size().height()); 105 native_mode->size().height());
110 auto it = display_mode_map.find(size); 106 auto it = display_mode_map.find(size);
111 DCHECK(it != display_mode_map.end()) 107 DCHECK(it != display_mode_map.end())
112 << "Native mode must be part of the mode list."; 108 << "Native mode must be part of the mode list.";
113 109
114 // If the native mode was replaced re-add it. 110 // If the native mode was replaced re-add it.
115 if (!it->second->native()) 111 if (!it->second->native())
116 display_mode_list.push_back(native_mode); 112 display_mode_list.push_back(native_mode);
117 } 113 }
118 114
119 if (native_mode->size().width() >= kMinimumWidthFor4K) { 115 if (native_mode->size().width() >= kMinimumWidthFor4K) {
120 for (size_t i = 0; i < arraysize(kAdditionalDeviceScaleFactorsFor4k); ++i) { 116 for (size_t i = 0; i < arraysize(kAdditionalDeviceScaleFactorsFor4k); ++i) {
121 scoped_refptr<display::ManagedDisplayMode> mode = 117 scoped_refptr<ManagedDisplayMode> mode = new ManagedDisplayMode(
122 new display::ManagedDisplayMode( 118 native_mode->size(), native_mode->refresh_rate(),
123 native_mode->size(), native_mode->refresh_rate(), 119 native_mode->is_interlaced(), false /* native */,
124 native_mode->is_interlaced(), false /* native */, 120 native_mode->ui_scale(), kAdditionalDeviceScaleFactorsFor4k[i]);
125 native_mode->ui_scale(), kAdditionalDeviceScaleFactorsFor4k[i]);
126 display_mode_list.push_back(mode); 121 display_mode_list.push_back(mode);
127 } 122 }
128 } 123 }
129 124
130 return display_mode_list; 125 return display_mode_list;
131 } 126 }
132 127
133 DisplayChangeObserver::DisplayChangeObserver( 128 DisplayChangeObserver::DisplayChangeObserver(
134 std::unique_ptr<display::DisplayStringProvider> string_provider) 129 std::unique_ptr<DisplayStringProvider> string_provider)
135 : string_provider_(std::move(string_provider)) { 130 : string_provider_(std::move(string_provider)) {
136 ui::InputDeviceManager::GetInstance()->AddObserver(this); 131 ui::InputDeviceManager::GetInstance()->AddObserver(this);
137 } 132 }
138 133
139 DisplayChangeObserver::~DisplayChangeObserver() { 134 DisplayChangeObserver::~DisplayChangeObserver() {
140 ui::InputDeviceManager::GetInstance()->RemoveObserver(this); 135 ui::InputDeviceManager::GetInstance()->RemoveObserver(this);
141 } 136 }
142 137
143 ui::MultipleDisplayState DisplayChangeObserver::GetStateForDisplayIds( 138 ui::MultipleDisplayState DisplayChangeObserver::GetStateForDisplayIds(
144 const ui::DisplayConfigurator::DisplayStateList& display_states) const { 139 const ui::DisplayConfigurator::DisplayStateList& display_states) const {
145 UpdateInternalDisplayId(display_states); 140 UpdateInternalDisplayId(display_states);
146 if (display_states.size() == 1) 141 if (display_states.size() == 1)
147 return ui::MULTIPLE_DISPLAY_STATE_SINGLE; 142 return ui::MULTIPLE_DISPLAY_STATE_SINGLE;
148 display::DisplayIdList list = display::GenerateDisplayIdList( 143 DisplayIdList list =
149 display_states.begin(), display_states.end(), 144 GenerateDisplayIdList(display_states.begin(), display_states.end(),
150 [](const ui::DisplaySnapshot* display_state) { 145 [](const ui::DisplaySnapshot* display_state) {
151 return display_state->display_id(); 146 return display_state->display_id();
152 }); 147 });
153 148
154 const display::DisplayLayout& layout = 149 const DisplayLayout& layout =
155 display_manager_->layout_store()->GetRegisteredDisplayLayout(list); 150 display_manager_->layout_store()->GetRegisteredDisplayLayout(list);
156 return layout.mirrored ? ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR 151 return layout.mirrored ? ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR
157 : ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED; 152 : ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED;
158 } 153 }
159 154
160 bool DisplayChangeObserver::GetResolutionForDisplayId(int64_t display_id, 155 bool DisplayChangeObserver::GetResolutionForDisplayId(int64_t display_id,
161 gfx::Size* size) const { 156 gfx::Size* size) const {
162 scoped_refptr<display::ManagedDisplayMode> mode = 157 scoped_refptr<ManagedDisplayMode> mode =
163 display_manager_->GetSelectedModeForDisplayId(display_id); 158 display_manager_->GetSelectedModeForDisplayId(display_id);
164 if (!mode) 159 if (!mode)
165 return false; 160 return false;
166 *size = mode->size(); 161 *size = mode->size();
167 return true; 162 return true;
168 } 163 }
169 164
170 void DisplayChangeObserver::OnDisplayModeChanged( 165 void DisplayChangeObserver::OnDisplayModeChanged(
171 const ui::DisplayConfigurator::DisplayStateList& display_states) { 166 const ui::DisplayConfigurator::DisplayStateList& display_states) {
172 UpdateInternalDisplayId(display_states); 167 UpdateInternalDisplayId(display_states);
173 168
174 std::vector<display::ManagedDisplayInfo> displays; 169 std::vector<ManagedDisplayInfo> displays;
175 std::set<int64_t> ids; 170 std::set<int64_t> ids;
176 for (const ui::DisplaySnapshot* state : display_states) { 171 for (const ui::DisplaySnapshot* state : display_states) {
177 const ui::DisplayMode* mode_info = state->current_mode(); 172 const ui::DisplayMode* mode_info = state->current_mode();
178 if (!mode_info) 173 if (!mode_info)
179 continue; 174 continue;
180 175
181 float device_scale_factor = 1.0f; 176 float device_scale_factor = 1.0f;
182 // Sets dpi only if the screen size is not blacklisted. 177 // Sets dpi only if the screen size is not blacklisted.
183 float dpi = display::IsDisplaySizeBlackListed(state->physical_size()) 178 float dpi = IsDisplaySizeBlackListed(state->physical_size())
184 ? 0 179 ? 0
185 : kInchInMm * mode_info->size().width() / 180 : kInchInMm * mode_info->size().width() /
186 state->physical_size().width(); 181 state->physical_size().width();
187 if (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) { 182 if (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) {
188 if (dpi) 183 if (dpi)
189 device_scale_factor = FindDeviceScaleFactor(dpi); 184 device_scale_factor = FindDeviceScaleFactor(dpi);
190 } else { 185 } else {
191 scoped_refptr<display::ManagedDisplayMode> mode = 186 scoped_refptr<ManagedDisplayMode> mode =
192 display_manager_->GetSelectedModeForDisplayId(state->display_id()); 187 display_manager_->GetSelectedModeForDisplayId(state->display_id());
193 if (mode) { 188 if (mode) {
194 device_scale_factor = mode->device_scale_factor(); 189 device_scale_factor = mode->device_scale_factor();
195 } else { 190 } else {
196 // For monitors that are 40 inches and 4K or above, set 191 // For monitors that are 40 inches and 4K or above, set
197 // |device_scale_factor| to 2x. For margin purposes, 100 is subtracted 192 // |device_scale_factor| to 2x. For margin purposes, 100 is subtracted
198 // from the value of |k2xThreshouldSizeSquaredFor4KInMm| 193 // from the value of |k2xThreshouldSizeSquaredFor4KInMm|
199 const int k2xThreshouldSizeSquaredFor4KInMm = 194 const int k2xThreshouldSizeSquaredFor4KInMm =
200 (40 * 40 * kInchInMm * kInchInMm) - 100; 195 (40 * 40 * kInchInMm * kInchInMm) - 100;
201 gfx::Vector2d size_in_vec(state->physical_size().width(), 196 gfx::Vector2d size_in_vec(state->physical_size().width(),
(...skipping 20 matching lines...) Expand all
222 name = state->display_name(); 217 name = state->display_name();
223 } 218 }
224 219
225 if (name.empty()) 220 if (name.empty())
226 name = string_provider_->GetUnknownDisplayNameString(); 221 name = string_provider_->GetUnknownDisplayNameString();
227 222
228 bool has_overscan = state->has_overscan(); 223 bool has_overscan = state->has_overscan();
229 int64_t id = state->display_id(); 224 int64_t id = state->display_id();
230 ids.insert(id); 225 ids.insert(id);
231 226
232 displays.push_back(display::ManagedDisplayInfo(id, name, has_overscan)); 227 displays.push_back(ManagedDisplayInfo(id, name, has_overscan));
233 display::ManagedDisplayInfo& new_info = displays.back(); 228 ManagedDisplayInfo& new_info = displays.back();
234 new_info.set_sys_path(state->sys_path()); 229 new_info.set_sys_path(state->sys_path());
235 new_info.set_device_scale_factor(device_scale_factor); 230 new_info.set_device_scale_factor(device_scale_factor);
236 new_info.SetBounds(display_bounds); 231 new_info.SetBounds(display_bounds);
237 new_info.set_native(true); 232 new_info.set_native(true);
238 new_info.set_is_aspect_preserving_scaling( 233 new_info.set_is_aspect_preserving_scaling(
239 state->is_aspect_preserving_scaling()); 234 state->is_aspect_preserving_scaling());
240 if (dpi) 235 if (dpi)
241 new_info.set_device_dpi(dpi); 236 new_info.set_device_dpi(dpi);
242 237
243 display::ManagedDisplayInfo::ManagedDisplayModeList display_modes = 238 ManagedDisplayInfo::ManagedDisplayModeList display_modes =
244 (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL) 239 (state->type() == ui::DISPLAY_CONNECTION_TYPE_INTERNAL)
245 ? GetInternalManagedDisplayModeList(new_info, *state) 240 ? GetInternalManagedDisplayModeList(new_info, *state)
246 : GetExternalManagedDisplayModeList(*state); 241 : GetExternalManagedDisplayModeList(*state);
247 new_info.SetManagedDisplayModes(display_modes); 242 new_info.SetManagedDisplayModes(display_modes);
248 243
249 new_info.set_available_color_profiles( 244 new_info.set_available_color_profiles(
250 display_configurator_->GetAvailableColorCalibrationProfiles(id)); 245 display_configurator_->GetAvailableColorCalibrationProfiles(id));
251 new_info.set_maximum_cursor_size(state->maximum_cursor_size()); 246 new_info.set_maximum_cursor_size(state->maximum_cursor_size());
252 } 247 }
253 248
254 display::AssociateTouchscreens( 249 AssociateTouchscreens(
255 &displays, 250 &displays,
256 ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices()); 251 ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices());
257 display_manager_->OnNativeDisplaysChanged(displays); 252 display_manager_->OnNativeDisplaysChanged(displays);
258 253
259 // For the purposes of user activity detection, ignore synthetic mouse events 254 // For the purposes of user activity detection, ignore synthetic mouse events
260 // that are triggered by screen resizes: http://crbug.com/360634 255 // that are triggered by screen resizes: http://crbug.com/360634
261 ui::UserActivityDetector* user_activity_detector = 256 if (!display_changing_callback_.is_null())
262 ui::UserActivityDetector::Get(); 257 display_changing_callback_.Run();
263 if (user_activity_detector)
264 user_activity_detector->OnDisplayPowerChanging();
265 } 258 }
266 259
267 void DisplayChangeObserver::OnDisplayModeChangeFailed( 260 void DisplayChangeObserver::OnDisplayModeChangeFailed(
268 const ui::DisplayConfigurator::DisplayStateList& displays, 261 const ui::DisplayConfigurator::DisplayStateList& displays,
269 ui::MultipleDisplayState failed_new_state) { 262 ui::MultipleDisplayState failed_new_state) {
270 // If display configuration failed during startup, simply update the display 263 // If display configuration failed during startup, simply update the display
271 // manager with detected displays. If no display is detected, it will 264 // manager with detected displays. If no display is detected, it will
272 // create a pseudo display. 265 // create a pseudo display.
273 if (display_manager_->GetNumDisplays() == 0) 266 if (display_manager_->GetNumDisplays() == 0)
274 OnDisplayModeChanged(displays); 267 OnDisplayModeChanged(displays);
275 } 268 }
276 269
277 void DisplayChangeObserver::OnTouchscreenDeviceConfigurationChanged() { 270 void DisplayChangeObserver::OnTouchscreenDeviceConfigurationChanged() {
278 OnDisplayModeChanged(display_configurator_->cached_displays()); 271 OnDisplayModeChanged(display_configurator_->cached_displays());
279 } 272 }
280 273
281 // static 274 // static
282 float DisplayChangeObserver::FindDeviceScaleFactor(float dpi) { 275 float DisplayChangeObserver::FindDeviceScaleFactor(float dpi) {
283 if (dpi > 200.0f) 276 if (dpi > 200.0f)
284 return 2.0f; 277 return 2.0f;
285 else if (dpi > 150.0f) 278 else if (dpi > 150.0f)
286 return 1.25f; 279 return 1.25f;
287 else 280 else
288 return 1.0f; 281 return 1.0f;
289 } 282 }
290 283
291 } // namespace ash 284 } // namespace display
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698