summaryrefslogtreecommitdiff
path: root/chromium/components/mus/ws/display.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/mus/ws/display.h')
-rw-r--r--chromium/components/mus/ws/display.h224
1 files changed, 224 insertions, 0 deletions
diff --git a/chromium/components/mus/ws/display.h b/chromium/components/mus/ws/display.h
new file mode 100644
index 00000000000..419b1909c03
--- /dev/null
+++ b/chromium/components/mus/ws/display.h
@@ -0,0 +1,224 @@
+// Copyright 2015 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_DISPLAY_H_
+#define COMPONENTS_MUS_WS_DISPLAY_H_
+
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <queue>
+#include <set>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "components/mus/common/types.h"
+#include "components/mus/public/interfaces/window_manager_constants.mojom.h"
+#include "components/mus/public/interfaces/window_tree_host.mojom.h"
+#include "components/mus/ws/focus_controller_delegate.h"
+#include "components/mus/ws/focus_controller_observer.h"
+#include "components/mus/ws/platform_display.h"
+#include "components/mus/ws/server_window.h"
+#include "components/mus/ws/server_window_observer.h"
+#include "components/mus/ws/server_window_tracker.h"
+#include "components/mus/ws/user_id_tracker_observer.h"
+#include "components/mus/ws/window_manager_window_tree_factory_set_observer.h"
+
+namespace mus {
+namespace ws {
+
+class DisplayBinding;
+class DisplayManager;
+class FocusController;
+struct PlatformDisplayInitParams;
+class WindowManagerDisplayRoot;
+class WindowServer;
+class WindowTree;
+
+namespace test {
+class DisplayTestApi;
+}
+
+// Displays manages the state associated with a single display. Display has a
+// single root window whose children are the roots for a per-user
+// WindowManager. Display is configured in two distinct
+// ways:
+// . with a DisplayBinding. In this mode there is only ever one WindowManager
+// for the display, which comes from the client that created the
+// Display.
+// . without a DisplayBinding. In this mode a WindowManager is automatically
+// created per user.
+class Display : public PlatformDisplayDelegate,
+ public mojom::WindowTreeHost,
+ public FocusControllerObserver,
+ public FocusControllerDelegate,
+ public ServerWindowObserver,
+ public UserIdTrackerObserver,
+ public WindowManagerWindowTreeFactorySetObserver {
+ public:
+ Display(WindowServer* window_server,
+ const PlatformDisplayInitParams& platform_display_init_params);
+ ~Display() override;
+
+ // Initializes state that depends on the existence of a Display.
+ void Init(std::unique_ptr<DisplayBinding> binding);
+
+ uint32_t id() const { return id_; }
+
+ DisplayManager* display_manager();
+ const DisplayManager* display_manager() const;
+
+ PlatformDisplay* platform_display() { return platform_display_.get(); }
+
+ // Returns a mojom::Display for the specified display. WindowManager specific
+ // values are not set.
+ mojom::DisplayPtr ToMojomDisplay() const;
+
+ // Schedules a paint for the specified region in the coordinates of |window|.
+ void SchedulePaint(const ServerWindow* window, const gfx::Rect& bounds);
+
+ // Schedules destruction of surfaces in |window|. If a frame has been
+ // scheduled but not drawn surface destruction is delayed until the frame is
+ // drawn, otherwise destruction is immediate.
+ void ScheduleSurfaceDestruction(ServerWindow* window);
+
+ mojom::Rotation GetRotation() const;
+ gfx::Size GetSize() const;
+
+ // Returns the id for the corresponding id.
+ int64_t GetPlatformDisplayId() const;
+
+ WindowServer* window_server() { return window_server_; }
+
+ // Returns the root of the Display. The root's children are the roots
+ // of the corresponding WindowManagers.
+ ServerWindow* root_window() { return root_.get(); }
+ const ServerWindow* root_window() const { return root_.get(); }
+
+ // Returns the ServerWindow whose id is |id|. This does not do a search over
+ // all windows, rather just the display and window manager root windows.
+ //
+ // In general you shouldn't use this, rather use WindowServer::GetWindow(),
+ // which calls this as necessary.
+ ServerWindow* GetRootWithId(const WindowId& id);
+
+ WindowManagerDisplayRoot* GetWindowManagerDisplayRootWithRoot(
+ const ServerWindow* window);
+ WindowManagerDisplayRoot* GetWindowManagerDisplayRootForUser(
+ const UserId& user_id) {
+ return const_cast<WindowManagerDisplayRoot*>(
+ const_cast<const Display*>(this)->GetWindowManagerDisplayRootForUser(
+ user_id));
+ }
+ const WindowManagerDisplayRoot* GetWindowManagerDisplayRootForUser(
+ const UserId& user_id) const;
+ WindowManagerDisplayRoot* GetActiveWindowManagerDisplayRoot() {
+ return const_cast<WindowManagerDisplayRoot*>(
+ const_cast<const Display*>(this)->GetActiveWindowManagerDisplayRoot());
+ }
+ const WindowManagerDisplayRoot* GetActiveWindowManagerDisplayRoot() const;
+ size_t num_window_manger_states() const {
+ return window_manager_display_root_map_.size();
+ }
+
+ // TODO(sky): this should only be called by WindowServer, move to interface
+ // used by WindowServer.
+ // See description of WindowServer::SetFocusedWindow() for details on return
+ // value.
+ bool SetFocusedWindow(ServerWindow* window);
+ // NOTE: this returns the focused window only if the focused window is in this
+ // display. If this returns null focus may be in another display.
+ ServerWindow* GetFocusedWindow();
+
+ void ActivateNextWindow();
+
+ void AddActivationParent(ServerWindow* window);
+ void RemoveActivationParent(ServerWindow* window);
+
+ void UpdateTextInputState(ServerWindow* window,
+ const ui::TextInputState& state);
+ void SetImeVisibility(ServerWindow* window, bool visible);
+
+ // Called just before |tree| is destroyed.
+ void OnWillDestroyTree(WindowTree* tree);
+
+ void UpdateNativeCursor(int32_t cursor_id);
+
+ // mojom::WindowTreeHost:
+ void SetSize(const gfx::Size& size) override;
+ void SetTitle(const mojo::String& title) override;
+
+ private:
+ friend class test::DisplayTestApi;
+
+ using WindowManagerDisplayRootMap =
+ std::map<UserId, std::unique_ptr<WindowManagerDisplayRoot>>;
+
+ // Inits the necessary state once the display is ready.
+ void InitWindowManagerDisplayRootsIfNecessary();
+
+ // Creates the set of WindowManagerDisplayRoots from the
+ // WindowManagerWindowTreeFactorySet.
+ void CreateWindowManagerDisplayRootsFromFactories();
+
+ void CreateWindowManagerDisplayRootFromFactory(
+ WindowManagerWindowTreeFactory* factory);
+
+ // PlatformDisplayDelegate:
+ ServerWindow* GetRootWindow() override;
+ void OnEvent(const ui::Event& event) override;
+ void OnNativeCaptureLost() override;
+ void OnDisplayClosed() override;
+ void OnViewportMetricsChanged(const ViewportMetrics& old_metrics,
+ const ViewportMetrics& new_metrics) override;
+ void OnCompositorFrameDrawn() override;
+
+ // FocusControllerDelegate:
+ bool CanHaveActiveChildren(ServerWindow* window) const override;
+
+ // FocusControllerObserver:
+ void OnActivationChanged(ServerWindow* old_active_window,
+ ServerWindow* new_active_window) override;
+ void OnFocusChanged(FocusControllerChangeSource change_source,
+ ServerWindow* old_focused_window,
+ ServerWindow* new_focused_window) override;
+
+ // ServerWindowObserver:
+ void OnWindowDestroyed(ServerWindow* window) override;
+
+ // UserIdTrackerObserver:
+ void OnUserIdRemoved(const UserId& id) override;
+
+ // WindowManagerWindowTreeFactorySetObserver:
+ void OnWindowManagerWindowTreeFactoryReady(
+ WindowManagerWindowTreeFactory* factory) override;
+
+ const uint32_t id_;
+ std::unique_ptr<DisplayBinding> binding_;
+ // Set once Init() has been called.
+ bool init_called_ = false;
+ WindowServer* const window_server_;
+ std::unique_ptr<ServerWindow> root_;
+ std::unique_ptr<PlatformDisplay> platform_display_;
+ std::unique_ptr<FocusController> focus_controller_;
+
+ // The last cursor set. Used to track whether we need to change the cursor.
+ int32_t last_cursor_;
+
+ ServerWindowTracker activation_parents_;
+
+ // Set of windows with surfaces that need to be destroyed once the frame
+ // draws.
+ std::set<ServerWindow*> windows_needing_frame_destruction_;
+
+ WindowManagerDisplayRootMap window_manager_display_root_map_;
+
+ DISALLOW_COPY_AND_ASSIGN(Display);
+};
+
+} // namespace ws
+} // namespace mus
+
+#endif // COMPONENTS_MUS_WS_DISPLAY_H_