Index: ash/monitor/multi_monitor_manager.cc |
diff --git a/ash/monitor/multi_monitor_manager.cc b/ash/monitor/multi_monitor_manager.cc |
index 46dddadd31b4cf2c7ad9c417fdfd70a9d170da69..e03219d58c489c3f65ae82f0e9a8f731a0a1ba3c 100644 |
--- a/ash/monitor/multi_monitor_manager.cc |
+++ b/ash/monitor/multi_monitor_manager.cc |
@@ -12,40 +12,36 @@ |
#include "base/string_split.h" |
#include "ui/aura/aura_switches.h" |
#include "ui/aura/env.h" |
-#include "ui/aura/monitor.h" |
#include "ui/aura/root_window.h" |
#include "ui/aura/root_window_host.h" |
-#include "ui/gfx/rect.h" |
#include "ui/aura/window_property.h" |
+#include "ui/gfx/monitor.h" |
+#include "ui/gfx/rect.h" |
-DECLARE_WINDOW_PROPERTY_TYPE(aura::Monitor*); |
+DECLARE_WINDOW_PROPERTY_TYPE(int); |
namespace ash { |
namespace internal { |
namespace { |
- |
-aura::Monitor* Copy(aura::Monitor* m) { |
- aura::Monitor* monitor = new aura::Monitor; |
- monitor->set_bounds(m->bounds()); |
- return monitor; |
+gfx::Monitor& GetInvalidMonitor() { |
+ static gfx::Monitor* invalid_monitor = new gfx::Monitor(); |
+ return *invalid_monitor; |
} |
- |
} // namespace |
-DEFINE_WINDOW_PROPERTY_KEY(aura::Monitor*, kMonitorKey, NULL); |
- |
-using std::string; |
-using std::vector; |
-using aura::Monitor; |
using aura::RootWindow; |
using aura::Window; |
+using gfx::Monitor; |
+using std::string; |
+using std::vector; |
+ |
+DEFINE_WINDOW_PROPERTY_KEY(int, kMonitorIdKey, -1); |
MultiMonitorManager::MultiMonitorManager() { |
Init(); |
} |
MultiMonitorManager::~MultiMonitorManager() { |
- STLDeleteContainerPointers(monitors_.begin(), monitors_.end()); |
} |
// static |
@@ -62,20 +58,22 @@ void MultiMonitorManager::CycleMonitor() { |
} |
void MultiMonitorManager::OnNativeMonitorsChanged( |
- const std::vector<const aura::Monitor*>& new_monitors) { |
+ const std::vector<Monitor>& new_monitors) { |
size_t min = std::min(monitors_.size(), new_monitors.size()); |
// For m19, we only care about 1st monitor as primary, and |
// don't differentiate the rest of monitors as all secondary |
- // monitors have the same content. |
+ // monitors have the same content. ID for primary monitor stays the same |
+ // because we never remove it, we don't update IDs for other monitors |
+ // , for now, because they're the same. |
// TODO(oshima): Fix this so that we can differentiate outputs |
// and keep a content on one monitor stays on the same monitor |
// when a monitor is added or removed. |
for (size_t i = 0; i < min; ++i) { |
- Monitor* current_monitor = monitors_[i]; |
- const Monitor* new_monitor = new_monitors[i]; |
- if (current_monitor->bounds() != new_monitor->bounds()) { |
- current_monitor->set_bounds(new_monitor->bounds()); |
+ Monitor& current_monitor = monitors_[i]; |
+ const Monitor& new_monitor = new_monitors[i]; |
+ if (current_monitor.bounds() != new_monitor.bounds()) { |
+ current_monitor.SetBoundsAndUpdateWorkArea(new_monitor.bounds()); |
NotifyBoundsChanged(current_monitor); |
} |
} |
@@ -83,9 +81,10 @@ void MultiMonitorManager::OnNativeMonitorsChanged( |
if (monitors_.size() < new_monitors.size()) { |
// New monitors added |
for (size_t i = min; i < new_monitors.size(); ++i) { |
- Monitor* monitor = new Monitor(); |
- monitor->set_bounds(new_monitors[i]->bounds()); |
- monitors_.push_back(monitor); |
+ // |
+ monitors_.push_back(Monitor(i)); |
+ gfx::Monitor& monitor = monitors_.back(); |
+ monitor.SetBoundsAndUpdateWorkArea(new_monitors[i].bounds()); |
NotifyMonitorAdded(monitor); |
} |
} else { |
@@ -93,35 +92,45 @@ void MultiMonitorManager::OnNativeMonitorsChanged( |
// monitor (at index 0) because it needs the monitor information |
// even if it doesn't exit. |
while (monitors_.size() > new_monitors.size() && monitors_.size() > 1) { |
- Monitor* monitor = monitors_.back(); |
- NotifyMonitorRemoved(monitor); |
- monitors_.erase(std::find(monitors_.begin(), monitors_.end(), monitor)); |
- delete monitor; |
+ Monitors::reverse_iterator iter = monitors_.rbegin(); |
+ NotifyMonitorRemoved(*iter); |
+ monitors_.erase(iter.base() - 1); |
} |
} |
} |
RootWindow* MultiMonitorManager::CreateRootWindowForMonitor( |
- Monitor* monitor) { |
- RootWindow* root_window = new RootWindow(monitor->bounds()); |
+ const Monitor& monitor) { |
+ RootWindow* root_window = new RootWindow(monitor.bounds()); |
// No need to remove RootWindowObserver because |
// the MonitorManager object outlives RootWindow objects. |
root_window->AddRootWindowObserver(this); |
- root_window->SetProperty(kMonitorKey, monitor); |
+ root_window->SetProperty(kMonitorIdKey, monitor.id()); |
return root_window; |
} |
-const Monitor* MultiMonitorManager::GetMonitorNearestWindow( |
+const Monitor& MultiMonitorManager::GetMonitorAt(size_t index) { |
+ return index < monitors_.size() ? monitors_[index] : GetInvalidMonitor(); |
+} |
+ |
+size_t MultiMonitorManager::GetNumMonitors() const { |
+ return monitors_.size(); |
+} |
+ |
+const Monitor& MultiMonitorManager::GetMonitorNearestWindow( |
const Window* window) const { |
if (!window) { |
MultiMonitorManager* manager = const_cast<MultiMonitorManager*>(this); |
return manager->GetMonitorAt(0); |
} |
const RootWindow* root = window->GetRootWindow(); |
- return root ? root->GetProperty(kMonitorKey) : NULL; |
+ MultiMonitorManager* that = const_cast<MultiMonitorManager*>(this); |
+ return root ? |
+ that->FindMonitorById(root->GetProperty(kMonitorIdKey)) : |
+ GetInvalidMonitor(); |
} |
-const Monitor* MultiMonitorManager::GetMonitorNearestPoint( |
+const Monitor& MultiMonitorManager::GetMonitorNearestPoint( |
const gfx::Point& point) const { |
// TODO(oshima): For m19, mouse is constrained within |
// the primary window. |
@@ -129,28 +138,26 @@ const Monitor* MultiMonitorManager::GetMonitorNearestPoint( |
return manager->GetMonitorAt(0); |
} |
-Monitor* MultiMonitorManager::GetMonitorAt(size_t index) { |
- return index < monitors_.size() ? monitors_[index] : NULL; |
-} |
- |
-size_t MultiMonitorManager::GetNumMonitors() const { |
- return monitors_.size(); |
-} |
- |
-Monitor* MultiMonitorManager::GetMonitorNearestWindow(const Window* window) { |
- const MonitorManager* manager = this; |
- return const_cast<Monitor*>(manager->GetMonitorNearestWindow(window)); |
-} |
- |
void MultiMonitorManager::OnRootWindowResized(const aura::RootWindow* root, |
const gfx::Size& old_size) { |
if (!use_fullscreen_host_window()) { |
- Monitor* monitor = root->GetProperty(kMonitorKey); |
- monitor->set_size(root->GetHostSize()); |
+ int monitor_id = root->GetProperty(kMonitorIdKey); |
+ Monitor& monitor = FindMonitorById(monitor_id); |
+ monitor.SetSizeAndUpdateWorkArea(root->GetHostSize()); |
NotifyBoundsChanged(monitor); |
} |
} |
+bool MultiMonitorManager::UpdateWorkAreaOfMonitorNearestWindow( |
+ const aura::Window* window, |
+ const gfx::Insets& insets) { |
+ const RootWindow* root = window->GetRootWindow(); |
+ Monitor& monitor = FindMonitorById(root->GetProperty(kMonitorIdKey)); |
+ gfx::Rect old_work_area = monitor.work_area(); |
+ monitor.UpdateWorkAreaWithInsets(insets); |
+ return old_work_area != monitor.work_area(); |
+} |
+ |
void MultiMonitorManager::Init() { |
// TODO(oshima): Move this logic to MonitorChangeObserver. |
const string size_str = CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
@@ -166,35 +173,43 @@ void MultiMonitorManager::Init() { |
} |
void MultiMonitorManager::AddRemoveMonitorImpl() { |
- std::vector<const Monitor*> new_monitors; |
+ std::vector<Monitor> new_monitors; |
if (monitors_.size() > 1) { |
// Remove if there is more than one monitor. |
int count = monitors_.size() - 1; |
for (Monitors::const_iterator iter = monitors_.begin(); count-- > 0; ++iter) |
- new_monitors.push_back(Copy(*iter)); |
+ new_monitors.push_back(*iter); |
} else { |
// Add if there is only one monitor. |
- new_monitors.push_back(Copy(monitors_[0])); |
- aura::Monitor* extra_monitor = new Monitor; |
- extra_monitor->set_bounds(gfx::Rect(100, 100, 1440, 800)); |
- new_monitors.push_back(extra_monitor); |
+ new_monitors.push_back(monitors_[0]); |
+ new_monitors.push_back(CreateMonitorFromSpec("50+50-1280x768")); |
} |
if (new_monitors.size()) |
OnNativeMonitorsChanged(new_monitors); |
- STLDeleteContainerPointers(new_monitors.begin(), new_monitors.end()); |
} |
void MultiMonitorManager::CycleMonitorImpl() { |
if (monitors_.size() > 1) { |
- std::vector<const Monitor*> new_monitors; |
+ std::vector<Monitor> new_monitors; |
for (Monitors::const_iterator iter = monitors_.begin() + 1; |
- iter != monitors_.end(); ++iter) |
- new_monitors.push_back(Copy(*iter)); |
- new_monitors.push_back(Copy(monitors_.front())); |
+ iter != monitors_.end(); ++iter) { |
+ gfx::Monitor monitor = *iter; |
+ new_monitors.push_back(monitor); |
+ } |
+ new_monitors.push_back(monitors_.front()); |
OnNativeMonitorsChanged(new_monitors); |
- STLDeleteContainerPointers(new_monitors.begin(), new_monitors.end()); |
} |
} |
+gfx::Monitor& MultiMonitorManager::FindMonitorById(int id) { |
+ for (Monitors::iterator iter = monitors_.begin(); |
+ iter != monitors_.end(); ++iter) { |
+ if ((*iter).id() == id) |
+ return *iter; |
+ } |
+ DLOG(FATAL) << "Could not find monitor by id:" << id; |
+ return GetInvalidMonitor(); |
+} |
+ |
} // namespace internal |
} // namespace ash |