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

Unified Diff: components/mus/ws/event_dispatcher.h

Issue 1818333002: Reland: mus: Enable system modal windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 8 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: components/mus/ws/event_dispatcher.h
diff --git a/components/mus/ws/event_dispatcher.h b/components/mus/ws/event_dispatcher.h
index bc0e94832c224288af9565a74571462775fc9e03..aa547b8f8ec1069b26b91780cf58dbe06fd12453 100644
--- a/components/mus/ws/event_dispatcher.h
+++ b/components/mus/ws/event_dispatcher.h
@@ -7,6 +7,7 @@
#include <stdint.h>
+#include <list>
#include <map>
#include <memory>
@@ -60,6 +61,20 @@ class EventDispatcher : public ServerWindowObserver {
// (indicated by returning |false|).
bool SetCaptureWindow(ServerWindow* capture_window, bool in_nonclient_area);
+ // Adds a system modal window. The window remains modal to system until it is
+ // destroyed. There can exist multiple system modal windows, in which case the
+ // one that is visible and added most recently or shown most recently would be
+ // the active one.
+ void AddSystemModalWindow(ServerWindow* window);
+
+ // Checks if |modal_window| is a visible modal window that blocks current
+ // capture window and if that's the case, releases the capture.
+ void ReleaseCaptureBlockedByModalWindow(const ServerWindow* modal_window);
+
+ // Checks if the current capture window is blocked by any visible modal window
+ // and if that's the case, releases the capture.
+ void ReleaseCaptureBlockedByAnyModalWindow();
+
// Retrieves the ServerWindow of the last mouse move.
ServerWindow* mouse_cursor_source_window() const {
return mouse_cursor_source_window_;
@@ -81,6 +96,7 @@ class EventDispatcher : public ServerWindowObserver {
void ProcessEvent(const ui::Event& event);
private:
+ using ServerWindowList = std::list<ServerWindow*>;
friend class test::EventDispatcherTestApi;
// Keeps track of state associated with an active pointer.
@@ -148,15 +164,24 @@ class EventDispatcher : public ServerWindowObserver {
// way we continue to eat events until the up/cancel is received.
void CancelPointerEventsToTarget(ServerWindow* window);
- // Returns true if we're currently an observer for |window|. We are an
- // observer for a window if any pointer events are targeting it.
- bool IsObservingWindow(ServerWindow* window);
+ // Used to observe a window. Can be called multiple times on a window. To
+ // unobserve a window, UnobserveWindow() should be called the same number of
+ // times.
+ void ObserveWindow(ServerWindow* winodw);
+ void UnobserveWindow(ServerWindow* winodw);
// Returns an Accelerator bound to the specified code/flags, and of the
// matching |phase|. Otherwise returns null.
Accelerator* FindAccelerator(const ui::KeyEvent& event,
const mojom::AcceleratorPhase phase);
+ // Returns the system modal window that is visible and added/shown most
+ // recently, if any.
+ ServerWindow* GetActiveSystemModalWindow() const;
+
+ // Removes system modal window at the given iterator and unobserves it.
+ void RemoveSystemModalWindow(ServerWindowList::iterator it);
+
// ServerWindowObserver:
void OnWillChangeWindowHierarchy(ServerWindow* window,
ServerWindow* new_parent,
@@ -166,9 +191,13 @@ class EventDispatcher : public ServerWindowObserver {
EventDispatcherDelegate* delegate_;
ServerWindow* root_;
- ServerWindow* capture_window_;
+ ServerWindow* capture_window_;
bool capture_window_in_nonclient_area_;
+
+ // List of system modal windows in order they are added/shown.
+ ServerWindowList system_modal_windows_;
+
bool mouse_button_down_;
ServerWindow* mouse_cursor_source_window_;
@@ -188,6 +217,9 @@ class EventDispatcher : public ServerWindowObserver {
// cancel or up.
PointerIdToTargetMap pointer_targets_;
+ // Keeps track of number of observe requests for each observed window.
+ std::map<const ServerWindow*, uint8_t> observed_windows_;
+
DISALLOW_COPY_AND_ASSIGN(EventDispatcher);
};

Powered by Google App Engine
This is Rietveld 408576698