Index: components/mus/ws/ids.h |
diff --git a/components/mus/ws/ids.h b/components/mus/ws/ids.h |
index fdb3b5643d06ddeb7728972a4eddac5cd66f07b1..233f24dc9fb9dbcb30111dc7046ca9243d276b7b 100644 |
--- a/components/mus/ws/ids.h |
+++ b/components/mus/ws/ids.h |
@@ -9,18 +9,31 @@ |
#include <tuple> |
+#include "base/hash.h" |
#include "components/mus/common/types.h" |
#include "components/mus/common/util.h" |
namespace mus { |
- |
namespace ws { |
// Connection id is used to indicate no connection. That is, no WindowTreeImpl |
// ever gets this id. |
const ConnectionSpecificId kInvalidConnectionId = 0; |
-// Adds a bit of type safety to window ids. |
+// Every window has a unique id associated with it (WindowId). The id is a |
+// combination of the id assigned to the connection (the high order bits) and |
+// a unique id for the window. Each client (WindowTreeImpl) refers to the |
+// window by an id assigned by the client (ClientWindowId). To facilitate this |
+// WindowTreeImpl maintains a mapping between WindowId and ClientWindowId. |
+// |
+// This model works when the client initiates creation of windows, which is |
+// the typical use case. Embed roots and the WindowManager are special, they |
+// get access to windows created by other connections. These clients see the |
+// id assigned on the server. Such clients have to take care that they only |
+// create windows using their connection id. To do otherwise could result in |
+// multiple windows having the same ClientWindowId. WindowTreeImpl enforces |
+// that embed roots use the connection id in creating the window id to avoid |
+// possible conflicts. |
struct WindowId { |
WindowId(ConnectionSpecificId connection_id, ConnectionSpecificId window_id) |
: connection_id(connection_id), window_id(window_id) {} |
@@ -41,10 +54,25 @@ struct WindowId { |
ConnectionSpecificId window_id; |
}; |
+// Used for ids assigned by the client. |
+struct ClientWindowId { |
+ explicit ClientWindowId(Id id) : id(id) {} |
+ ClientWindowId() : id(0u) {} |
+ |
+ bool operator==(const ClientWindowId& other) const { return other.id == id; } |
+ |
+ bool operator!=(const ClientWindowId& other) const { |
+ return !(*this == other); |
+ } |
+ |
+ bool operator<(const ClientWindowId& other) const { return id < other.id; } |
+ |
+ Id id; |
+}; |
+ |
inline WindowId WindowIdFromTransportId(Id id) { |
return WindowId(HiWord(id), LoWord(id)); |
} |
- |
inline Id WindowIdToTransportId(const WindowId& id) { |
return (id.connection_id << 16) | id.window_id; |
} |
@@ -61,7 +89,24 @@ inline WindowId RootWindowId(uint16_t index) { |
} |
} // namespace ws |
- |
} // namespace mus |
+namespace BASE_HASH_NAMESPACE { |
+ |
+template <> |
+struct hash<mus::ws::ClientWindowId> { |
+ size_t operator()(const mus::ws::ClientWindowId& id) const { |
+ return hash<mus::Id>()(id.id); |
+ } |
+}; |
+ |
+template <> |
+struct hash<mus::ws::WindowId> { |
+ size_t operator()(const mus::ws::WindowId& id) const { |
+ return hash<mus::Id>()(WindowIdToTransportId(id)); |
+ } |
+}; |
+ |
+} // namespace BASE_HASH_NAMESPACE |
+ |
#endif // COMPONENTS_MUS_WS_IDS_H_ |