blob: 5f426fa4a63e4e239c96f1375204b27859e87c98 [file] [log] [blame]
// 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 SERVICES_UI_WS_MODAL_WINDOW_CONTROLLER_H_
#define SERVICES_UI_WS_MODAL_WINDOW_CONTROLLER_H_
#include <list>
#include <map>
#include "services/ui/ws/server_window_drawn_tracker_observer.h"
#include "services/ui/ws/server_window_observer.h"
namespace ui {
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 ui
#endif // SERVICES_UI_WS_MODAL_WINDOW_CONTROLLER_H_