Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(428)

Unified Diff: ui/display/display_list.h

Issue 2378923002: Adds ability to suspend notifying observers when display list is changed (Closed)
Patch Set: feedback Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/mus/window_manager.cc ('k') | ui/display/display_list.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
};
« no previous file with comments | « ash/mus/window_manager.cc ('k') | ui/display/display_list.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698