Index: ash/wm/screen_pinning_controller.h |
diff --git a/ash/wm/screen_pinning_controller.h b/ash/wm/screen_pinning_controller.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0e0b42d861259b816a144ad0cf54f5e076667575 |
--- /dev/null |
+++ b/ash/wm/screen_pinning_controller.h |
@@ -0,0 +1,114 @@ |
+// 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 ASH_WM_SCREEN_PINNING_CONTROLLER_H_ |
+#define ASH_WM_SCREEN_PINNING_CONTROLLER_H_ |
+ |
+#include <memory> |
+#include <vector> |
+ |
+#include "ash/display/window_tree_host_manager.h" |
+#include "base/macros.h" |
+ |
+namespace ash { |
+ |
+class WindowTreeHostManager; |
+class WmShellCommon; |
+class WmWindow; |
+ |
+// Handles pinned state. |
+class ScreenPinningController : public WindowTreeHostManager::Observer { |
+ public: |
+ ScreenPinningController(WmShellCommon* wm_shell_common, |
+ WindowTreeHostManager* window_tree_host_manager); |
+ ~ScreenPinningController() override; |
+ |
+ // Sets a pinned window. It is not allowed to call this when there already |
+ // is a pinned window. |
+ void SetPinnedWindow(WmWindow* pinned_window); |
+ |
+ // Returns true if in pinned mode, otherwise false. |
+ bool IsPinned() const; |
+ |
+ // Called when a new window is added to the container which has the pinned |
+ // window. |
+ void OnWindowAddedToPinnedContainer(WmWindow* new_window); |
+ |
+ // Called when a window will be removed from the container which has the |
+ // pinned window. |
+ void OnWillRemoveWindowFromPinnedContainer(WmWindow* window); |
+ |
+ // Called when a window stacking is changed in the container which has the |
+ // pinned window. |
+ void OnPinnedContainerWindowStackingChanged(WmWindow* window); |
+ |
+ // Called when a new window is added to a system modal container. |
+ void OnWindowAddedToSystemModalContainer(WmWindow* new_window); |
+ |
+ // Called when a window will be removed from a system modal container. |
+ void OnWillRemoveWindowFromSystemModalContainer(WmWindow* window); |
+ |
+ // Called when a window stacking is changed in a system modal container. |
+ void OnSystemModalContainerWindowStackingChanged(WmWindow* window); |
+ |
+ // Called when a dim window in the system modal container is destroying. |
+ void OnDimWindowDestroying(WmWindow* window); |
+ |
+ private: |
+ class PinnedContainerWindowObserver; |
+ class PinnedContainerChildWindowObserver; |
+ class SystemModalContainerWindowObserver; |
+ class SystemModalContainerChildWindowObserver; |
+ class DimWindowObserver; |
+ |
+ // Keeps the pinned window on top of the siblings. |
+ void KeepPinnedWindowOnTop(); |
+ |
+ // Keeps the dim window at bottom of the container. |
+ void KeepDimWindowAtBottom(WmWindow* container); |
+ |
+ // WindowTreeHostManager::Observer: |
+ void OnDisplayConfigurationChanged() override; |
+ |
+ // Pinned window should be on top in the parent window. |
+ WmWindow* pinned_window_ = nullptr; |
+ |
+ // Dim background window just behind of the pinned window. |
+ // Not owned. The parent has its ownership. |
+ WmWindow* background_window_ = nullptr; |
+ |
+ // In pinned mode, all displays other than the one where pinned_window_ is. |
+ // Similar to background_window_, not owned. |
+ std::vector<WmWindow*> dim_windows_; |
+ |
+ // Set true only when restacking done by this controller. |
+ bool in_restacking_ = false; |
+ |
+ // For OnPinnedStateChanged event notification. |
+ // While this controller is alive, it needs to be ensured that the instances |
+ // refered from the pointers should be alive. |
+ WmShellCommon* wm_shell_common_; |
+ |
+ // Keep references to remove this as a observer. |
+ // While this controller is alive, it needs to be ensured that the instances |
+ // refered from the pointers should be alive. |
+ WindowTreeHostManager* window_tree_host_manager_; |
+ |
+ // Window observers to translate events for the window to this controller. |
+ std::unique_ptr<PinnedContainerWindowObserver> |
+ pinned_container_window_observer_; |
+ std::unique_ptr<PinnedContainerChildWindowObserver> |
+ pinned_container_child_window_observer_; |
+ std::unique_ptr<SystemModalContainerWindowObserver> |
+ system_modal_container_window_observer_; |
+ std::unique_ptr<SystemModalContainerChildWindowObserver> |
+ system_modal_container_child_window_observer_; |
+ std::unique_ptr<DimWindowObserver> dim_window_observer_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScreenPinningController); |
+}; |
+ |
+} // namespace ash |
+ |
+#endif // ASH_WM_SCREEN_PINNING_CONTROLLER_H_ |