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

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

Issue 138003007: [Cleanup] Screen cleanup (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix conflict Created 6 years, 11 months 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
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 <cmath> 7 #include <cmath>
8 #include <set> 8 #include <set>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "ash/ash_switches.h" 12 #include "ash/ash_switches.h"
13 #include "ash/display/display_layout_store.h" 13 #include "ash/display/display_layout_store.h"
14 #include "ash/screen_ash.h" 14 #include "ash/display/screen_ash.h"
15 #include "ash/screen_util.h"
15 #include "ash/shell.h" 16 #include "ash/shell.h"
16 #include "base/auto_reset.h" 17 #include "base/auto_reset.h"
17 #include "base/command_line.h" 18 #include "base/command_line.h"
18 #include "base/logging.h" 19 #include "base/logging.h"
19 #include "base/strings/string_number_conversions.h" 20 #include "base/strings/string_number_conversions.h"
20 #include "base/strings/string_split.h" 21 #include "base/strings/string_split.h"
21 #include "base/strings/stringprintf.h" 22 #include "base/strings/stringprintf.h"
22 #include "base/strings/utf_string_conversions.h" 23 #include "base/strings/utf_string_conversions.h"
23 #include "grit/ash_strings.h" 24 #include "grit/ash_strings.h"
24 #include "ui/base/l10n/l10n_util.h" 25 #include "ui/base/l10n/l10n_util.h"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 DISALLOW_COPY_AND_ASSIGN(NonDesktopDisplayUpdater); 137 DISALLOW_COPY_AND_ASSIGN(NonDesktopDisplayUpdater);
137 }; 138 };
138 139
139 } // namespace 140 } // namespace
140 141
141 using std::string; 142 using std::string;
142 using std::vector; 143 using std::vector;
143 144
144 DisplayManager::DisplayManager() 145 DisplayManager::DisplayManager()
145 : delegate_(NULL), 146 : delegate_(NULL),
147 screen_ash_(new ScreenAsh),
148 screen_(screen_ash_.get()),
146 layout_store_(new DisplayLayoutStore), 149 layout_store_(new DisplayLayoutStore),
147 first_display_id_(gfx::Display::kInvalidDisplayID), 150 first_display_id_(gfx::Display::kInvalidDisplayID),
148 num_connected_displays_(0), 151 num_connected_displays_(0),
149 force_bounds_changed_(false), 152 force_bounds_changed_(false),
150 change_display_upon_host_resize_(false), 153 change_display_upon_host_resize_(false),
151 second_display_mode_(EXTENDED), 154 second_display_mode_(EXTENDED),
152 mirrored_display_id_(gfx::Display::kInvalidDisplayID) { 155 mirrored_display_id_(gfx::Display::kInvalidDisplayID) {
153 #if defined(OS_CHROMEOS) 156 #if defined(OS_CHROMEOS)
154 change_display_upon_host_resize_ = !base::SysInfo::IsRunningOnChromeOS(); 157 change_display_upon_host_resize_ = !base::SysInfo::IsRunningOnChromeOS();
155 #endif 158 #endif
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 return std::make_pair(displays_[1].id(), id_at_zero); 298 return std::make_pair(displays_[1].id(), id_at_zero);
296 } 299 }
297 } 300 }
298 } 301 }
299 302
300 void DisplayManager::SetLayoutForCurrentDisplays( 303 void DisplayManager::SetLayoutForCurrentDisplays(
301 const DisplayLayout& layout_relative_to_primary) { 304 const DisplayLayout& layout_relative_to_primary) {
302 DCHECK_EQ(2U, GetNumDisplays()); 305 DCHECK_EQ(2U, GetNumDisplays());
303 if (GetNumDisplays() < 2) 306 if (GetNumDisplays() < 2)
304 return; 307 return;
305 const gfx::Display& primary = Shell::GetScreen()->GetPrimaryDisplay(); 308 const gfx::Display& primary = screen_->GetPrimaryDisplay();
306 const DisplayIdPair pair = GetCurrentDisplayIdPair(); 309 const DisplayIdPair pair = GetCurrentDisplayIdPair();
307 // Invert if the primary was swapped. 310 // Invert if the primary was swapped.
308 DisplayLayout to_set = pair.first == primary.id() ? 311 DisplayLayout to_set = pair.first == primary.id() ?
309 layout_relative_to_primary : layout_relative_to_primary.Invert(); 312 layout_relative_to_primary : layout_relative_to_primary.Invert();
310 313
311 DisplayLayout current_layout = 314 DisplayLayout current_layout =
312 layout_store_->GetRegisteredDisplayLayout(pair); 315 layout_store_->GetRegisteredDisplayLayout(pair);
313 if (to_set.position != current_layout.position || 316 if (to_set.position != current_layout.position ||
314 to_set.offset != current_layout.offset) { 317 to_set.offset != current_layout.offset) {
315 to_set.primary_id = primary.id(); 318 to_set.primary_id = primary.id();
316 layout_store_->RegisterLayoutForDisplayIdPair( 319 layout_store_->RegisterLayoutForDisplayIdPair(
317 pair.first, pair.second, to_set); 320 pair.first, pair.second, to_set);
318 if (delegate_) 321 if (delegate_)
319 delegate_->PreDisplayConfigurationChange(false); 322 delegate_->PreDisplayConfigurationChange(false);
320 // PreDisplayConfigurationChange(false); 323 // PreDisplayConfigurationChange(false);
321 // TODO(oshima): Call UpdateDisplays instead. 324 // TODO(oshima): Call UpdateDisplays instead.
322 const DisplayLayout layout = GetCurrentDisplayLayout(); 325 const DisplayLayout layout = GetCurrentDisplayLayout();
323 UpdateDisplayBoundsForLayoutById( 326 UpdateDisplayBoundsForLayoutById(
324 layout, primary, 327 layout, primary,
325 ScreenAsh::GetSecondaryDisplay().id()); 328 ScreenUtil::GetSecondaryDisplay().id());
326 329
327 //UpdateCurrentDisplayBoundsForLayout();
328 // Primary's bounds stay the same. Just notify bounds change 330 // Primary's bounds stay the same. Just notify bounds change
329 // on the secondary. 331 // on the secondary.
330 Shell::GetInstance()->screen()->NotifyBoundsChanged( 332 screen_ash_->NotifyBoundsChanged(
331 ScreenAsh::GetSecondaryDisplay()); 333 ScreenUtil::GetSecondaryDisplay());
332 if (delegate_) 334 if (delegate_)
333 delegate_->PostDisplayConfigurationChange(); 335 delegate_->PostDisplayConfigurationChange();
334 } 336 }
335 } 337 }
336 338
337 const gfx::Display& DisplayManager::GetDisplayForId(int64 id) const { 339 const gfx::Display& DisplayManager::GetDisplayForId(int64 id) const {
338 gfx::Display* display = 340 gfx::Display* display =
339 const_cast<DisplayManager*>(this)->FindDisplayForId(id); 341 const_cast<DisplayManager*>(this)->FindDisplayForId(id);
340 return display ? *display : GetInvalidDisplay(); 342 return display ? *display : GetInvalidDisplay();
341 } 343 }
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 746
745 base::AutoReset<bool> resetter(&change_display_upon_host_resize_, false); 747 base::AutoReset<bool> resetter(&change_display_upon_host_resize_, false);
746 748
747 // Temporarily add displays to be removed because display object 749 // Temporarily add displays to be removed because display object
748 // being removed are accessed during shutting down the root. 750 // being removed are accessed during shutting down the root.
749 displays_.insert(displays_.end(), removed_displays.begin(), 751 displays_.insert(displays_.end(), removed_displays.begin(),
750 removed_displays.end()); 752 removed_displays.end());
751 753
752 for (DisplayList::const_reverse_iterator iter = removed_displays.rbegin(); 754 for (DisplayList::const_reverse_iterator iter = removed_displays.rbegin();
753 iter != removed_displays.rend(); ++iter) { 755 iter != removed_displays.rend(); ++iter) {
754 Shell::GetInstance()->screen()->NotifyDisplayRemoved(displays_.back()); 756 screen_ash_->NotifyDisplayRemoved(displays_.back());
755 displays_.pop_back(); 757 displays_.pop_back();
756 } 758 }
757 // Close the non desktop window here to avoid creating two compositor on 759 // Close the non desktop window here to avoid creating two compositor on
758 // one display. 760 // one display.
759 if (!non_desktop_display_updater->enabled()) 761 if (!non_desktop_display_updater->enabled())
760 non_desktop_display_updater.reset(); 762 non_desktop_display_updater.reset();
761 for (std::vector<size_t>::iterator iter = added_display_indices.begin(); 763 for (std::vector<size_t>::iterator iter = added_display_indices.begin();
762 iter != added_display_indices.end(); ++iter) { 764 iter != added_display_indices.end(); ++iter) {
763 Shell::GetInstance()->screen()->NotifyDisplayAdded(displays_[*iter]); 765 screen_ash_->NotifyDisplayAdded(displays_[*iter]);
764 } 766 }
765 // Create the non destkop window after all displays are added so that 767 // Create the non destkop window after all displays are added so that
766 // it can mirror the display newly added. This can happen when switching 768 // it can mirror the display newly added. This can happen when switching
767 // from dock mode to software mirror mode. 769 // from dock mode to software mirror mode.
768 non_desktop_display_updater.reset(); 770 non_desktop_display_updater.reset();
769 for (std::vector<size_t>::iterator iter = changed_display_indices.begin(); 771 for (std::vector<size_t>::iterator iter = changed_display_indices.begin();
770 iter != changed_display_indices.end(); ++iter) { 772 iter != changed_display_indices.end(); ++iter) {
771 Shell::GetInstance()->screen()->NotifyBoundsChanged(displays_[*iter]); 773 screen_ash_->NotifyBoundsChanged(displays_[*iter]);
772 } 774 }
773 if (delegate_) 775 if (delegate_)
774 delegate_->PostDisplayConfigurationChange(); 776 delegate_->PostDisplayConfigurationChange();
775 777
776 #if defined(USE_X11) && defined(OS_CHROMEOS) 778 #if defined(USE_X11) && defined(OS_CHROMEOS)
777 if (!changed_display_indices.empty() && base::SysInfo::IsRunningOnChromeOS()) 779 if (!changed_display_indices.empty() && base::SysInfo::IsRunningOnChromeOS())
778 ui::ClearX11DefaultRootWindow(); 780 ui::ClearX11DefaultRootWindow();
779 #endif 781 #endif
780 } 782 }
781 783
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 910
909 bool DisplayManager::UpdateDisplayBounds(int64 display_id, 911 bool DisplayManager::UpdateDisplayBounds(int64 display_id,
910 const gfx::Rect& new_bounds) { 912 const gfx::Rect& new_bounds) {
911 if (change_display_upon_host_resize_) { 913 if (change_display_upon_host_resize_) {
912 display_info_[display_id].SetBounds(new_bounds); 914 display_info_[display_id].SetBounds(new_bounds);
913 // Don't notify observers if the mirrored window has changed. 915 // Don't notify observers if the mirrored window has changed.
914 if (software_mirroring_enabled() && mirrored_display_id_ == display_id) 916 if (software_mirroring_enabled() && mirrored_display_id_ == display_id)
915 return false; 917 return false;
916 gfx::Display* display = FindDisplayForId(display_id); 918 gfx::Display* display = FindDisplayForId(display_id);
917 display->SetSize(display_info_[display_id].size_in_pixel()); 919 display->SetSize(display_info_[display_id].size_in_pixel());
918 Shell::GetInstance()->screen()->NotifyBoundsChanged(*display); 920 screen_ash_->NotifyBoundsChanged(*display);
919 return true; 921 return true;
920 } 922 }
921 return false; 923 return false;
922 } 924 }
923 925
924 void DisplayManager::CreateMirrorWindowIfAny() { 926 void DisplayManager::CreateMirrorWindowIfAny() {
925 NonDesktopDisplayUpdater updater(this, delegate_); 927 NonDesktopDisplayUpdater updater(this, delegate_);
926 } 928 }
927 929
930 gfx::Screen* DisplayManager::CreateScreenForShutdown() const{
931 return screen_ash_->CloneForShutdown();
932 }
933
928 gfx::Display* DisplayManager::FindDisplayForId(int64 id) { 934 gfx::Display* DisplayManager::FindDisplayForId(int64 id) {
929 for (DisplayList::iterator iter = displays_.begin(); 935 for (DisplayList::iterator iter = displays_.begin();
930 iter != displays_.end(); ++iter) { 936 iter != displays_.end(); ++iter) {
931 if ((*iter).id() == id) 937 if ((*iter).id() == id)
932 return &(*iter); 938 return &(*iter);
933 } 939 }
934 DLOG(WARNING) << "Could not find display:" << id; 940 DLOG(WARNING) << "Could not find display:" << id;
935 return NULL; 941 return NULL;
936 } 942 }
937 943
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 break; 1060 break;
1055 } 1061 }
1056 gfx::Insets insets = secondary_display->GetWorkAreaInsets(); 1062 gfx::Insets insets = secondary_display->GetWorkAreaInsets();
1057 secondary_display->set_bounds( 1063 secondary_display->set_bounds(
1058 gfx::Rect(new_secondary_origin, secondary_bounds.size())); 1064 gfx::Rect(new_secondary_origin, secondary_bounds.size()));
1059 secondary_display->UpdateWorkAreaFromInsets(insets); 1065 secondary_display->UpdateWorkAreaFromInsets(insets);
1060 } 1066 }
1061 1067
1062 } // namespace internal 1068 } // namespace internal
1063 } // namespace ash 1069 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698