Index: components/mus/ws/window_tree.h |
diff --git a/components/mus/ws/window_tree.h b/components/mus/ws/window_tree.h |
deleted file mode 100644 |
index 0e804f355a116e70aeecc3cb1e81222f50cb526b..0000000000000000000000000000000000000000 |
--- a/components/mus/ws/window_tree.h |
+++ /dev/null |
@@ -1,497 +0,0 @@ |
-// Copyright 2014 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_WINDOW_TREE_H_ |
-#define COMPONENTS_MUS_WS_WINDOW_TREE_H_ |
- |
-#include <stdint.h> |
- |
-#include <map> |
-#include <memory> |
-#include <queue> |
-#include <set> |
-#include <string> |
-#include <vector> |
- |
-#include "base/callback.h" |
-#include "base/containers/hash_tables.h" |
-#include "base/macros.h" |
-#include "cc/ipc/surface_id.mojom.h" |
-#include "components/mus/public/interfaces/window_tree.mojom.h" |
-#include "components/mus/ws/access_policy_delegate.h" |
-#include "components/mus/ws/ids.h" |
-#include "components/mus/ws/user_id.h" |
-#include "components/mus/ws/window_tree_binding.h" |
-#include "mojo/public/cpp/bindings/associated_binding.h" |
- |
-namespace gfx { |
-class Insets; |
-class Rect; |
-} |
- |
-namespace ui { |
-class Event; |
-} |
- |
-namespace mus { |
-namespace ws { |
- |
-class AccessPolicy; |
-class DisplayManager; |
-class Display; |
-class EventMatcher; |
-class ServerWindow; |
-class TargetedEvent; |
-class WindowManagerDisplayRoot; |
-class WindowManagerState; |
-class WindowServer; |
-class WindowTreeTest; |
- |
-namespace test { |
-class WindowTreeTestApi; |
-} |
- |
-// WindowTree represents a view onto portions of the window tree. The parts of |
-// the tree exposed to the client start at the root windows. A WindowTree may |
-// have any number of roots (including none). A WindowTree may not have |
-// visibility of all the descendants of its roots. |
-// |
-// WindowTree notifies its client as changes happen to windows exposed to the |
-// the client. |
-// |
-// See ids.h for details on how WindowTree handles identity of windows. |
-class WindowTree : public mojom::WindowTree, |
- public AccessPolicyDelegate, |
- public mojom::WindowManagerClient { |
- public: |
- WindowTree(WindowServer* window_server, |
- const UserId& user_id, |
- ServerWindow* root, |
- std::unique_ptr<AccessPolicy> access_policy); |
- ~WindowTree() override; |
- |
- void Init(std::unique_ptr<WindowTreeBinding> binding, |
- mojom::WindowTreePtr tree); |
- |
- // Called if this WindowTree hosts a WindowManager. |
- void ConfigureWindowManager(); |
- |
- ClientSpecificId id() const { return id_; } |
- |
- void set_embedder_intercepts_events() { embedder_intercepts_events_ = true; } |
- bool embedder_intercepts_events() const { |
- return embedder_intercepts_events_; |
- } |
- |
- const UserId& user_id() const { return user_id_; } |
- |
- mojom::WindowTreeClient* client() { return binding_->client(); } |
- |
- // Returns the Window with the specified id. |
- ServerWindow* GetWindow(const WindowId& id) { |
- return const_cast<ServerWindow*>( |
- const_cast<const WindowTree*>(this)->GetWindow(id)); |
- } |
- const ServerWindow* GetWindow(const WindowId& id) const; |
- |
- // Returns the Window with the specified client id *only* if known to this |
- // client, returns null if not known. |
- ServerWindow* GetWindowByClientId(const ClientWindowId& id) { |
- return const_cast<ServerWindow*>( |
- const_cast<const WindowTree*>(this)->GetWindowByClientId(id)); |
- } |
- const ServerWindow* GetWindowByClientId(const ClientWindowId& id) const; |
- |
- bool IsWindowKnown(const ServerWindow* window) const { |
- return IsWindowKnown(window, nullptr); |
- } |
- // Returns whether |window| is known to this tree. If |window| is known and |
- // |client_window_id| is non-null |client_window_id| is set to the |
- // ClientWindowId of the window. |
- bool IsWindowKnown(const ServerWindow* window, |
- ClientWindowId* client_window_id) const; |
- |
- // Returns true if |window| is one of this trees roots. |
- bool HasRoot(const ServerWindow* window) const; |
- |
- std::set<const ServerWindow*> roots() { return roots_; } |
- |
- void set_name(const std::string& name) { name_ = name; } |
- const std::string& name() const { return name_; } |
- |
- bool janky() const { return janky_; } |
- |
- const Display* GetDisplay(const ServerWindow* window) const; |
- Display* GetDisplay(const ServerWindow* window) { |
- return const_cast<Display*>( |
- const_cast<const WindowTree*>(this)->GetDisplay(window)); |
- } |
- |
- const WindowManagerDisplayRoot* GetWindowManagerDisplayRoot( |
- const ServerWindow* window) const; |
- WindowManagerDisplayRoot* GetWindowManagerDisplayRoot( |
- const ServerWindow* window) { |
- return const_cast<WindowManagerDisplayRoot*>( |
- const_cast<const WindowTree*>(this)->GetWindowManagerDisplayRoot( |
- window)); |
- } |
- WindowManagerState* window_manager_state() { |
- return window_manager_state_.get(); |
- } |
- |
- DisplayManager* display_manager(); |
- const DisplayManager* display_manager() const; |
- |
- WindowServer* window_server() { return window_server_; } |
- const WindowServer* window_server() const { return window_server_; } |
- |
- // Adds a new root to this tree. This is only valid for window managers. |
- void AddRootForWindowManager(const ServerWindow* root); |
- |
- // Invoked when a tree is about to be destroyed. |
- void OnWindowDestroyingTreeImpl(WindowTree* tree); |
- |
- // These functions are synchronous variants of those defined in the mojom. The |
- // WindowTree implementations all call into these. See the mojom for details. |
- bool SetCapture(const ClientWindowId& client_window_id); |
- bool NewWindow(const ClientWindowId& client_window_id, |
- const std::map<std::string, std::vector<uint8_t>>& properties); |
- bool AddWindow(const ClientWindowId& parent_id, |
- const ClientWindowId& child_id); |
- bool AddTransientWindow(const ClientWindowId& window_id, |
- const ClientWindowId& transient_window_id); |
- bool SetModal(const ClientWindowId& window_id); |
- std::vector<const ServerWindow*> GetWindowTree( |
- const ClientWindowId& window_id) const; |
- bool SetWindowVisibility(const ClientWindowId& window_id, bool visible); |
- bool SetWindowOpacity(const ClientWindowId& window_id, float opacity); |
- bool SetFocus(const ClientWindowId& window_id); |
- bool Embed(const ClientWindowId& window_id, |
- mojom::WindowTreeClientPtr client, |
- uint32_t flags); |
- void DispatchInputEvent(ServerWindow* target, const ui::Event& event); |
- |
- bool IsWaitingForNewTopLevelWindow(uint32_t wm_change_id); |
- void OnWindowManagerCreatedTopLevelWindow(uint32_t wm_change_id, |
- uint32_t client_change_id, |
- const ServerWindow* window); |
- void AddActivationParent(const ClientWindowId& window_id); |
- |
- // Calls through to the client. |
- void OnChangeCompleted(uint32_t change_id, bool success); |
- void OnAccelerator(uint32_t accelerator_id, const ui::Event& event); |
- |
- // Called when |tree|'s jankiness changes (see janky_ for definition). |
- // Notifies the window manager client so it can update UI for the affected |
- // window(s). |
- void ClientJankinessChanged(WindowTree* tree); |
- |
- // The following methods are invoked after the corresponding change has been |
- // processed. They do the appropriate bookkeeping and update the client as |
- // necessary. |
- void ProcessWindowBoundsChanged(const ServerWindow* window, |
- const gfx::Rect& old_bounds, |
- const gfx::Rect& new_bounds, |
- bool originated_change); |
- void ProcessClientAreaChanged( |
- const ServerWindow* window, |
- const gfx::Insets& new_client_area, |
- const std::vector<gfx::Rect>& new_additional_client_areas, |
- bool originated_change); |
- void ProcessWillChangeWindowHierarchy(const ServerWindow* window, |
- const ServerWindow* new_parent, |
- const ServerWindow* old_parent, |
- bool originated_change); |
- void ProcessWindowPropertyChanged(const ServerWindow* window, |
- const std::string& name, |
- const std::vector<uint8_t>* new_data, |
- bool originated_change); |
- void ProcessWindowHierarchyChanged(const ServerWindow* window, |
- const ServerWindow* new_parent, |
- const ServerWindow* old_parent, |
- bool originated_change); |
- void ProcessWindowReorder(const ServerWindow* window, |
- const ServerWindow* relative_window, |
- mojom::OrderDirection direction, |
- bool originated_change); |
- void ProcessWindowDeleted(const ServerWindow* window, bool originated_change); |
- void ProcessWillChangeWindowVisibility(const ServerWindow* window, |
- bool originated_change); |
- void ProcessWindowOpacityChanged(const ServerWindow* window, |
- float old_opacity, |
- float new_opacity, |
- bool originated_change); |
- void ProcessCursorChanged(const ServerWindow* window, |
- int32_t cursor_id, |
- bool originated_change); |
- void ProcessFocusChanged(const ServerWindow* old_focused_window, |
- const ServerWindow* new_focused_window); |
- void ProcessLostCapture(const ServerWindow* old_lost_capture, |
- bool originated_change); |
- void ProcessTransientWindowAdded(const ServerWindow* window, |
- const ServerWindow* transient_window, |
- bool originated_change); |
- void ProcessTransientWindowRemoved(const ServerWindow* window, |
- const ServerWindow* transient_window, |
- bool originated_change); |
- |
- // Sends this event to the client if it matches an active event observer. |
- void SendToEventObserver(const ui::Event& event); |
- |
- private: |
- friend class test::WindowTreeTestApi; |
- |
- struct WaitingForTopLevelWindowInfo { |
- WaitingForTopLevelWindowInfo(const ClientWindowId& client_window_id, |
- uint32_t wm_change_id) |
- : client_window_id(client_window_id), wm_change_id(wm_change_id) {} |
- ~WaitingForTopLevelWindowInfo() {} |
- |
- // Id supplied from the client. |
- ClientWindowId client_window_id; |
- |
- // Change id we created for the window manager. |
- uint32_t wm_change_id; |
- }; |
- |
- enum class RemoveRootReason { |
- // The window is being removed. |
- DELETED, |
- |
- // Another client is being embedded in the window. |
- EMBED, |
- }; |
- |
- bool ShouldRouteToWindowManager(const ServerWindow* window) const; |
- |
- ClientWindowId ClientWindowIdForWindow(const ServerWindow* window) const; |
- |
- // Returns true if |id| is a valid WindowId for a new window. |
- bool IsValidIdForNewWindow(const ClientWindowId& id) const; |
- |
- WindowId GenerateNewWindowId(); |
- |
- // These functions return true if the corresponding mojom function is allowed |
- // for this tree. |
- bool CanReorderWindow(const ServerWindow* window, |
- const ServerWindow* relative_window, |
- mojom::OrderDirection direction) const; |
- |
- // Deletes a window owned by this tree. Returns true on success. |source| is |
- // the tree that originated the change. |
- bool DeleteWindowImpl(WindowTree* source, ServerWindow* window); |
- |
- // If |window| is known does nothing. Otherwise adds |window| to |windows|, |
- // marks |window| as known and recurses. |
- void GetUnknownWindowsFrom(const ServerWindow* window, |
- std::vector<const ServerWindow*>* windows); |
- |
- // Removes |window| from the appropriate maps. If |window| is known to this |
- // client true is returned. |
- bool RemoveFromMaps(const ServerWindow* window); |
- |
- // Removes |window| and all its descendants from the necessary maps. This |
- // does not recurse through windows that were created by this tree. All |
- // windows owned by this tree are added to |local_windows|. |
- void RemoveFromKnown(const ServerWindow* window, |
- std::vector<ServerWindow*>* local_windows); |
- |
- // Removes a root from set of roots of this tree. This does not remove |
- // the window from the window tree, only from the set of roots. |
- void RemoveRoot(const ServerWindow* window, RemoveRootReason reason); |
- |
- // Converts Window(s) to WindowData(s) for transport. This assumes all the |
- // windows are valid for the client. The parent of windows the client is not |
- // allowed to see are set to NULL (in the returned WindowData(s)). |
- mojo::Array<mojom::WindowDataPtr> WindowsToWindowDatas( |
- const std::vector<const ServerWindow*>& windows); |
- mojom::WindowDataPtr WindowToWindowData(const ServerWindow* window); |
- |
- // Implementation of GetWindowTree(). Adds |window| to |windows| and recurses |
- // if CanDescendIntoWindowForWindowTree() returns true. |
- void GetWindowTreeImpl(const ServerWindow* window, |
- std::vector<const ServerWindow*>* windows) const; |
- |
- // Notify the client if the drawn state of any of the roots changes. |
- // |window| is the window that is changing to the drawn state |
- // |new_drawn_value|. |
- void NotifyDrawnStateChanged(const ServerWindow* window, |
- bool new_drawn_value); |
- |
- // Deletes all Windows we own. |
- void DestroyWindows(); |
- |
- bool CanEmbed(const ClientWindowId& window_id) const; |
- void PrepareForEmbed(ServerWindow* window); |
- void RemoveChildrenAsPartOfEmbed(ServerWindow* window); |
- |
- void DispatchInputEventImpl(ServerWindow* target, const ui::Event& event); |
- |
- // Calls OnChangeCompleted() on the client. |
- void NotifyChangeCompleted(uint32_t change_id, |
- mojom::WindowManagerErrorCode error_code); |
- |
- // WindowTree: |
- void NewWindow(uint32_t change_id, |
- Id transport_window_id, |
- mojo::Map<mojo::String, mojo::Array<uint8_t>> |
- transport_properties) override; |
- void NewTopLevelWindow(uint32_t change_id, |
- Id transport_window_id, |
- mojo::Map<mojo::String, mojo::Array<uint8_t>> |
- transport_properties) override; |
- void DeleteWindow(uint32_t change_id, Id transport_window_id) override; |
- void AddWindow(uint32_t change_id, Id parent_id, Id child_id) override; |
- void RemoveWindowFromParent(uint32_t change_id, Id window_id) override; |
- void AddTransientWindow(uint32_t change_id, |
- Id window, |
- Id transient_window) override; |
- void RemoveTransientWindowFromParent(uint32_t change_id, |
- Id transient_window_id) override; |
- void SetModal(uint32_t change_id, Id window_id) override; |
- void ReorderWindow(uint32_t change_Id, |
- Id window_id, |
- Id relative_window_id, |
- mojom::OrderDirection direction) override; |
- void GetWindowTree( |
- Id window_id, |
- const base::Callback<void(mojo::Array<mojom::WindowDataPtr>)>& callback) |
- override; |
- void SetCapture(uint32_t change_id, Id window_id) override; |
- void ReleaseCapture(uint32_t change_id, Id window_id) override; |
- void SetEventObserver(mojom::EventMatcherPtr matcher, |
- uint32_t observer_id) override; |
- void SetWindowBounds(uint32_t change_id, |
- Id window_id, |
- const gfx::Rect& bounds) override; |
- void SetWindowVisibility(uint32_t change_id, |
- Id window_id, |
- bool visible) override; |
- void SetWindowProperty(uint32_t change_id, |
- Id transport_window_id, |
- const mojo::String& name, |
- mojo::Array<uint8_t> value) override; |
- void SetWindowOpacity(uint32_t change_id, |
- Id window_id, |
- float opacity) override; |
- void AttachSurface(Id transport_window_id, |
- mojom::SurfaceType type, |
- mojo::InterfaceRequest<mojom::Surface> surface, |
- mojom::SurfaceClientPtr client) override; |
- void Embed(Id transport_window_id, |
- mojom::WindowTreeClientPtr client, |
- uint32_t flags, |
- const EmbedCallback& callback) override; |
- void SetFocus(uint32_t change_id, Id transport_window_id) override; |
- void SetCanFocus(Id transport_window_id, bool can_focus) override; |
- void SetPredefinedCursor(uint32_t change_id, |
- Id transport_window_id, |
- mus::mojom::Cursor cursor_id) override; |
- void SetWindowTextInputState(Id transport_window_id, |
- mojo::TextInputStatePtr state) override; |
- void SetImeVisibility(Id transport_window_id, |
- bool visible, |
- mojo::TextInputStatePtr state) override; |
- void OnWindowInputEventAck(uint32_t event_id, |
- mojom::EventResult result) override; |
- void SetClientArea( |
- Id transport_window_id, |
- const gfx::Insets& insets, |
- mojo::Array<gfx::Rect> transport_additional_client_areas) override; |
- void SetHitTestMask(Id transport_window_id, const gfx::Rect& mask) override; |
- void GetWindowManagerClient( |
- mojo::AssociatedInterfaceRequest<mojom::WindowManagerClient> internal) |
- override; |
- void GetCursorLocationMemory(const GetCursorLocationMemoryCallback& callback) |
- override; |
- |
- // mojom::WindowManagerClient: |
- void AddAccelerator(uint32_t id, |
- mojom::EventMatcherPtr event_matcher, |
- const AddAcceleratorCallback& callback) override; |
- void RemoveAccelerator(uint32_t id) override; |
- void AddActivationParent(Id transport_window_id) override; |
- void RemoveActivationParent(Id transport_window_id) override; |
- void ActivateNextWindow() override; |
- void SetUnderlaySurfaceOffsetAndExtendedHitArea( |
- Id window_id, |
- int32_t x_offset, |
- int32_t y_offset, |
- const gfx::Insets& hit_area) override; |
- void WmResponse(uint32_t change_id, bool response) override; |
- void WmRequestClose(Id transport_window_id) override; |
- void WmSetFrameDecorationValues( |
- mojom::FrameDecorationValuesPtr values) override; |
- void WmSetNonClientCursor(uint32_t window_id, |
- mojom::Cursor cursor_id) override; |
- void OnWmCreatedTopLevelWindow(uint32_t change_id, |
- Id transport_window_id) override; |
- |
- // AccessPolicyDelegate: |
- bool HasRootForAccessPolicy(const ServerWindow* window) const override; |
- bool IsWindowKnownForAccessPolicy(const ServerWindow* window) const override; |
- bool IsWindowRootOfAnotherTreeForAccessPolicy( |
- const ServerWindow* window) const override; |
- |
- WindowServer* window_server_; |
- |
- UserId user_id_; |
- |
- // Id of this tree as assigned by WindowServer. |
- const ClientSpecificId id_; |
- std::string name_; |
- |
- ClientSpecificId next_window_id_; |
- |
- std::unique_ptr<WindowTreeBinding> binding_; |
- |
- std::unique_ptr<mus::ws::AccessPolicy> access_policy_; |
- |
- // The roots, or embed points, of this tree. A WindowTree may have any |
- // number of roots, including 0. |
- std::set<const ServerWindow*> roots_; |
- |
- // The windows created by this tree. This tree owns these objects. |
- base::hash_map<WindowId, ServerWindow*> created_window_map_; |
- |
- // The client is allowed to assign ids. These two maps providing the mapping |
- // from the ids native to the server (WindowId) to those understood by the |
- // client (ClientWindowId). |
- base::hash_map<ClientWindowId, WindowId> client_id_to_window_id_map_; |
- base::hash_map<WindowId, ClientWindowId> window_id_to_client_id_map_; |
- |
- uint32_t event_ack_id_; |
- |
- // A client is considered janky if it hasn't ACK'ed input events within a |
- // reasonable timeframe. |
- bool janky_ = false; |
- |
- // Set when the client is using SetEventObserver() to observe events, |
- // otherwise null. |
- std::unique_ptr<EventMatcher> event_observer_matcher_; |
- |
- // The ID supplied by the client for the current event observer. |
- uint32_t event_observer_id_ = 0; |
- |
- // WindowManager the current event came from. |
- WindowManagerState* event_source_wms_ = nullptr; |
- |
- std::queue<std::unique_ptr<TargetedEvent>> event_queue_; |
- |
- std::unique_ptr<mojo::AssociatedBinding<mojom::WindowManagerClient>> |
- window_manager_internal_client_binding_; |
- mojom::WindowManager* window_manager_internal_; |
- std::unique_ptr<WindowManagerState> window_manager_state_; |
- |
- std::unique_ptr<WaitingForTopLevelWindowInfo> |
- waiting_for_top_level_window_info_; |
- bool embedder_intercepts_events_ = false; |
- |
- DISALLOW_COPY_AND_ASSIGN(WindowTree); |
-}; |
- |
-} // namespace ws |
-} // namespace mus |
- |
-#endif // COMPONENTS_MUS_WS_WINDOW_TREE_H_ |