Index: ui/display/display_list.h |
diff --git a/ui/display/display_list.h b/ui/display/display_list.h |
index c4b96ece813600a00358a2ee82945de0c14a576b..afcd5a28275f2c7c8098e508121e67852871bc85 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 { |
James Cook
2016/09/29 04:15:05
I like lock objects.
|
+ 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,15 @@ 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. When |
+ // DisplayListObserverLock is destroyed the counter is decremented. When the |
+ // count reaches zero observers are notified of any pending changes. |
+ // |
+ // NOTE: this only supports suspsending followed by a single add and any |
James Cook
2016/09/29 04:15:05
nit: suspending
|
+ // number of updates to the added display. |
+ 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); |
@@ -54,10 +80,30 @@ class DISPLAY_EXPORT DisplayList { |
void RemoveDisplay(int64_t id); |
private: |
+ friend class DisplayListObserverLock; |
+ |
+ struct SuspendObserverState { |
+ // Number of times SuspendObserverState() has been called. |
+ int count = 0; |
+ |
+ // displays_.size() at the time of the first call to SuspendObserverState(). |
+ size_t original_display_count = 0u; |
James Cook
2016/09/29 04:15:05
Unused?
|
+ |
+ // Whether AddDisplay() was called while the lock was held. |
+ bool display_added = false; |
+ }; |
+ |
+ void IncrementObserverSuspendLockCount(); |
+ void DecrementObserverSuspendLockCount(); |
+ |
std::vector<display::Display> displays_; |
int primary_display_index_ = -1; |
base::ObserverList<display::DisplayObserver> observers_; |
+ // Tracks state associated with calls to SuspendObserverState(). Non-null |
+ // while SuspendObserverState::count is > 0. |
+ std::unique_ptr<SuspendObserverState> suspend_observer_state_; |
+ |
DISALLOW_COPY_AND_ASSIGN(DisplayList); |
}; |