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

Side by Side Diff: ash/display/display_manager.cc

Issue 11417121: Undo all existing overscan settings before updating to a new overscan settings (2nd) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 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 | Annotate | Revision Log
« no previous file with comments | « ash/display/display_manager.h ('k') | ash/display/display_manager_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_manager.h" 5 #include "ash/display/display_manager.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "ash/display/display_controller.h" 10 #include "ash/display/display_controller.h"
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 iter != displays_.end(); ++iter) { 137 iter != displays_.end(); ++iter) {
138 const gfx::Display& display = *iter; 138 const gfx::Display& display = *iter;
139 if (display.bounds().Contains(point_in_screen)) 139 if (display.bounds().Contains(point_in_screen))
140 return display; 140 return display;
141 } 141 }
142 return GetInvalidDisplay(); 142 return GetInvalidDisplay();
143 } 143 }
144 144
145 void DisplayManager::SetOverscanInsets(int64 display_id, 145 void DisplayManager::SetOverscanInsets(int64 display_id,
146 const gfx::Insets& insets_in_dip) { 146 const gfx::Insets& insets_in_dip) {
147 display_info_[display_id].overscan_insets_in_dip = insets_in_dip;
148
149 // Copies the |displays_| because UpdateDisplays() compares the passed
150 // displays and its internal |displays_|.
147 DisplayList displays = displays_; 151 DisplayList displays = displays_;
148 std::map<int64, gfx::Insets>::const_iterator old_overscan = 152 UpdateDisplays(displays);
149 overscan_mapping_.find(display_id);
150 if (old_overscan != overscan_mapping_.end()) {
151 gfx::Insets old_insets = old_overscan->second;
152 for (DisplayList::iterator iter = displays.begin();
153 iter != displays.end(); ++iter) {
154 if (iter->id() == display_id) {
155 // Undo the existing insets before applying the new insets.
156 gfx::Rect bounds = iter->bounds_in_pixel();
157 bounds.Inset(old_insets.Scale(-iter->device_scale_factor()));
158 iter->SetScaleAndBounds(iter->device_scale_factor(), bounds);
159 break;
160 }
161 }
162 }
163 overscan_mapping_[display_id] = insets_in_dip;
164 OnNativeDisplaysChanged(displays);
165 } 153 }
166 154
167 gfx::Insets DisplayManager::GetOverscanInsets(int64 display_id) const { 155 gfx::Insets DisplayManager::GetOverscanInsets(int64 display_id) const {
168 std::map<int64, gfx::Insets>::const_iterator it = 156 std::map<int64, DisplayInfo>::const_iterator it =
169 overscan_mapping_.find(display_id); 157 display_info_.find(display_id);
170 return (it != overscan_mapping_.end()) ? it->second : gfx::Insets(); 158 return (it != display_info_.end()) ?
159 it->second.overscan_insets_in_dip : gfx::Insets();
171 } 160 }
172 161
173 void DisplayManager::OnNativeDisplaysChanged( 162 void DisplayManager::OnNativeDisplaysChanged(
174 const std::vector<gfx::Display>& updated_displays) { 163 const std::vector<gfx::Display>& updated_displays) {
175 if (updated_displays.empty()) { 164 if (updated_displays.empty()) {
176 // Don't update the displays when all displays are disconnected. 165 // Don't update the displays when all displays are disconnected.
177 // This happens when: 166 // This happens when:
178 // - the device is idle and powerd requested to turn off all displays. 167 // - the device is idle and powerd requested to turn off all displays.
179 // - the device is suspended. (kernel turns off all displays) 168 // - the device is suspended. (kernel turns off all displays)
180 // - the internal display's brightness is set to 0 and no external 169 // - the internal display's brightness is set to 0 and no external
(...skipping 23 matching lines...) Expand all
204 if (!internal_display_.get()) { 193 if (!internal_display_.get()) {
205 internal_display_.reset(new gfx::Display(internal_display_id_, 194 internal_display_.reset(new gfx::Display(internal_display_id_,
206 gfx::Rect(800, 600))); 195 gfx::Rect(800, 600)));
207 } 196 }
208 new_displays.push_back(*internal_display_.get()); 197 new_displays.push_back(*internal_display_.get());
209 } 198 }
210 } else { 199 } else {
211 new_displays = updated_displays; 200 new_displays = updated_displays;
212 } 201 }
213 202
203 for (DisplayList::const_iterator iter = new_displays.begin();
204 iter != new_displays.end(); ++iter) {
205 std::map<int64, DisplayInfo>::iterator info =
206 display_info_.find(iter->id());
207 if (info != display_info_.end()) {
208 info->second.original_bounds_in_pixel = iter->bounds_in_pixel();
209 } else {
210 display_info_[iter->id()].original_bounds_in_pixel =
211 iter->bounds_in_pixel();
212 }
213 }
214
215 UpdateDisplays(new_displays);
216 RefreshDisplayNames();
217 }
218
219 void DisplayManager::UpdateDisplays(
220 const std::vector<gfx::Display>& updated_displays) {
221 DisplayList new_displays = updated_displays;
222
214 for (DisplayList::iterator iter = new_displays.begin(); 223 for (DisplayList::iterator iter = new_displays.begin();
215 iter != new_displays.end(); ++iter) { 224 iter != new_displays.end(); ++iter) {
216 std::map<int64, gfx::Insets>::const_iterator overscan_insets = 225 std::map<int64, DisplayInfo>::const_iterator info =
217 overscan_mapping_.find(iter->id()); 226 display_info_.find(iter->id());
218 if (overscan_insets != overscan_mapping_.end()) { 227 if (info != display_info_.end()) {
219 gfx::Rect bounds = iter->bounds_in_pixel(); 228 gfx::Rect bounds = info->second.original_bounds_in_pixel;
220 bounds.Inset(overscan_insets->second.Scale(iter->device_scale_factor())); 229 bounds.Inset(info->second.overscan_insets_in_dip.Scale(
230 iter->device_scale_factor()));
221 iter->SetScaleAndBounds(iter->device_scale_factor(), bounds); 231 iter->SetScaleAndBounds(iter->device_scale_factor(), bounds);
222 } 232 }
223 } 233 }
224 234
225 std::sort(displays_.begin(), displays_.end(), DisplaySortFunctor()); 235 std::sort(displays_.begin(), displays_.end(), DisplaySortFunctor());
226 std::sort(new_displays.begin(), new_displays.end(), DisplaySortFunctor()); 236 std::sort(new_displays.begin(), new_displays.end(), DisplaySortFunctor());
227 DisplayList removed_displays; 237 DisplayList removed_displays;
228 std::vector<size_t> changed_display_indices; 238 std::vector<size_t> changed_display_indices;
229 std::vector<size_t> added_display_indices; 239 std::vector<size_t> added_display_indices;
230 gfx::Display current_primary; 240 gfx::Display current_primary;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 284
275 // Do not update |displays_| if there's nothing to be updated. Without this, 285 // Do not update |displays_| if there's nothing to be updated. Without this,
276 // it will not update the display layout, which causes the bug 286 // it will not update the display layout, which causes the bug
277 // http://crbug.com/155948. 287 // http://crbug.com/155948.
278 if (changed_display_indices.empty() && added_display_indices.empty() && 288 if (changed_display_indices.empty() && added_display_indices.empty() &&
279 removed_displays.empty()) { 289 removed_displays.empty()) {
280 return; 290 return;
281 } 291 }
282 292
283 displays_ = new_displays; 293 displays_ = new_displays;
284 RefreshDisplayNames();
285 294
286 // Temporarily add displays to be removed because display object 295 // Temporarily add displays to be removed because display object
287 // being removed are accessed during shutting down the root. 296 // being removed are accessed during shutting down the root.
288 displays_.insert(displays_.end(), removed_displays.begin(), 297 displays_.insert(displays_.end(), removed_displays.begin(),
289 removed_displays.end()); 298 removed_displays.end());
290 for (std::vector<size_t>::iterator iter = changed_display_indices.begin(); 299 for (std::vector<size_t>::iterator iter = changed_display_indices.begin();
291 iter != changed_display_indices.end(); ++iter) { 300 iter != changed_display_indices.end(); ++iter) {
292 Shell::GetInstance()->screen()->NotifyBoundsChanged(displays_[*iter]); 301 Shell::GetInstance()->screen()->NotifyBoundsChanged(displays_[*iter]);
293 } 302 }
294 for (std::vector<size_t>::iterator iter = added_display_indices.begin(); 303 for (std::vector<size_t>::iterator iter = added_display_indices.begin();
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 } 381 }
373 // Fallback to the primary display if there is no matching display. 382 // Fallback to the primary display if there is no matching display.
374 return matching ? *matching : DisplayController::GetPrimaryDisplay(); 383 return matching ? *matching : DisplayController::GetPrimaryDisplay();
375 } 384 }
376 385
377 std::string DisplayManager::GetDisplayNameFor( 386 std::string DisplayManager::GetDisplayNameFor(
378 const gfx::Display& display) { 387 const gfx::Display& display) {
379 if (!display.is_valid()) 388 if (!display.is_valid())
380 return l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME); 389 return l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME);
381 390
382 std::map<int64, std::string>::const_iterator iter = 391 std::map<int64, DisplayInfo>::const_iterator iter =
383 display_names_.find(display.id()); 392 display_info_.find(display.id());
384 if (iter != display_names_.end()) 393 if (iter != display_info_.end())
385 return iter->second; 394 return iter->second.name;
386 395
387 return base::StringPrintf("Display %d", static_cast<int>(display.id())); 396 return base::StringPrintf("Display %d", static_cast<int>(display.id()));
388 } 397 }
389 398
390 void DisplayManager::OnRootWindowResized(const aura::RootWindow* root, 399 void DisplayManager::OnRootWindowResized(const aura::RootWindow* root,
391 const gfx::Size& old_size) { 400 const gfx::Size& old_size) {
392 if (!aura::UseFullscreenHostWindow()) { 401 if (!aura::UseFullscreenHostWindow()) {
393 gfx::Display& display = FindDisplayForRootWindow(root); 402 gfx::Display& display = FindDisplayForRootWindow(root);
394 if (display.size() != root->GetHostSize()) { 403 if (display.size() != root->GetHostSize()) {
395 display.SetSize(root->GetHostSize()); 404 display.SetSize(root->GetHostSize());
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 537
529 aura::RootWindow* root_window = Shell::GetPrimaryRootWindow(); 538 aura::RootWindow* root_window = Shell::GetPrimaryRootWindow();
530 aura::client::ScreenPositionClient* client = 539 aura::client::ScreenPositionClient* client =
531 aura::client::GetScreenPositionClient(root_window); 540 aura::client::GetScreenPositionClient(root_window);
532 client->ConvertPointFromScreen(root_window, &target_location); 541 client->ConvertPointFromScreen(root_window, &target_location);
533 542
534 root_window->MoveCursorTo(target_location); 543 root_window->MoveCursorTo(target_location);
535 } 544 }
536 545
537 void DisplayManager::RefreshDisplayNames() { 546 void DisplayManager::RefreshDisplayNames() {
538 display_names_.clear();
539
540 #if defined(OS_CHROMEOS) 547 #if defined(OS_CHROMEOS)
541 if (!base::chromeos::IsRunningOnChromeOS()) 548 if (!base::chromeos::IsRunningOnChromeOS())
542 return; 549 return;
543 #endif 550 #endif
544 551
545 #if defined(USE_X11) 552 #if defined(USE_X11)
546 std::vector<XID> outputs; 553 std::vector<XID> outputs;
547 if (!ui::GetOutputDeviceHandles(&outputs)) 554 if (!ui::GetOutputDeviceHandles(&outputs))
548 return; 555 return;
549 556
550 for (size_t i = 0; i < outputs.size(); ++i) { 557 for (size_t i = 0; i < outputs.size(); ++i) {
551 uint16 manufacturer_id = 0; 558 uint16 manufacturer_id = 0;
552 uint32 serial_number = 0; 559 uint32 serial_number = 0;
553 std::string name; 560 std::string name;
554 if (ui::GetOutputDeviceData( 561 if (ui::GetOutputDeviceData(
555 outputs[i], &manufacturer_id, &serial_number, &name)) { 562 outputs[i], &manufacturer_id, &serial_number, &name)) {
556 int64 id = gfx::Display::GetID(manufacturer_id, serial_number); 563 int64 id = gfx::Display::GetID(manufacturer_id, serial_number);
557 if (IsInternalDisplayId(id)) { 564 if (IsInternalDisplayId(id)) {
558 display_names_[id] = 565 display_info_[id].name =
559 l10n_util::GetStringUTF8(IDS_ASH_INTERNAL_DISPLAY_NAME); 566 l10n_util::GetStringUTF8(IDS_ASH_INTERNAL_DISPLAY_NAME);
560 } else { 567 } else {
561 display_names_[id] = name; 568 display_info_[id].name = name;
562 } 569 }
563 } 570 }
564 } 571 }
565 #endif 572 #endif
566 } 573 }
567 574
568 void DisplayManager::SetDisplayIdsForTest(DisplayList* to_update) const { 575 void DisplayManager::SetDisplayIdsForTest(DisplayList* to_update) const {
569 DisplayList::iterator iter_to_update = to_update->begin(); 576 DisplayList::iterator iter_to_update = to_update->begin();
570 DisplayList::const_iterator iter = displays_.begin(); 577 DisplayList::const_iterator iter = displays_.begin();
571 for (; iter != displays_.end() && iter_to_update != to_update->end(); 578 for (; iter != displays_.end() && iter_to_update != to_update->end();
572 ++iter, ++iter_to_update) { 579 ++iter, ++iter_to_update) {
573 (*iter_to_update).set_id((*iter).id()); 580 (*iter_to_update).set_id((*iter).id());
574 } 581 }
575 } 582 }
576 583
577 } // namespace internal 584 } // namespace internal
578 } // namespace ash 585 } // namespace ash
OLDNEW
« no previous file with comments | « ash/display/display_manager.h ('k') | ash/display/display_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698