Chromium Code Reviews| 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); |
| }; |