summaryrefslogtreecommitdiff
path: root/chromium/components/mus/ws/modal_window_controller.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/mus/ws/modal_window_controller.h')
-rw-r--r--chromium/components/mus/ws/modal_window_controller.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/chromium/components/mus/ws/modal_window_controller.h b/chromium/components/mus/ws/modal_window_controller.h
new file mode 100644
index 00000000000..112fce771e6
--- /dev/null
+++ b/chromium/components/mus/ws/modal_window_controller.h
@@ -0,0 +1,87 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_MUS_WS_MODAL_WINDOW_CONTROLLER_H_
+#define COMPONENTS_MUS_WS_MODAL_WINDOW_CONTROLLER_H_
+
+#include <list>
+#include <map>
+
+#include "components/mus/ws/server_window_drawn_tracker_observer.h"
+#include "components/mus/ws/server_window_observer.h"
+
+namespace mus {
+namespace ws {
+
+class EventDispatcher;
+class ServerWindow;
+class ServerWindowDrawnTracker;
+
+namespace test {
+class ModalWindowControllerTestApi;
+}
+
+// Used to keeps track of system modal windows and check whether windows are
+// blocked by modal windows or not to do appropriate retargetting of events.
+class ModalWindowController : public ServerWindowObserver,
+ public ServerWindowDrawnTrackerObserver {
+ public:
+ explicit ModalWindowController(EventDispatcher* event_dispatcher);
+ ~ModalWindowController() override;
+
+ // 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 whether |modal_window| is a visible modal window that blocks
+ // |window|.
+ bool IsWindowBlockedBy(const ServerWindow* window,
+ const ServerWindow* modal_window) const;
+
+ // Checks whether |window| is blocked by any visible modal window.
+ bool IsWindowBlocked(const ServerWindow* window) const;
+
+ // Returns the window that events targeted to |window| should be retargeted
+ // to; according to modal windows. If any modal window is blocking |window|
+ // (either system modal or window modal), returns the topmost one; otherwise,
+ // returns |window| itself.
+ const ServerWindow* GetTargetForWindow(const ServerWindow* window) const;
+ ServerWindow* GetTargetForWindow(ServerWindow* window) const {
+ return const_cast<ServerWindow*>(
+ GetTargetForWindow(static_cast<const ServerWindow*>(window)));
+ }
+
+ private:
+ friend class test::ModalWindowControllerTestApi;
+
+ // Returns the system modal window that is visible and added/shown most
+ // recently, if any.
+ ServerWindow* GetActiveSystemModalWindow() const;
+
+ // ServerWindowObserver:
+ void OnWindowDestroyed(ServerWindow* window) override;
+
+ // ServerWindowDrawnTrackerObserver:
+ void OnDrawnStateChanged(ServerWindow* ancestor,
+ ServerWindow* window,
+ bool is_drawn) override;
+
+ EventDispatcher* event_dispatcher_;
+
+ // List of system modal windows in order they are added/shown.
+ std::list<ServerWindow*> system_modal_windows_;
+
+ // Drawn trackers for system modal windows.
+ std::map<ServerWindow*, std::unique_ptr<ServerWindowDrawnTracker>>
+ window_drawn_trackers_;
+
+ DISALLOW_COPY_AND_ASSIGN(ModalWindowController);
+};
+
+} // namespace ws
+} // namespace mus
+
+#endif // COMPONENTS_MUS_WS_MODAL_WINDOW_CONTROLLER_H_