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

Unified Diff: ui/display/display_list.h

Issue 2378923002: Adds ability to suspend notifying observers when display list is changed (Closed)
Patch Set: cleanup 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
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);
};

Powered by Google App Engine
This is Rietveld 408576698