| 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);
|
| };
|
|
|
|
|