diff options
Diffstat (limited to 'chromium/components/mus/ws/modal_window_controller.h')
-rw-r--r-- | chromium/components/mus/ws/modal_window_controller.h | 87 |
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_ |