Chromium Code Reviews| Index: components/mus/ws/modal_window_controller.h |
| diff --git a/components/mus/ws/modal_window_controller.h b/components/mus/ws/modal_window_controller.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..de5accfe152c81858a79987d4b5622d685ed68e9 |
| --- /dev/null |
| +++ b/components/mus/ws/modal_window_controller.h |
| @@ -0,0 +1,79 @@ |
| +// 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 "components/mus/ws/server_window_observer.h" |
| + |
| +namespace mus { |
| +namespace ws { |
| + |
| +class EventDispatcher; |
| +class ServerWindow; |
| + |
| +namespace test { |
| +class EventDispatcherTestApi; |
|
sky
2016/04/26 23:40:08
Create a ModalWindowControllerTestApi class and fr
mohsen
2016/04/27 20:18:25
Done.
|
| +} |
| + |
| +// 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: |
| + 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: |
| + using ServerWindowList = std::list<ServerWindow*>; |
| + friend class test::EventDispatcherTestApi; |
| + |
| + // 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 OnWindowVisibilityChanged(ServerWindow* window) override; |
| + void OnWindowDestroyed(ServerWindow* window) override; |
| + |
| + EventDispatcher* event_dispatcher_; |
| + |
| + // List of system modal windows in order they are added/shown. |
|
sky
2016/04/26 23:40:08
Actually, this is reverse order, which I think it
mohsen
2016/04/27 20:18:25
They only reason I used reverse order is to be abl
|
| + ServerWindowList system_modal_windows_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ModalWindowController); |
| +}; |
| + |
| +} // namespace ws |
| +} // namespace mus |
| + |
| +#endif // COMPONENTS_MUS_WS_MODAL_WINDOW_CONTROLLER_H_ |