Index: ui/display/display_list.h |
diff --git a/ui/display/display_list.h b/ui/display/display_list.h |
index c4b96ece813600a00358a2ee82945de0c14a576b..df748457c63eb85f196094e1f8a9915682d1874e 100644 |
--- a/ui/display/display_list.h |
+++ b/ui/display/display_list.h |
@@ -7,6 +7,7 @@ |
#include <stdint.h> |
+#include <memory> |
#include <vector> |
#include "base/observer_list.h" |
@@ -16,8 +17,24 @@ |
namespace display { |
class Display; |
+class DisplayList; |
class DisplayObserver; |
+// See description in DisplayLock::SuspendObserverUpdates. |
+class DISPLAY_EXPORT DisplayListObserverLock { |
+ public: |
+ ~DisplayListObserverLock(); |
+ |
+ private: |
+ friend class DisplayList; |
+ |
+ explicit DisplayListObserverLock(DisplayList* display_list); |
+ |
+ DisplayList* display_list_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DisplayListObserverLock); |
+}; |
+ |
// Maintains an ordered list of display::Displays as well as operations to add, |
// remove and update said list. Additionally maintains display::DisplayObservers |
// and updates them as appropriate. |
@@ -43,6 +60,11 @@ class DISPLAY_EXPORT DisplayList { |
Displays::const_iterator GetPrimaryDisplayIterator() const; |
+ // Internally increments a counter that while non-zero results in observers |
+ // not being called for any changes to the displays. It is assumed once |
+ // callers release the last lock they call the observers appropriately. |
+ std::unique_ptr<DisplayListObserverLock> SuspendObserverUpdates(); |
+ |
// Updates the cached id based on display.id() as well as whether the Display |
// is the primary display. |
void UpdateDisplay(const display::Display& display, Type type); |
@@ -53,11 +75,25 @@ class DISPLAY_EXPORT DisplayList { |
// Removes the Display with the specified id. |
void RemoveDisplay(int64_t id); |
+ base::ObserverList<display::DisplayObserver>* observers() { |
+ return &observers_; |
+ } |
+ |
private: |
+ friend class DisplayListObserverLock; |
+ |
+ bool should_notify_observers() const { |
+ return observer_suspend_lock_count_ == 0; |
+ } |
+ void IncrementObserverSuspendLockCount(); |
+ void DecrementObserverSuspendLockCount(); |
+ |
std::vector<display::Display> displays_; |
int primary_display_index_ = -1; |
base::ObserverList<display::DisplayObserver> observers_; |
+ int observer_suspend_lock_count_ = 0; |
+ |
DISALLOW_COPY_AND_ASSIGN(DisplayList); |
}; |