| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/mus/public/cpp/lib/window_tree_client_impl.h" | 5 #include "components/mus/public/cpp/window_tree_client.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/bind.h" | 13 #include "base/bind.h" |
| 14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 15 #include "components/mus/common/util.h" | 15 #include "components/mus/common/util.h" |
| 16 #include "components/mus/public/cpp/input_event_handler.h" | 16 #include "components/mus/public/cpp/input_event_handler.h" |
| 17 #include "components/mus/public/cpp/lib/in_flight_change.h" | 17 #include "components/mus/public/cpp/lib/in_flight_change.h" |
| 18 #include "components/mus/public/cpp/lib/window_private.h" | 18 #include "components/mus/public/cpp/lib/window_private.h" |
| 19 #include "components/mus/public/cpp/window_manager_delegate.h" | 19 #include "components/mus/public/cpp/window_manager_delegate.h" |
| 20 #include "components/mus/public/cpp/window_observer.h" | 20 #include "components/mus/public/cpp/window_observer.h" |
| 21 #include "components/mus/public/cpp/window_tracker.h" | 21 #include "components/mus/public/cpp/window_tracker.h" |
| 22 #include "components/mus/public/cpp/window_tree_connection.h" | 22 #include "components/mus/public/cpp/window_tree_client_delegate.h" |
| 23 #include "components/mus/public/cpp/window_tree_connection_observer.h" | 23 #include "components/mus/public/cpp/window_tree_client_observer.h" |
| 24 #include "components/mus/public/cpp/window_tree_delegate.h" | |
| 25 #include "services/shell/public/cpp/connector.h" | 24 #include "services/shell/public/cpp/connector.h" |
| 26 #include "ui/events/event.h" | 25 #include "ui/events/event.h" |
| 27 #include "ui/events/mojo/input_events_type_converters.h" | 26 #include "ui/events/mojo/input_events_type_converters.h" |
| 28 #include "ui/gfx/geometry/insets.h" | 27 #include "ui/gfx/geometry/insets.h" |
| 29 #include "ui/gfx/geometry/mojo/geometry_type_converters.h" | 28 #include "ui/gfx/geometry/mojo/geometry_type_converters.h" |
| 30 #include "ui/gfx/geometry/size.h" | 29 #include "ui/gfx/geometry/size.h" |
| 31 | 30 |
| 32 namespace mus { | 31 namespace mus { |
| 33 | 32 |
| 34 Id MakeTransportId(ClientSpecificId client_id, ClientSpecificId local_id) { | 33 Id MakeTransportId(ClientSpecificId client_id, ClientSpecificId local_id) { |
| 35 return (client_id << 16) | local_id; | 34 return (client_id << 16) | local_id; |
| 36 } | 35 } |
| 37 | 36 |
| 38 Id server_id(Window* window) { | 37 Id server_id(Window* window) { |
| 39 return WindowPrivate(window).server_id(); | 38 return WindowPrivate(window).server_id(); |
| 40 } | 39 } |
| 41 | 40 |
| 42 // Helper called to construct a local window object from transport data. | 41 // Helper called to construct a local window object from transport data. |
| 43 Window* AddWindowToClient(WindowTreeClientImpl* client, | 42 Window* AddWindowToClient(WindowTreeClient* client, |
| 44 Window* parent, | 43 Window* parent, |
| 45 const mojom::WindowDataPtr& window_data) { | 44 const mojom::WindowDataPtr& window_data) { |
| 46 // We don't use the ctor that takes a WindowTreeConnection here, since it | 45 // We don't use the ctor that takes a WindowTreeClient here, since it will |
| 47 // will call back to the service and attempt to create a new window. | 46 // call back to the service and attempt to create a new window. |
| 48 Window* window = WindowPrivate::LocalCreate(); | 47 Window* window = WindowPrivate::LocalCreate(); |
| 49 WindowPrivate private_window(window); | 48 WindowPrivate private_window(window); |
| 50 private_window.set_connection(client); | 49 private_window.set_client(client); |
| 51 private_window.set_server_id(window_data->window_id); | 50 private_window.set_server_id(window_data->window_id); |
| 52 private_window.set_visible(window_data->visible); | 51 private_window.set_visible(window_data->visible); |
| 53 private_window.LocalSetDisplay(window_data->display_id); | 52 private_window.LocalSetDisplay(window_data->display_id); |
| 54 private_window.set_properties( | 53 private_window.set_properties( |
| 55 window_data->properties | 54 window_data->properties |
| 56 .To<std::map<std::string, std::vector<uint8_t>>>()); | 55 .To<std::map<std::string, std::vector<uint8_t>>>()); |
| 57 client->AddWindow(window); | 56 client->AddWindow(window); |
| 58 private_window.LocalSetBounds(gfx::Rect(), | 57 private_window.LocalSetBounds(gfx::Rect(), |
| 59 window_data->bounds.To<gfx::Rect>()); | 58 window_data->bounds.To<gfx::Rect>()); |
| 60 if (parent) | 59 if (parent) |
| 61 WindowPrivate(parent).LocalAddChild(window); | 60 WindowPrivate(parent).LocalAddChild(window); |
| 62 return window; | 61 return window; |
| 63 } | 62 } |
| 64 | 63 |
| 65 Window* BuildWindowTree(WindowTreeClientImpl* client, | 64 Window* BuildWindowTree(WindowTreeClient* client, |
| 66 const mojo::Array<mojom::WindowDataPtr>& windows, | 65 const mojo::Array<mojom::WindowDataPtr>& windows, |
| 67 Window* initial_parent) { | 66 Window* initial_parent) { |
| 68 std::vector<Window*> parents; | 67 std::vector<Window*> parents; |
| 69 Window* root = NULL; | 68 Window* root = NULL; |
| 70 Window* last_window = NULL; | 69 Window* last_window = NULL; |
| 71 if (initial_parent) | 70 if (initial_parent) |
| 72 parents.push_back(initial_parent); | 71 parents.push_back(initial_parent); |
| 73 for (size_t i = 0; i < windows.size(); ++i) { | 72 for (size_t i = 0; i < windows.size(); ++i) { |
| 74 if (last_window && windows[i]->parent_id == server_id(last_window)) { | 73 if (last_window && windows[i]->parent_id == server_id(last_window)) { |
| 75 parents.push_back(last_window); | 74 parents.push_back(last_window); |
| 76 } else if (!parents.empty()) { | 75 } else if (!parents.empty()) { |
| 77 while (server_id(parents.back()) != windows[i]->parent_id) | 76 while (server_id(parents.back()) != windows[i]->parent_id) |
| 78 parents.pop_back(); | 77 parents.pop_back(); |
| 79 } | 78 } |
| 80 Window* window = AddWindowToClient( | 79 Window* window = AddWindowToClient( |
| 81 client, !parents.empty() ? parents.back() : NULL, windows[i]); | 80 client, !parents.empty() ? parents.back() : NULL, windows[i]); |
| 82 if (!last_window) | 81 if (!last_window) |
| 83 root = window; | 82 root = window; |
| 84 last_window = window; | 83 last_window = window; |
| 85 } | 84 } |
| 86 return root; | 85 return root; |
| 87 } | 86 } |
| 88 | 87 |
| 89 WindowTreeConnection* WindowTreeConnection::Create( | 88 WindowTreeClient::WindowTreeClient( |
| 90 WindowTreeDelegate* delegate, | 89 WindowTreeClientDelegate* delegate, |
| 91 shell::Connector* connector) { | |
| 92 WindowTreeClientImpl* client = | |
| 93 new WindowTreeClientImpl(delegate, nullptr, nullptr); | |
| 94 client->ConnectViaWindowTreeFactory(connector); | |
| 95 return client; | |
| 96 } | |
| 97 | |
| 98 WindowTreeConnection* WindowTreeConnection::Create( | |
| 99 WindowTreeDelegate* delegate, | |
| 100 mojo::InterfaceRequest<mojom::WindowTreeClient> request, | |
| 101 CreateType create_type) { | |
| 102 WindowTreeClientImpl* client = | |
| 103 new WindowTreeClientImpl(delegate, nullptr, std::move(request)); | |
| 104 if (create_type == CreateType::WAIT_FOR_EMBED) | |
| 105 client->WaitForEmbed(); | |
| 106 return client; | |
| 107 } | |
| 108 | |
| 109 WindowTreeConnection* WindowTreeConnection::CreateForWindowManager( | |
| 110 WindowTreeDelegate* delegate, | |
| 111 mojo::InterfaceRequest<mojom::WindowTreeClient> request, | |
| 112 CreateType create_type, | |
| 113 WindowManagerDelegate* window_manager_delegate) { | |
| 114 WindowTreeClientImpl* client = new WindowTreeClientImpl( | |
| 115 delegate, window_manager_delegate, std::move(request)); | |
| 116 if (create_type == CreateType::WAIT_FOR_EMBED) | |
| 117 client->WaitForEmbed(); | |
| 118 return client; | |
| 119 } | |
| 120 | |
| 121 WindowTreeClientImpl::WindowTreeClientImpl( | |
| 122 WindowTreeDelegate* delegate, | |
| 123 WindowManagerDelegate* window_manager_delegate, | 90 WindowManagerDelegate* window_manager_delegate, |
| 124 mojo::InterfaceRequest<mojom::WindowTreeClient> request) | 91 mojo::InterfaceRequest<mojom::WindowTreeClient> request) |
| 125 : client_id_(0), | 92 : client_id_(0), |
| 126 next_window_id_(1), | 93 next_window_id_(1), |
| 127 next_change_id_(1), | 94 next_change_id_(1), |
| 128 delegate_(delegate), | 95 delegate_(delegate), |
| 129 window_manager_delegate_(window_manager_delegate), | 96 window_manager_delegate_(window_manager_delegate), |
| 130 capture_window_(nullptr), | 97 capture_window_(nullptr), |
| 131 focused_window_(nullptr), | 98 focused_window_(nullptr), |
| 132 binding_(this), | 99 binding_(this), |
| 133 tree_(nullptr), | 100 tree_(nullptr), |
| 134 delete_on_no_roots_(true), | 101 delete_on_no_roots_(true), |
| 135 in_destructor_(false), | 102 in_destructor_(false), |
| 136 cursor_location_memory_(nullptr), | 103 cursor_location_memory_(nullptr), |
| 137 weak_factory_(this) { | 104 weak_factory_(this) { |
| 138 // Allow for a null request in tests. | 105 // Allow for a null request in tests. |
| 139 if (request.is_pending()) | 106 if (request.is_pending()) |
| 140 binding_.Bind(std::move(request)); | 107 binding_.Bind(std::move(request)); |
| 141 if (window_manager_delegate) | 108 if (window_manager_delegate) |
| 142 window_manager_delegate->SetWindowManagerClient(this); | 109 window_manager_delegate->SetWindowManagerClient(this); |
| 143 } | 110 } |
| 144 | 111 |
| 145 WindowTreeClientImpl::~WindowTreeClientImpl() { | 112 WindowTreeClient::~WindowTreeClient() { |
| 146 in_destructor_ = true; | 113 in_destructor_ = true; |
| 147 | 114 |
| 148 std::vector<Window*> non_owned; | 115 std::vector<Window*> non_owned; |
| 149 WindowTracker tracker; | 116 WindowTracker tracker; |
| 150 while (!windows_.empty()) { | 117 while (!windows_.empty()) { |
| 151 IdToWindowMap::iterator it = windows_.begin(); | 118 IdToWindowMap::iterator it = windows_.begin(); |
| 152 if (OwnsWindow(it->second)) { | 119 if (OwnsWindow(it->second)) { |
| 153 it->second->Destroy(); | 120 it->second->Destroy(); |
| 154 } else { | 121 } else { |
| 155 tracker.Add(it->second); | 122 tracker.Add(it->second); |
| 156 windows_.erase(it); | 123 windows_.erase(it); |
| 157 } | 124 } |
| 158 } | 125 } |
| 159 | 126 |
| 160 // Delete the non-owned windows last. In the typical case these are roots. The | 127 // Delete the non-owned windows last. In the typical case these are roots. The |
| 161 // exception is the window manager and embed roots, which may know about | 128 // exception is the window manager and embed roots, which may know about |
| 162 // other random windows that it doesn't own. | 129 // other random windows that it doesn't own. |
| 163 // NOTE: we manually delete as we're a friend. | 130 // NOTE: we manually delete as we're a friend. |
| 164 while (!tracker.windows().empty()) | 131 while (!tracker.windows().empty()) |
| 165 delete tracker.windows().front(); | 132 delete tracker.windows().front(); |
| 166 | 133 |
| 167 FOR_EACH_OBSERVER(WindowTreeConnectionObserver, observers_, | 134 FOR_EACH_OBSERVER(WindowTreeClientObserver, observers_, |
| 168 OnWillDestroyConnection(this)); | 135 OnWillDestroyClient(this)); |
| 169 | 136 |
| 170 delegate_->OnConnectionLost(this); | 137 delegate_->OnWindowTreeClientDestroyed(this); |
| 171 } | 138 } |
| 172 | 139 |
| 173 void WindowTreeClientImpl::ConnectViaWindowTreeFactory( | 140 void WindowTreeClient::ConnectViaWindowTreeFactory( |
| 174 shell::Connector* connector) { | 141 shell::Connector* connector) { |
| 175 // Clients created with no root shouldn't delete automatically. | 142 // Clients created with no root shouldn't delete automatically. |
| 176 delete_on_no_roots_ = false; | 143 delete_on_no_roots_ = false; |
| 177 | 144 |
| 178 // The client id doesn't really matter, we use 101 purely for debugging. | 145 // The client id doesn't really matter, we use 101 purely for debugging. |
| 179 client_id_ = 101; | 146 client_id_ = 101; |
| 180 | 147 |
| 181 mojom::WindowTreeFactoryPtr factory; | 148 mojom::WindowTreeFactoryPtr factory; |
| 182 connector->ConnectToInterface("mojo:mus", &factory); | 149 connector->ConnectToInterface("mojo:mus", &factory); |
| 183 factory->CreateWindowTree(GetProxy(&tree_ptr_), | 150 factory->CreateWindowTree(GetProxy(&tree_ptr_), |
| 184 binding_.CreateInterfacePtrAndBind()); | 151 binding_.CreateInterfacePtrAndBind()); |
| 185 tree_ = tree_ptr_.get(); | 152 tree_ = tree_ptr_.get(); |
| 186 | 153 |
| 187 tree_ptr_->GetCursorLocationMemory( | 154 tree_ptr_->GetCursorLocationMemory( |
| 188 base::Bind(&WindowTreeClientImpl::OnReceivedCursorLocationMemory, | 155 base::Bind(&WindowTreeClient::OnReceivedCursorLocationMemory, |
| 189 weak_factory_.GetWeakPtr())); | 156 weak_factory_.GetWeakPtr())); |
| 190 } | 157 } |
| 191 | 158 |
| 192 void WindowTreeClientImpl::WaitForEmbed() { | 159 void WindowTreeClient::WaitForEmbed() { |
| 193 DCHECK(roots_.empty()); | 160 DCHECK(roots_.empty()); |
| 194 // OnEmbed() is the first function called. | 161 // OnEmbed() is the first function called. |
| 195 binding_.WaitForIncomingMethodCall(); | 162 binding_.WaitForIncomingMethodCall(); |
| 196 // TODO(sky): deal with pipe being closed before we get OnEmbed(). | 163 // TODO(sky): deal with pipe being closed before we get OnEmbed(). |
| 197 } | 164 } |
| 198 | 165 |
| 199 void WindowTreeClientImpl::DestroyWindow(Window* window) { | 166 void WindowTreeClient::DestroyWindow(Window* window) { |
| 200 DCHECK(tree_); | 167 DCHECK(tree_); |
| 201 const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique( | 168 const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique( |
| 202 new CrashInFlightChange(window, ChangeType::DELETE_WINDOW))); | 169 new CrashInFlightChange(window, ChangeType::DELETE_WINDOW))); |
| 203 tree_->DeleteWindow(change_id, server_id(window)); | 170 tree_->DeleteWindow(change_id, server_id(window)); |
| 204 } | 171 } |
| 205 | 172 |
| 206 void WindowTreeClientImpl::AddChild(Window* parent, Id child_id) { | 173 void WindowTreeClient::AddChild(Window* parent, Id child_id) { |
| 207 DCHECK(tree_); | 174 DCHECK(tree_); |
| 208 const uint32_t change_id = ScheduleInFlightChange( | 175 const uint32_t change_id = ScheduleInFlightChange( |
| 209 base::WrapUnique(new CrashInFlightChange(parent, ChangeType::ADD_CHILD))); | 176 base::WrapUnique(new CrashInFlightChange(parent, ChangeType::ADD_CHILD))); |
| 210 tree_->AddWindow(change_id, parent->server_id(), child_id); | 177 tree_->AddWindow(change_id, parent->server_id(), child_id); |
| 211 } | 178 } |
| 212 | 179 |
| 213 void WindowTreeClientImpl::RemoveChild(Window* parent, Id child_id) { | 180 void WindowTreeClient::RemoveChild(Window* parent, Id child_id) { |
| 214 DCHECK(tree_); | 181 DCHECK(tree_); |
| 215 const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique( | 182 const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique( |
| 216 new CrashInFlightChange(parent, ChangeType::REMOVE_CHILD))); | 183 new CrashInFlightChange(parent, ChangeType::REMOVE_CHILD))); |
| 217 tree_->RemoveWindowFromParent(change_id, child_id); | 184 tree_->RemoveWindowFromParent(change_id, child_id); |
| 218 } | 185 } |
| 219 | 186 |
| 220 void WindowTreeClientImpl::AddTransientWindow(Window* window, | 187 void WindowTreeClient::AddTransientWindow(Window* window, |
| 221 Id transient_window_id) { | 188 Id transient_window_id) { |
| 222 DCHECK(tree_); | 189 DCHECK(tree_); |
| 223 const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique( | 190 const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique( |
| 224 new CrashInFlightChange(window, ChangeType::ADD_TRANSIENT_WINDOW))); | 191 new CrashInFlightChange(window, ChangeType::ADD_TRANSIENT_WINDOW))); |
| 225 tree_->AddTransientWindow(change_id, server_id(window), transient_window_id); | 192 tree_->AddTransientWindow(change_id, server_id(window), transient_window_id); |
| 226 } | 193 } |
| 227 | 194 |
| 228 void WindowTreeClientImpl::RemoveTransientWindowFromParent(Window* window) { | 195 void WindowTreeClient::RemoveTransientWindowFromParent(Window* window) { |
| 229 DCHECK(tree_); | 196 DCHECK(tree_); |
| 230 const uint32_t change_id = | 197 const uint32_t change_id = |
| 231 ScheduleInFlightChange(base::WrapUnique(new CrashInFlightChange( | 198 ScheduleInFlightChange(base::WrapUnique(new CrashInFlightChange( |
| 232 window, ChangeType::REMOVE_TRANSIENT_WINDOW_FROM_PARENT))); | 199 window, ChangeType::REMOVE_TRANSIENT_WINDOW_FROM_PARENT))); |
| 233 tree_->RemoveTransientWindowFromParent(change_id, server_id(window)); | 200 tree_->RemoveTransientWindowFromParent(change_id, server_id(window)); |
| 234 } | 201 } |
| 235 | 202 |
| 236 void WindowTreeClientImpl::SetModal(Window* window) { | 203 void WindowTreeClient::SetModal(Window* window) { |
| 237 DCHECK(tree_); | 204 DCHECK(tree_); |
| 238 const uint32_t change_id = ScheduleInFlightChange( | 205 const uint32_t change_id = ScheduleInFlightChange( |
| 239 base::WrapUnique(new InFlightSetModalChange(window))); | 206 base::WrapUnique(new InFlightSetModalChange(window))); |
| 240 tree_->SetModal(change_id, server_id(window)); | 207 tree_->SetModal(change_id, server_id(window)); |
| 241 } | 208 } |
| 242 | 209 |
| 243 void WindowTreeClientImpl::Reorder(Window* window, | 210 void WindowTreeClient::Reorder(Window* window, |
| 244 Id relative_window_id, | 211 Id relative_window_id, |
| 245 mojom::OrderDirection direction) { | 212 mojom::OrderDirection direction) { |
| 246 DCHECK(tree_); | 213 DCHECK(tree_); |
| 247 const uint32_t change_id = ScheduleInFlightChange( | 214 const uint32_t change_id = ScheduleInFlightChange( |
| 248 base::WrapUnique(new CrashInFlightChange(window, ChangeType::REORDER))); | 215 base::WrapUnique(new CrashInFlightChange(window, ChangeType::REORDER))); |
| 249 tree_->ReorderWindow(change_id, server_id(window), relative_window_id, | 216 tree_->ReorderWindow(change_id, server_id(window), relative_window_id, |
| 250 direction); | 217 direction); |
| 251 } | 218 } |
| 252 | 219 |
| 253 bool WindowTreeClientImpl::OwnsWindow(Window* window) const { | 220 bool WindowTreeClient::OwnsWindow(Window* window) const { |
| 254 // Windows created via CreateTopLevelWindow() are not owned by us, but have | 221 // Windows created via CreateTopLevelWindow() are not owned by us, but have |
| 255 // our client id. | 222 // our client id. |
| 256 return HiWord(server_id(window)) == client_id_ && | 223 return HiWord(server_id(window)) == client_id_ && |
| 257 roots_.count(window) == 0; | 224 roots_.count(window) == 0; |
| 258 } | 225 } |
| 259 | 226 |
| 260 void WindowTreeClientImpl::SetBounds(Window* window, | 227 void WindowTreeClient::SetBounds(Window* window, |
| 261 const gfx::Rect& old_bounds, | 228 const gfx::Rect& old_bounds, |
| 262 const gfx::Rect& bounds) { | 229 const gfx::Rect& bounds) { |
| 263 DCHECK(tree_); | 230 DCHECK(tree_); |
| 264 const uint32_t change_id = ScheduleInFlightChange( | 231 const uint32_t change_id = ScheduleInFlightChange( |
| 265 base::WrapUnique(new InFlightBoundsChange(window, old_bounds))); | 232 base::WrapUnique(new InFlightBoundsChange(window, old_bounds))); |
| 266 tree_->SetWindowBounds(change_id, server_id(window), | 233 tree_->SetWindowBounds(change_id, server_id(window), |
| 267 mojo::Rect::From(bounds)); | 234 mojo::Rect::From(bounds)); |
| 268 } | 235 } |
| 269 | 236 |
| 270 void WindowTreeClientImpl::SetCapture(Window* window) { | 237 void WindowTreeClient::SetCapture(Window* window) { |
| 271 // In order for us to get here we had to have exposed a window, which implies | 238 // In order for us to get here we had to have exposed a window, which implies |
| 272 // we got a client. | 239 // we got a client. |
| 273 DCHECK(tree_); | 240 DCHECK(tree_); |
| 274 if (capture_window_ == window) | 241 if (capture_window_ == window) |
| 275 return; | 242 return; |
| 276 const uint32_t change_id = ScheduleInFlightChange( | 243 const uint32_t change_id = ScheduleInFlightChange( |
| 277 base::WrapUnique(new InFlightCaptureChange(this, capture_window_))); | 244 base::WrapUnique(new InFlightCaptureChange(this, capture_window_))); |
| 278 tree_->SetCapture(change_id, server_id(window)); | 245 tree_->SetCapture(change_id, server_id(window)); |
| 279 LocalSetCapture(window); | 246 LocalSetCapture(window); |
| 280 } | 247 } |
| 281 | 248 |
| 282 void WindowTreeClientImpl::ReleaseCapture(Window* window) { | 249 void WindowTreeClient::ReleaseCapture(Window* window) { |
| 283 // In order for us to get here we had to have exposed a window, which implies | 250 // In order for us to get here we had to have exposed a window, which implies |
| 284 // we got a client. | 251 // we got a client. |
| 285 DCHECK(tree_); | 252 DCHECK(tree_); |
| 286 if (capture_window_ != window) | 253 if (capture_window_ != window) |
| 287 return; | 254 return; |
| 288 const uint32_t change_id = ScheduleInFlightChange( | 255 const uint32_t change_id = ScheduleInFlightChange( |
| 289 base::WrapUnique(new InFlightCaptureChange(this, window))); | 256 base::WrapUnique(new InFlightCaptureChange(this, window))); |
| 290 tree_->ReleaseCapture(change_id, server_id(window)); | 257 tree_->ReleaseCapture(change_id, server_id(window)); |
| 291 LocalSetCapture(nullptr); | 258 LocalSetCapture(nullptr); |
| 292 } | 259 } |
| 293 | 260 |
| 294 void WindowTreeClientImpl::SetClientArea( | 261 void WindowTreeClient::SetClientArea( |
| 295 Id window_id, | 262 Id window_id, |
| 296 const gfx::Insets& client_area, | 263 const gfx::Insets& client_area, |
| 297 const std::vector<gfx::Rect>& additional_client_areas) { | 264 const std::vector<gfx::Rect>& additional_client_areas) { |
| 298 DCHECK(tree_); | 265 DCHECK(tree_); |
| 299 tree_->SetClientArea( | 266 tree_->SetClientArea( |
| 300 window_id, mojo::Insets::From(client_area), | 267 window_id, mojo::Insets::From(client_area), |
| 301 mojo::Array<mojo::RectPtr>::From(additional_client_areas)); | 268 mojo::Array<mojo::RectPtr>::From(additional_client_areas)); |
| 302 } | 269 } |
| 303 | 270 |
| 304 void WindowTreeClientImpl::SetHitTestMask(Id window_id, const gfx::Rect& mask) { | 271 void WindowTreeClient::SetHitTestMask(Id window_id, const gfx::Rect& mask) { |
| 305 DCHECK(tree_); | 272 DCHECK(tree_); |
| 306 tree_->SetHitTestMask(window_id, mojo::Rect::From(mask)); | 273 tree_->SetHitTestMask(window_id, mojo::Rect::From(mask)); |
| 307 } | 274 } |
| 308 | 275 |
| 309 void WindowTreeClientImpl::ClearHitTestMask(Id window_id) { | 276 void WindowTreeClient::ClearHitTestMask(Id window_id) { |
| 310 DCHECK(tree_); | 277 DCHECK(tree_); |
| 311 tree_->SetHitTestMask(window_id, nullptr); | 278 tree_->SetHitTestMask(window_id, nullptr); |
| 312 } | 279 } |
| 313 | 280 |
| 314 void WindowTreeClientImpl::SetFocus(Window* window) { | 281 void WindowTreeClient::SetFocus(Window* window) { |
| 315 // In order for us to get here we had to have exposed a window, which implies | 282 // In order for us to get here we had to have exposed a window, which implies |
| 316 // we got a client. | 283 // we got a client. |
| 317 DCHECK(tree_); | 284 DCHECK(tree_); |
| 318 const uint32_t change_id = ScheduleInFlightChange( | 285 const uint32_t change_id = ScheduleInFlightChange( |
| 319 base::WrapUnique(new InFlightFocusChange(this, focused_window_))); | 286 base::WrapUnique(new InFlightFocusChange(this, focused_window_))); |
| 320 tree_->SetFocus(change_id, window ? server_id(window) : 0); | 287 tree_->SetFocus(change_id, window ? server_id(window) : 0); |
| 321 LocalSetFocus(window); | 288 LocalSetFocus(window); |
| 322 } | 289 } |
| 323 | 290 |
| 324 void WindowTreeClientImpl::SetCanFocus(Id window_id, bool can_focus) { | 291 void WindowTreeClient::SetCanFocus(Id window_id, bool can_focus) { |
| 325 DCHECK(tree_); | 292 DCHECK(tree_); |
| 326 tree_->SetCanFocus(window_id, can_focus); | 293 tree_->SetCanFocus(window_id, can_focus); |
| 327 } | 294 } |
| 328 | 295 |
| 329 void WindowTreeClientImpl::SetPredefinedCursor(Id window_id, | 296 void WindowTreeClient::SetPredefinedCursor(Id window_id, |
| 330 mus::mojom::Cursor cursor_id) { | 297 mus::mojom::Cursor cursor_id) { |
| 331 DCHECK(tree_); | 298 DCHECK(tree_); |
| 332 | 299 |
| 333 Window* window = GetWindowByServerId(window_id); | 300 Window* window = GetWindowByServerId(window_id); |
| 334 if (!window) | 301 if (!window) |
| 335 return; | 302 return; |
| 336 | 303 |
| 337 // We make an inflight change thing here. | 304 // We make an inflight change thing here. |
| 338 const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique( | 305 const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique( |
| 339 new InFlightPredefinedCursorChange(window, window->predefined_cursor()))); | 306 new InFlightPredefinedCursorChange(window, window->predefined_cursor()))); |
| 340 tree_->SetPredefinedCursor(change_id, window_id, cursor_id); | 307 tree_->SetPredefinedCursor(change_id, window_id, cursor_id); |
| 341 } | 308 } |
| 342 | 309 |
| 343 void WindowTreeClientImpl::SetVisible(Window* window, bool visible) { | 310 void WindowTreeClient::SetVisible(Window* window, bool visible) { |
| 344 DCHECK(tree_); | 311 DCHECK(tree_); |
| 345 const uint32_t change_id = ScheduleInFlightChange( | 312 const uint32_t change_id = ScheduleInFlightChange( |
| 346 base::WrapUnique(new InFlightVisibleChange(window, !visible))); | 313 base::WrapUnique(new InFlightVisibleChange(window, !visible))); |
| 347 tree_->SetWindowVisibility(change_id, server_id(window), visible); | 314 tree_->SetWindowVisibility(change_id, server_id(window), visible); |
| 348 } | 315 } |
| 349 | 316 |
| 350 void WindowTreeClientImpl::SetOpacity(Window* window, float opacity) { | 317 void WindowTreeClient::SetOpacity(Window* window, float opacity) { |
| 351 DCHECK(tree_); | 318 DCHECK(tree_); |
| 352 const uint32_t change_id = ScheduleInFlightChange( | 319 const uint32_t change_id = ScheduleInFlightChange( |
| 353 base::WrapUnique(new InFlightOpacityChange(window, window->opacity()))); | 320 base::WrapUnique(new InFlightOpacityChange(window, window->opacity()))); |
| 354 tree_->SetWindowOpacity(change_id, server_id(window), opacity); | 321 tree_->SetWindowOpacity(change_id, server_id(window), opacity); |
| 355 } | 322 } |
| 356 | 323 |
| 357 void WindowTreeClientImpl::SetProperty(Window* window, | 324 void WindowTreeClient::SetProperty(Window* window, |
| 358 const std::string& name, | 325 const std::string& name, |
| 359 mojo::Array<uint8_t> data) { | 326 mojo::Array<uint8_t> data) { |
| 360 DCHECK(tree_); | 327 DCHECK(tree_); |
| 361 | 328 |
| 362 mojo::Array<uint8_t> old_value(nullptr); | 329 mojo::Array<uint8_t> old_value(nullptr); |
| 363 if (window->HasSharedProperty(name)) | 330 if (window->HasSharedProperty(name)) |
| 364 old_value = mojo::Array<uint8_t>::From(window->properties_[name]); | 331 old_value = mojo::Array<uint8_t>::From(window->properties_[name]); |
| 365 | 332 |
| 366 const uint32_t change_id = ScheduleInFlightChange( | 333 const uint32_t change_id = ScheduleInFlightChange( |
| 367 base::WrapUnique(new InFlightPropertyChange(window, name, old_value))); | 334 base::WrapUnique(new InFlightPropertyChange(window, name, old_value))); |
| 368 tree_->SetWindowProperty(change_id, server_id(window), mojo::String(name), | 335 tree_->SetWindowProperty(change_id, server_id(window), mojo::String(name), |
| 369 std::move(data)); | 336 std::move(data)); |
| 370 } | 337 } |
| 371 | 338 |
| 372 void WindowTreeClientImpl::SetWindowTextInputState( | 339 void WindowTreeClient::SetWindowTextInputState( |
| 373 Id window_id, | 340 Id window_id, |
| 374 mojo::TextInputStatePtr state) { | 341 mojo::TextInputStatePtr state) { |
| 375 DCHECK(tree_); | 342 DCHECK(tree_); |
| 376 tree_->SetWindowTextInputState(window_id, std::move(state)); | 343 tree_->SetWindowTextInputState(window_id, std::move(state)); |
| 377 } | 344 } |
| 378 | 345 |
| 379 void WindowTreeClientImpl::SetImeVisibility(Id window_id, | 346 void WindowTreeClient::SetImeVisibility(Id window_id, |
| 380 bool visible, | 347 bool visible, |
| 381 mojo::TextInputStatePtr state) { | 348 mojo::TextInputStatePtr state) { |
| 382 DCHECK(tree_); | 349 DCHECK(tree_); |
| 383 tree_->SetImeVisibility(window_id, visible, std::move(state)); | 350 tree_->SetImeVisibility(window_id, visible, std::move(state)); |
| 384 } | 351 } |
| 385 | 352 |
| 386 void WindowTreeClientImpl::Embed( | 353 void WindowTreeClient::Embed( |
| 387 Id window_id, | 354 Id window_id, |
| 388 mojom::WindowTreeClientPtr client, | 355 mojom::WindowTreeClientPtr client, |
| 389 const mojom::WindowTree::EmbedCallback& callback) { | 356 const mojom::WindowTree::EmbedCallback& callback) { |
| 390 DCHECK(tree_); | 357 DCHECK(tree_); |
| 391 tree_->Embed(window_id, std::move(client), callback); | 358 tree_->Embed(window_id, std::move(client), callback); |
| 392 } | 359 } |
| 393 | 360 |
| 394 void WindowTreeClientImpl::RequestClose(Window* window) { | 361 void WindowTreeClient::RequestClose(Window* window) { |
| 395 if (window_manager_internal_client_) | 362 if (window_manager_internal_client_) |
| 396 window_manager_internal_client_->WmRequestClose(server_id(window)); | 363 window_manager_internal_client_->WmRequestClose(server_id(window)); |
| 397 } | 364 } |
| 398 | 365 |
| 399 void WindowTreeClientImpl::AttachSurface( | 366 void WindowTreeClient::AttachSurface( |
| 400 Id window_id, | 367 Id window_id, |
| 401 mojom::SurfaceType type, | 368 mojom::SurfaceType type, |
| 402 mojo::InterfaceRequest<mojom::Surface> surface, | 369 mojo::InterfaceRequest<mojom::Surface> surface, |
| 403 mojom::SurfaceClientPtr client) { | 370 mojom::SurfaceClientPtr client) { |
| 404 DCHECK(tree_); | 371 DCHECK(tree_); |
| 405 tree_->AttachSurface(window_id, type, std::move(surface), std::move(client)); | 372 tree_->AttachSurface(window_id, type, std::move(surface), std::move(client)); |
| 406 } | 373 } |
| 407 | 374 |
| 408 void WindowTreeClientImpl::LocalSetCapture(Window* window) { | 375 void WindowTreeClient::LocalSetCapture(Window* window) { |
| 409 if (capture_window_ == window) | 376 if (capture_window_ == window) |
| 410 return; | 377 return; |
| 411 Window* lost_capture = capture_window_; | 378 Window* lost_capture = capture_window_; |
| 412 capture_window_ = window; | 379 capture_window_ = window; |
| 413 if (lost_capture) { | 380 if (lost_capture) { |
| 414 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(lost_capture).observers(), | 381 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(lost_capture).observers(), |
| 415 OnWindowLostCapture(lost_capture)); | 382 OnWindowLostCapture(lost_capture)); |
| 416 } | 383 } |
| 417 } | 384 } |
| 418 | 385 |
| 419 void WindowTreeClientImpl::LocalSetFocus(Window* focused) { | 386 void WindowTreeClient::LocalSetFocus(Window* focused) { |
| 420 Window* blurred = focused_window_; | 387 Window* blurred = focused_window_; |
| 421 // Update |focused_window_| before calling any of the observers, so that the | 388 // Update |focused_window_| before calling any of the observers, so that the |
| 422 // observers get the correct result from calling |Window::HasFocus()|, | 389 // observers get the correct result from calling |Window::HasFocus()|, |
| 423 // |WindowTreeConnection::GetFocusedWindow()| etc. | 390 // |WindowTreeClient::GetFocusedWindow()| etc. |
| 424 focused_window_ = focused; | 391 focused_window_ = focused; |
| 425 if (blurred) { | 392 if (blurred) { |
| 426 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(blurred).observers(), | 393 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(blurred).observers(), |
| 427 OnWindowFocusChanged(focused, blurred)); | 394 OnWindowFocusChanged(focused, blurred)); |
| 428 } | 395 } |
| 429 if (focused) { | 396 if (focused) { |
| 430 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(focused).observers(), | 397 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(focused).observers(), |
| 431 OnWindowFocusChanged(focused, blurred)); | 398 OnWindowFocusChanged(focused, blurred)); |
| 432 } | 399 } |
| 433 FOR_EACH_OBSERVER(WindowTreeConnectionObserver, observers_, | 400 FOR_EACH_OBSERVER(WindowTreeClientObserver, observers_, |
| 434 OnWindowTreeFocusChanged(focused, blurred)); | 401 OnWindowTreeFocusChanged(focused, blurred)); |
| 435 } | 402 } |
| 436 | 403 |
| 437 void WindowTreeClientImpl::AddWindow(Window* window) { | 404 void WindowTreeClient::AddWindow(Window* window) { |
| 438 DCHECK(windows_.find(server_id(window)) == windows_.end()); | 405 DCHECK(windows_.find(server_id(window)) == windows_.end()); |
| 439 windows_[server_id(window)] = window; | 406 windows_[server_id(window)] = window; |
| 440 } | 407 } |
| 441 | 408 |
| 442 void WindowTreeClientImpl::OnWindowDestroying(Window* window) { | 409 void WindowTreeClient::OnWindowDestroying(Window* window) { |
| 443 // TODO(jonross): Also clear the focused window (crbug.com/611983) | 410 // TODO(jonross): Also clear the focused window (crbug.com/611983) |
| 444 if (window == capture_window_) { | 411 if (window == capture_window_) { |
| 445 InFlightCaptureChange reset_change(this, nullptr); | 412 InFlightCaptureChange reset_change(this, nullptr); |
| 446 ApplyServerChangeToExistingInFlightChange(reset_change); | 413 ApplyServerChangeToExistingInFlightChange(reset_change); |
| 447 // Normally just updating the queued changes is sufficient. However since | 414 // Normally just updating the queued changes is sufficient. However since |
| 448 // |window| is being destroyed, it will not be possible to notify its | 415 // |window| is being destroyed, it will not be possible to notify its |
| 449 // observers of the lost capture. Update local state now. | 416 // observers of the lost capture. Update local state now. |
| 450 LocalSetCapture(nullptr); | 417 LocalSetCapture(nullptr); |
| 451 } | 418 } |
| 452 } | 419 } |
| 453 | 420 |
| 454 void WindowTreeClientImpl::OnWindowDestroyed(Window* window) { | 421 void WindowTreeClient::OnWindowDestroyed(Window* window) { |
| 455 windows_.erase(server_id(window)); | 422 windows_.erase(server_id(window)); |
| 456 | 423 |
| 457 for (auto& entry : embedded_windows_) { | 424 for (auto& entry : embedded_windows_) { |
| 458 auto it = entry.second.find(window); | 425 auto it = entry.second.find(window); |
| 459 if (it != entry.second.end()) { | 426 if (it != entry.second.end()) { |
| 460 entry.second.erase(it); | 427 entry.second.erase(it); |
| 461 break; | 428 break; |
| 462 } | 429 } |
| 463 } | 430 } |
| 464 | 431 |
| 465 // Remove any InFlightChanges associated with the window. | 432 // Remove any InFlightChanges associated with the window. |
| 466 std::set<uint32_t> in_flight_change_ids_to_remove; | 433 std::set<uint32_t> in_flight_change_ids_to_remove; |
| 467 for (const auto& pair : in_flight_map_) { | 434 for (const auto& pair : in_flight_map_) { |
| 468 if (pair.second->window() == window) | 435 if (pair.second->window() == window) |
| 469 in_flight_change_ids_to_remove.insert(pair.first); | 436 in_flight_change_ids_to_remove.insert(pair.first); |
| 470 } | 437 } |
| 471 for (auto change_id : in_flight_change_ids_to_remove) | 438 for (auto change_id : in_flight_change_ids_to_remove) |
| 472 in_flight_map_.erase(change_id); | 439 in_flight_map_.erase(change_id); |
| 473 | 440 |
| 474 if (roots_.erase(window) > 0 && roots_.empty() && delete_on_no_roots_ && | 441 if (roots_.erase(window) > 0 && roots_.empty() && delete_on_no_roots_ && |
| 475 !in_destructor_) { | 442 !in_destructor_) { |
| 476 delete this; | 443 delete this; |
| 477 } | 444 } |
| 478 } | 445 } |
| 479 | 446 |
| 480 Window* WindowTreeClientImpl::GetWindowByServerId(Id id) { | 447 Window* WindowTreeClient::GetWindowByServerId(Id id) { |
| 481 IdToWindowMap::const_iterator it = windows_.find(id); | 448 IdToWindowMap::const_iterator it = windows_.find(id); |
| 482 return it != windows_.end() ? it->second : NULL; | 449 return it != windows_.end() ? it->second : NULL; |
| 483 } | 450 } |
| 484 | 451 |
| 485 InFlightChange* WindowTreeClientImpl::GetOldestInFlightChangeMatching( | 452 InFlightChange* WindowTreeClient::GetOldestInFlightChangeMatching( |
| 486 const InFlightChange& change) { | 453 const InFlightChange& change) { |
| 487 for (const auto& pair : in_flight_map_) { | 454 for (const auto& pair : in_flight_map_) { |
| 488 if (pair.second->window() == change.window() && | 455 if (pair.second->window() == change.window() && |
| 489 pair.second->change_type() == change.change_type() && | 456 pair.second->change_type() == change.change_type() && |
| 490 pair.second->Matches(change)) { | 457 pair.second->Matches(change)) { |
| 491 return pair.second.get(); | 458 return pair.second.get(); |
| 492 } | 459 } |
| 493 } | 460 } |
| 494 return nullptr; | 461 return nullptr; |
| 495 } | 462 } |
| 496 | 463 |
| 497 uint32_t WindowTreeClientImpl::ScheduleInFlightChange( | 464 uint32_t WindowTreeClient::ScheduleInFlightChange( |
| 498 std::unique_ptr<InFlightChange> change) { | 465 std::unique_ptr<InFlightChange> change) { |
| 499 DCHECK(!change->window() || | 466 DCHECK(!change->window() || |
| 500 windows_.count(change->window()->server_id()) > 0); | 467 windows_.count(change->window()->server_id()) > 0); |
| 501 const uint32_t change_id = next_change_id_++; | 468 const uint32_t change_id = next_change_id_++; |
| 502 in_flight_map_[change_id] = std::move(change); | 469 in_flight_map_[change_id] = std::move(change); |
| 503 return change_id; | 470 return change_id; |
| 504 } | 471 } |
| 505 | 472 |
| 506 bool WindowTreeClientImpl::ApplyServerChangeToExistingInFlightChange( | 473 bool WindowTreeClient::ApplyServerChangeToExistingInFlightChange( |
| 507 const InFlightChange& change) { | 474 const InFlightChange& change) { |
| 508 InFlightChange* existing_change = GetOldestInFlightChangeMatching(change); | 475 InFlightChange* existing_change = GetOldestInFlightChangeMatching(change); |
| 509 if (!existing_change) | 476 if (!existing_change) |
| 510 return false; | 477 return false; |
| 511 | 478 |
| 512 existing_change->SetRevertValueFrom(change); | 479 existing_change->SetRevertValueFrom(change); |
| 513 return true; | 480 return true; |
| 514 } | 481 } |
| 515 | 482 |
| 516 Window* WindowTreeClientImpl::NewWindowImpl( | 483 Window* WindowTreeClient::NewWindowImpl( |
| 517 NewWindowType type, | 484 NewWindowType type, |
| 518 const Window::SharedProperties* properties) { | 485 const Window::SharedProperties* properties) { |
| 519 DCHECK(tree_); | 486 DCHECK(tree_); |
| 520 Window* window = | 487 Window* window = |
| 521 new Window(this, MakeTransportId(client_id_, next_window_id_++)); | 488 new Window(this, MakeTransportId(client_id_, next_window_id_++)); |
| 522 if (properties) | 489 if (properties) |
| 523 window->properties_ = *properties; | 490 window->properties_ = *properties; |
| 524 AddWindow(window); | 491 AddWindow(window); |
| 525 | 492 |
| 526 const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique( | 493 const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique( |
| 527 new CrashInFlightChange(window, type == NewWindowType::CHILD | 494 new CrashInFlightChange(window, type == NewWindowType::CHILD |
| 528 ? ChangeType::NEW_WINDOW | 495 ? ChangeType::NEW_WINDOW |
| 529 : ChangeType::NEW_TOP_LEVEL_WINDOW))); | 496 : ChangeType::NEW_TOP_LEVEL_WINDOW))); |
| 530 mojo::Map<mojo::String, mojo::Array<uint8_t>> transport_properties; | 497 mojo::Map<mojo::String, mojo::Array<uint8_t>> transport_properties; |
| 531 if (properties) { | 498 if (properties) { |
| 532 transport_properties = | 499 transport_properties = |
| 533 mojo::Map<mojo::String, mojo::Array<uint8_t>>::From(*properties); | 500 mojo::Map<mojo::String, mojo::Array<uint8_t>>::From(*properties); |
| 534 } | 501 } |
| 535 if (type == NewWindowType::CHILD) { | 502 if (type == NewWindowType::CHILD) { |
| 536 tree_->NewWindow(change_id, server_id(window), | 503 tree_->NewWindow(change_id, server_id(window), |
| 537 std::move(transport_properties)); | 504 std::move(transport_properties)); |
| 538 } else { | 505 } else { |
| 539 roots_.insert(window); | 506 roots_.insert(window); |
| 540 tree_->NewTopLevelWindow(change_id, server_id(window), | 507 tree_->NewTopLevelWindow(change_id, server_id(window), |
| 541 std::move(transport_properties)); | 508 std::move(transport_properties)); |
| 542 } | 509 } |
| 543 return window; | 510 return window; |
| 544 } | 511 } |
| 545 | 512 |
| 546 void WindowTreeClientImpl::OnEmbedImpl(mojom::WindowTree* window_tree, | 513 void WindowTreeClient::OnEmbedImpl(mojom::WindowTree* window_tree, |
| 547 ClientSpecificId client_id, | 514 ClientSpecificId client_id, |
| 548 mojom::WindowDataPtr root_data, | 515 mojom::WindowDataPtr root_data, |
| 549 Id focused_window_id, | 516 Id focused_window_id, |
| 550 bool drawn) { | 517 bool drawn) { |
| 551 // WARNING: this is only called if WindowTreeClientImpl was created as the | 518 // WARNING: this is only called if WindowTreeClient was created as the |
| 552 // result of an embedding. | 519 // result of an embedding. |
| 553 tree_ = window_tree; | 520 tree_ = window_tree; |
| 554 client_id_ = client_id; | 521 client_id_ = client_id; |
| 555 | 522 |
| 556 DCHECK(roots_.empty()); | 523 DCHECK(roots_.empty()); |
| 557 Window* root = AddWindowToClient(this, nullptr, root_data); | 524 Window* root = AddWindowToClient(this, nullptr, root_data); |
| 558 roots_.insert(root); | 525 roots_.insert(root); |
| 559 | 526 |
| 560 focused_window_ = GetWindowByServerId(focused_window_id); | 527 focused_window_ = GetWindowByServerId(focused_window_id); |
| 561 | 528 |
| 562 WindowPrivate(root).LocalSetParentDrawn(drawn); | 529 WindowPrivate(root).LocalSetParentDrawn(drawn); |
| 563 | 530 |
| 564 delegate_->OnEmbed(root); | 531 delegate_->OnEmbed(root); |
| 565 | 532 |
| 566 if (focused_window_) { | 533 if (focused_window_) { |
| 567 FOR_EACH_OBSERVER(WindowTreeConnectionObserver, observers_, | 534 FOR_EACH_OBSERVER(WindowTreeClientObserver, observers_, |
| 568 OnWindowTreeFocusChanged(focused_window_, nullptr)); | 535 OnWindowTreeFocusChanged(focused_window_, nullptr)); |
| 569 } | 536 } |
| 570 } | 537 } |
| 571 | 538 |
| 572 void WindowTreeClientImpl::OnReceivedCursorLocationMemory( | 539 void WindowTreeClient::OnReceivedCursorLocationMemory( |
| 573 mojo::ScopedSharedBufferHandle handle) { | 540 mojo::ScopedSharedBufferHandle handle) { |
| 574 cursor_location_handle_ = std::move(handle); | 541 cursor_location_handle_ = std::move(handle); |
| 575 MojoResult result = mojo::MapBuffer( | 542 MojoResult result = mojo::MapBuffer( |
| 576 cursor_location_handle_.get(), 0, | 543 cursor_location_handle_.get(), 0, |
| 577 sizeof(base::subtle::Atomic32), | 544 sizeof(base::subtle::Atomic32), |
| 578 reinterpret_cast<void**>(&cursor_location_memory_), | 545 reinterpret_cast<void**>(&cursor_location_memory_), |
| 579 MOJO_MAP_BUFFER_FLAG_NONE); | 546 MOJO_MAP_BUFFER_FLAG_NONE); |
| 580 if (result != MOJO_RESULT_OK) { | 547 if (result != MOJO_RESULT_OK) { |
| 581 NOTREACHED(); | 548 NOTREACHED(); |
| 582 return; | 549 return; |
| 583 } | 550 } |
| 584 DCHECK(cursor_location_memory_); | 551 DCHECK(cursor_location_memory_); |
| 585 } | 552 } |
| 586 | 553 |
| 587 //////////////////////////////////////////////////////////////////////////////// | 554 //////////////////////////////////////////////////////////////////////////////// |
| 588 // WindowTreeClientImpl, WindowTreeConnection implementation: | 555 // WindowTreeClient, WindowTreeClient implementation: |
| 589 | 556 |
| 590 void WindowTreeClientImpl::SetDeleteOnNoRoots(bool value) { | 557 void WindowTreeClient::SetDeleteOnNoRoots(bool value) { |
| 591 delete_on_no_roots_ = value; | 558 delete_on_no_roots_ = value; |
| 592 } | 559 } |
| 593 | 560 |
| 594 const std::set<Window*>& WindowTreeClientImpl::GetRoots() { | 561 const std::set<Window*>& WindowTreeClient::GetRoots() { |
| 595 return roots_; | 562 return roots_; |
| 596 } | 563 } |
| 597 | 564 |
| 598 Window* WindowTreeClientImpl::GetFocusedWindow() { | 565 Window* WindowTreeClient::GetFocusedWindow() { |
| 599 return focused_window_; | 566 return focused_window_; |
| 600 } | 567 } |
| 601 | 568 |
| 602 void WindowTreeClientImpl::ClearFocus() { | 569 void WindowTreeClient::ClearFocus() { |
| 603 if (!focused_window_) | 570 if (!focused_window_) |
| 604 return; | 571 return; |
| 605 | 572 |
| 606 SetFocus(nullptr); | 573 SetFocus(nullptr); |
| 607 } | 574 } |
| 608 | 575 |
| 609 gfx::Point WindowTreeClientImpl::GetCursorScreenPoint() { | 576 gfx::Point WindowTreeClient::GetCursorScreenPoint() { |
| 610 // We raced initialization. Return (0, 0). | 577 // We raced initialization. Return (0, 0). |
| 611 if (!cursor_location_memory_) | 578 if (!cursor_location_memory_) |
| 612 return gfx::Point(); | 579 return gfx::Point(); |
| 613 | 580 |
| 614 base::subtle::Atomic32 location = | 581 base::subtle::Atomic32 location = |
| 615 base::subtle::NoBarrier_Load(cursor_location_memory_); | 582 base::subtle::NoBarrier_Load(cursor_location_memory_); |
| 616 return gfx::Point(static_cast<int16_t>(location >> 16), | 583 return gfx::Point(static_cast<int16_t>(location >> 16), |
| 617 static_cast<int16_t>(location & 0xFFFF)); | 584 static_cast<int16_t>(location & 0xFFFF)); |
| 618 } | 585 } |
| 619 | 586 |
| 620 void WindowTreeClientImpl::SetEventObserver(mojom::EventMatcherPtr matcher) { | 587 void WindowTreeClient::SetEventObserver(mojom::EventMatcherPtr matcher) { |
| 621 if (matcher.is_null()) { | 588 if (matcher.is_null()) { |
| 622 has_event_observer_ = false; | 589 has_event_observer_ = false; |
| 623 tree_->SetEventObserver(nullptr, 0u); | 590 tree_->SetEventObserver(nullptr, 0u); |
| 624 } else { | 591 } else { |
| 625 has_event_observer_ = true; | 592 has_event_observer_ = true; |
| 626 event_observer_id_++; | 593 event_observer_id_++; |
| 627 tree_->SetEventObserver(std::move(matcher), event_observer_id_); | 594 tree_->SetEventObserver(std::move(matcher), event_observer_id_); |
| 628 } | 595 } |
| 629 } | 596 } |
| 630 | 597 |
| 631 Window* WindowTreeClientImpl::NewWindow( | 598 Window* WindowTreeClient::NewWindow( |
| 632 const Window::SharedProperties* properties) { | 599 const Window::SharedProperties* properties) { |
| 633 return NewWindowImpl(NewWindowType::CHILD, properties); | 600 return NewWindowImpl(NewWindowType::CHILD, properties); |
| 634 } | 601 } |
| 635 | 602 |
| 636 Window* WindowTreeClientImpl::NewTopLevelWindow( | 603 Window* WindowTreeClient::NewTopLevelWindow( |
| 637 const Window::SharedProperties* properties) { | 604 const Window::SharedProperties* properties) { |
| 638 Window* window = NewWindowImpl(NewWindowType::TOP_LEVEL, properties); | 605 Window* window = NewWindowImpl(NewWindowType::TOP_LEVEL, properties); |
| 639 // Assume newly created top level windows are drawn by default, otherwise | 606 // Assume newly created top level windows are drawn by default, otherwise |
| 640 // requests to focus will fail. We will get the real value in | 607 // requests to focus will fail. We will get the real value in |
| 641 // OnTopLevelCreated(). | 608 // OnTopLevelCreated(). |
| 642 window->LocalSetParentDrawn(true); | 609 window->LocalSetParentDrawn(true); |
| 643 return window; | 610 return window; |
| 644 } | 611 } |
| 645 | 612 |
| 646 //////////////////////////////////////////////////////////////////////////////// | 613 //////////////////////////////////////////////////////////////////////////////// |
| 647 // WindowTreeClientImpl, WindowTreeClient implementation: | 614 // WindowTreeClient, WindowTreeClient implementation: |
| 648 | 615 |
| 649 void WindowTreeClientImpl::AddObserver(WindowTreeConnectionObserver* observer) { | 616 void WindowTreeClient::AddObserver(WindowTreeClientObserver* observer) { |
| 650 observers_.AddObserver(observer); | 617 observers_.AddObserver(observer); |
| 651 } | 618 } |
| 652 | 619 |
| 653 void WindowTreeClientImpl::RemoveObserver( | 620 void WindowTreeClient::RemoveObserver(WindowTreeClientObserver* observer) { |
| 654 WindowTreeConnectionObserver* observer) { | |
| 655 observers_.RemoveObserver(observer); | 621 observers_.RemoveObserver(observer); |
| 656 } | 622 } |
| 657 | 623 |
| 658 void WindowTreeClientImpl::OnEmbed(ClientSpecificId client_id, | 624 void WindowTreeClient::OnEmbed(ClientSpecificId client_id, |
| 659 mojom::WindowDataPtr root_data, | 625 mojom::WindowDataPtr root_data, |
| 660 mojom::WindowTreePtr tree, | 626 mojom::WindowTreePtr tree, |
| 661 Id focused_window_id, | 627 Id focused_window_id, |
| 662 bool drawn) { | 628 bool drawn) { |
| 663 DCHECK(!tree_ptr_); | 629 DCHECK(!tree_ptr_); |
| 664 tree_ptr_ = std::move(tree); | 630 tree_ptr_ = std::move(tree); |
| 665 tree_ptr_.set_connection_error_handler([this]() { delete this; }); | 631 tree_ptr_.set_connection_error_handler([this]() { delete this; }); |
| 666 | 632 |
| 667 if (window_manager_delegate_) { | 633 if (window_manager_delegate_) { |
| 668 tree_ptr_->GetWindowManagerClient(GetProxy(&window_manager_internal_client_, | 634 tree_ptr_->GetWindowManagerClient(GetProxy(&window_manager_internal_client_, |
| 669 tree_ptr_.associated_group())); | 635 tree_ptr_.associated_group())); |
| 670 } | 636 } |
| 671 | 637 |
| 672 OnEmbedImpl(tree_ptr_.get(), client_id, std::move(root_data), | 638 OnEmbedImpl(tree_ptr_.get(), client_id, std::move(root_data), |
| 673 focused_window_id, drawn); | 639 focused_window_id, drawn); |
| 674 } | 640 } |
| 675 | 641 |
| 676 void WindowTreeClientImpl::OnEmbeddedAppDisconnected(Id window_id) { | 642 void WindowTreeClient::OnEmbeddedAppDisconnected(Id window_id) { |
| 677 Window* window = GetWindowByServerId(window_id); | 643 Window* window = GetWindowByServerId(window_id); |
| 678 if (window) { | 644 if (window) { |
| 679 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(window).observers(), | 645 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(window).observers(), |
| 680 OnWindowEmbeddedAppDisconnected(window)); | 646 OnWindowEmbeddedAppDisconnected(window)); |
| 681 } | 647 } |
| 682 } | 648 } |
| 683 | 649 |
| 684 void WindowTreeClientImpl::OnUnembed(Id window_id) { | 650 void WindowTreeClient::OnUnembed(Id window_id) { |
| 685 Window* window = GetWindowByServerId(window_id); | 651 Window* window = GetWindowByServerId(window_id); |
| 686 if (!window) | 652 if (!window) |
| 687 return; | 653 return; |
| 688 | 654 |
| 689 delegate_->OnUnembed(window); | 655 delegate_->OnUnembed(window); |
| 690 WindowPrivate(window).LocalDestroy(); | 656 WindowPrivate(window).LocalDestroy(); |
| 691 } | 657 } |
| 692 | 658 |
| 693 void WindowTreeClientImpl::OnLostCapture(Id window_id) { | 659 void WindowTreeClient::OnLostCapture(Id window_id) { |
| 694 Window* window = GetWindowByServerId(window_id); | 660 Window* window = GetWindowByServerId(window_id); |
| 695 if (!window) | 661 if (!window) |
| 696 return; | 662 return; |
| 697 | 663 |
| 698 InFlightCaptureChange reset_change(this, nullptr); | 664 InFlightCaptureChange reset_change(this, nullptr); |
| 699 if (ApplyServerChangeToExistingInFlightChange(reset_change)) | 665 if (ApplyServerChangeToExistingInFlightChange(reset_change)) |
| 700 return; | 666 return; |
| 701 | 667 |
| 702 LocalSetCapture(nullptr); | 668 LocalSetCapture(nullptr); |
| 703 } | 669 } |
| 704 | 670 |
| 705 void WindowTreeClientImpl::OnTopLevelCreated(uint32_t change_id, | 671 void WindowTreeClient::OnTopLevelCreated(uint32_t change_id, |
| 706 mojom::WindowDataPtr data, | 672 mojom::WindowDataPtr data, |
| 707 bool drawn) { | 673 bool drawn) { |
| 708 // The server ack'd the top level window we created and supplied the state | 674 // The server ack'd the top level window we created and supplied the state |
| 709 // of the window at the time the server created it. For properties we do not | 675 // of the window at the time the server created it. For properties we do not |
| 710 // have changes in flight for we can update them immediately. For properties | 676 // have changes in flight for we can update them immediately. For properties |
| 711 // with changes in flight we set the revert value from the server. | 677 // with changes in flight we set the revert value from the server. |
| 712 | 678 |
| 713 if (!in_flight_map_.count(change_id)) { | 679 if (!in_flight_map_.count(change_id)) { |
| 714 // The window may have been destroyed locally before the server could finish | 680 // The window may have been destroyed locally before the server could finish |
| 715 // creating the window, and before the server received the notification that | 681 // creating the window, and before the server received the notification that |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 if (current_change) | 728 if (current_change) |
| 763 current_change->SetRevertValueFrom(property_change); | 729 current_change->SetRevertValueFrom(property_change); |
| 764 else | 730 else |
| 765 window_private.LocalSetSharedProperty(pair.first, &(pair.second)); | 731 window_private.LocalSetSharedProperty(pair.first, &(pair.second)); |
| 766 } | 732 } |
| 767 | 733 |
| 768 // Top level windows should not have a parent. | 734 // Top level windows should not have a parent. |
| 769 DCHECK_EQ(0u, data->parent_id); | 735 DCHECK_EQ(0u, data->parent_id); |
| 770 } | 736 } |
| 771 | 737 |
| 772 void WindowTreeClientImpl::OnWindowBoundsChanged(Id window_id, | 738 void WindowTreeClient::OnWindowBoundsChanged(Id window_id, |
| 773 mojo::RectPtr old_bounds, | 739 mojo::RectPtr old_bounds, |
| 774 mojo::RectPtr new_bounds) { | 740 mojo::RectPtr new_bounds) { |
| 775 Window* window = GetWindowByServerId(window_id); | 741 Window* window = GetWindowByServerId(window_id); |
| 776 if (!window) | 742 if (!window) |
| 777 return; | 743 return; |
| 778 | 744 |
| 779 InFlightBoundsChange new_change(window, new_bounds.To<gfx::Rect>()); | 745 InFlightBoundsChange new_change(window, new_bounds.To<gfx::Rect>()); |
| 780 if (ApplyServerChangeToExistingInFlightChange(new_change)) | 746 if (ApplyServerChangeToExistingInFlightChange(new_change)) |
| 781 return; | 747 return; |
| 782 | 748 |
| 783 WindowPrivate(window) | 749 WindowPrivate(window) |
| 784 .LocalSetBounds(old_bounds.To<gfx::Rect>(), new_bounds.To<gfx::Rect>()); | 750 .LocalSetBounds(old_bounds.To<gfx::Rect>(), new_bounds.To<gfx::Rect>()); |
| 785 } | 751 } |
| 786 | 752 |
| 787 void WindowTreeClientImpl::OnClientAreaChanged( | 753 void WindowTreeClient::OnClientAreaChanged( |
| 788 uint32_t window_id, | 754 uint32_t window_id, |
| 789 mojo::InsetsPtr new_client_area, | 755 mojo::InsetsPtr new_client_area, |
| 790 mojo::Array<mojo::RectPtr> new_additional_client_areas) { | 756 mojo::Array<mojo::RectPtr> new_additional_client_areas) { |
| 791 Window* window = GetWindowByServerId(window_id); | 757 Window* window = GetWindowByServerId(window_id); |
| 792 if (window) { | 758 if (window) { |
| 793 WindowPrivate(window).LocalSetClientArea( | 759 WindowPrivate(window).LocalSetClientArea( |
| 794 new_client_area.To<gfx::Insets>(), | 760 new_client_area.To<gfx::Insets>(), |
| 795 new_additional_client_areas.To<std::vector<gfx::Rect>>()); | 761 new_additional_client_areas.To<std::vector<gfx::Rect>>()); |
| 796 } | 762 } |
| 797 } | 763 } |
| 798 | 764 |
| 799 void WindowTreeClientImpl::OnTransientWindowAdded( | 765 void WindowTreeClient::OnTransientWindowAdded( |
| 800 uint32_t window_id, | 766 uint32_t window_id, |
| 801 uint32_t transient_window_id) { | 767 uint32_t transient_window_id) { |
| 802 Window* window = GetWindowByServerId(window_id); | 768 Window* window = GetWindowByServerId(window_id); |
| 803 Window* transient_window = GetWindowByServerId(transient_window_id); | 769 Window* transient_window = GetWindowByServerId(transient_window_id); |
| 804 // window or transient_window or both may be null if a local delete occurs | 770 // window or transient_window or both may be null if a local delete occurs |
| 805 // with an in flight add from the server. | 771 // with an in flight add from the server. |
| 806 if (window && transient_window) | 772 if (window && transient_window) |
| 807 WindowPrivate(window).LocalAddTransientWindow(transient_window); | 773 WindowPrivate(window).LocalAddTransientWindow(transient_window); |
| 808 } | 774 } |
| 809 | 775 |
| 810 void WindowTreeClientImpl::OnTransientWindowRemoved( | 776 void WindowTreeClient::OnTransientWindowRemoved( |
| 811 uint32_t window_id, | 777 uint32_t window_id, |
| 812 uint32_t transient_window_id) { | 778 uint32_t transient_window_id) { |
| 813 Window* window = GetWindowByServerId(window_id); | 779 Window* window = GetWindowByServerId(window_id); |
| 814 Window* transient_window = GetWindowByServerId(transient_window_id); | 780 Window* transient_window = GetWindowByServerId(transient_window_id); |
| 815 // window or transient_window or both may be null if a local delete occurs | 781 // window or transient_window or both may be null if a local delete occurs |
| 816 // with an in flight delete from the server. | 782 // with an in flight delete from the server. |
| 817 if (window && transient_window) | 783 if (window && transient_window) |
| 818 WindowPrivate(window).LocalRemoveTransientWindow(transient_window); | 784 WindowPrivate(window).LocalRemoveTransientWindow(transient_window); |
| 819 } | 785 } |
| 820 | 786 |
| 821 void WindowTreeClientImpl::OnWindowHierarchyChanged( | 787 void WindowTreeClient::OnWindowHierarchyChanged( |
| 822 Id window_id, | 788 Id window_id, |
| 823 Id old_parent_id, | 789 Id old_parent_id, |
| 824 Id new_parent_id, | 790 Id new_parent_id, |
| 825 mojo::Array<mojom::WindowDataPtr> windows) { | 791 mojo::Array<mojom::WindowDataPtr> windows) { |
| 826 Window* initial_parent = | 792 Window* initial_parent = |
| 827 windows.size() ? GetWindowByServerId(windows[0]->parent_id) : NULL; | 793 windows.size() ? GetWindowByServerId(windows[0]->parent_id) : NULL; |
| 828 | 794 |
| 829 const bool was_window_known = GetWindowByServerId(window_id) != nullptr; | 795 const bool was_window_known = GetWindowByServerId(window_id) != nullptr; |
| 830 | 796 |
| 831 BuildWindowTree(this, windows, initial_parent); | 797 BuildWindowTree(this, windows, initial_parent); |
| 832 | 798 |
| 833 // If the window was not known, then BuildWindowTree() will have created it | 799 // If the window was not known, then BuildWindowTree() will have created it |
| 834 // and parented the window. | 800 // and parented the window. |
| 835 if (!was_window_known) | 801 if (!was_window_known) |
| 836 return; | 802 return; |
| 837 | 803 |
| 838 Window* new_parent = GetWindowByServerId(new_parent_id); | 804 Window* new_parent = GetWindowByServerId(new_parent_id); |
| 839 Window* old_parent = GetWindowByServerId(old_parent_id); | 805 Window* old_parent = GetWindowByServerId(old_parent_id); |
| 840 Window* window = GetWindowByServerId(window_id); | 806 Window* window = GetWindowByServerId(window_id); |
| 841 if (new_parent) | 807 if (new_parent) |
| 842 WindowPrivate(new_parent).LocalAddChild(window); | 808 WindowPrivate(new_parent).LocalAddChild(window); |
| 843 else | 809 else |
| 844 WindowPrivate(old_parent).LocalRemoveChild(window); | 810 WindowPrivate(old_parent).LocalRemoveChild(window); |
| 845 } | 811 } |
| 846 | 812 |
| 847 void WindowTreeClientImpl::OnWindowReordered(Id window_id, | 813 void WindowTreeClient::OnWindowReordered(Id window_id, |
| 848 Id relative_window_id, | 814 Id relative_window_id, |
| 849 mojom::OrderDirection direction) { | 815 mojom::OrderDirection direction) { |
| 850 Window* window = GetWindowByServerId(window_id); | 816 Window* window = GetWindowByServerId(window_id); |
| 851 Window* relative_window = GetWindowByServerId(relative_window_id); | 817 Window* relative_window = GetWindowByServerId(relative_window_id); |
| 852 if (window && relative_window) | 818 if (window && relative_window) |
| 853 WindowPrivate(window).LocalReorder(relative_window, direction); | 819 WindowPrivate(window).LocalReorder(relative_window, direction); |
| 854 } | 820 } |
| 855 | 821 |
| 856 void WindowTreeClientImpl::OnWindowDeleted(Id window_id) { | 822 void WindowTreeClient::OnWindowDeleted(Id window_id) { |
| 857 Window* window = GetWindowByServerId(window_id); | 823 Window* window = GetWindowByServerId(window_id); |
| 858 if (window) | 824 if (window) |
| 859 WindowPrivate(window).LocalDestroy(); | 825 WindowPrivate(window).LocalDestroy(); |
| 860 } | 826 } |
| 861 | 827 |
| 862 Window* WindowTreeClientImpl::GetCaptureWindow() { | 828 Window* WindowTreeClient::GetCaptureWindow() { |
| 863 return capture_window_; | 829 return capture_window_; |
| 864 } | 830 } |
| 865 | 831 |
| 866 void WindowTreeClientImpl::OnWindowVisibilityChanged(Id window_id, | 832 void WindowTreeClient::OnWindowVisibilityChanged(Id window_id, |
| 867 bool visible) { | 833 bool visible) { |
| 868 Window* window = GetWindowByServerId(window_id); | 834 Window* window = GetWindowByServerId(window_id); |
| 869 if (!window) | 835 if (!window) |
| 870 return; | 836 return; |
| 871 | 837 |
| 872 InFlightVisibleChange new_change(window, visible); | 838 InFlightVisibleChange new_change(window, visible); |
| 873 if (ApplyServerChangeToExistingInFlightChange(new_change)) | 839 if (ApplyServerChangeToExistingInFlightChange(new_change)) |
| 874 return; | 840 return; |
| 875 | 841 |
| 876 WindowPrivate(window).LocalSetVisible(visible); | 842 WindowPrivate(window).LocalSetVisible(visible); |
| 877 } | 843 } |
| 878 | 844 |
| 879 void WindowTreeClientImpl::OnWindowOpacityChanged(Id window_id, | 845 void WindowTreeClient::OnWindowOpacityChanged(Id window_id, |
| 880 float old_opacity, | 846 float old_opacity, |
| 881 float new_opacity) { | 847 float new_opacity) { |
| 882 Window* window = GetWindowByServerId(window_id); | 848 Window* window = GetWindowByServerId(window_id); |
| 883 if (!window) | 849 if (!window) |
| 884 return; | 850 return; |
| 885 | 851 |
| 886 InFlightOpacityChange new_change(window, new_opacity); | 852 InFlightOpacityChange new_change(window, new_opacity); |
| 887 if (ApplyServerChangeToExistingInFlightChange(new_change)) | 853 if (ApplyServerChangeToExistingInFlightChange(new_change)) |
| 888 return; | 854 return; |
| 889 | 855 |
| 890 WindowPrivate(window).LocalSetOpacity(new_opacity); | 856 WindowPrivate(window).LocalSetOpacity(new_opacity); |
| 891 } | 857 } |
| 892 | 858 |
| 893 void WindowTreeClientImpl::OnWindowParentDrawnStateChanged(Id window_id, | 859 void WindowTreeClient::OnWindowParentDrawnStateChanged(Id window_id, |
| 894 bool drawn) { | 860 bool drawn) { |
| 895 Window* window = GetWindowByServerId(window_id); | 861 Window* window = GetWindowByServerId(window_id); |
| 896 if (window) | 862 if (window) |
| 897 WindowPrivate(window).LocalSetParentDrawn(drawn); | 863 WindowPrivate(window).LocalSetParentDrawn(drawn); |
| 898 } | 864 } |
| 899 | 865 |
| 900 void WindowTreeClientImpl::OnWindowSharedPropertyChanged( | 866 void WindowTreeClient::OnWindowSharedPropertyChanged( |
| 901 Id window_id, | 867 Id window_id, |
| 902 const mojo::String& name, | 868 const mojo::String& name, |
| 903 mojo::Array<uint8_t> new_data) { | 869 mojo::Array<uint8_t> new_data) { |
| 904 Window* window = GetWindowByServerId(window_id); | 870 Window* window = GetWindowByServerId(window_id); |
| 905 if (!window) | 871 if (!window) |
| 906 return; | 872 return; |
| 907 | 873 |
| 908 InFlightPropertyChange new_change(window, name, new_data); | 874 InFlightPropertyChange new_change(window, name, new_data); |
| 909 if (ApplyServerChangeToExistingInFlightChange(new_change)) | 875 if (ApplyServerChangeToExistingInFlightChange(new_change)) |
| 910 return; | 876 return; |
| 911 | 877 |
| 912 WindowPrivate(window).LocalSetSharedProperty(name, std::move(new_data)); | 878 WindowPrivate(window).LocalSetSharedProperty(name, std::move(new_data)); |
| 913 } | 879 } |
| 914 | 880 |
| 915 void WindowTreeClientImpl::OnWindowInputEvent(uint32_t event_id, | 881 void WindowTreeClient::OnWindowInputEvent(uint32_t event_id, |
| 916 Id window_id, | 882 Id window_id, |
| 917 mojom::EventPtr event, | 883 mojom::EventPtr event, |
| 918 uint32_t event_observer_id) { | 884 uint32_t event_observer_id) { |
| 919 std::unique_ptr<ui::Event> ui_event = event.To<std::unique_ptr<ui::Event>>(); | 885 std::unique_ptr<ui::Event> ui_event = event.To<std::unique_ptr<ui::Event>>(); |
| 920 Window* window = GetWindowByServerId(window_id); // May be null. | 886 Window* window = GetWindowByServerId(window_id); // May be null. |
| 921 | 887 |
| 922 // Non-zero event_observer_id means it matched an event observer on the | 888 // Non-zero event_observer_id means it matched an event observer on the |
| 923 // server. | 889 // server. |
| 924 if (event_observer_id != 0 && has_event_observer_ && | 890 if (event_observer_id != 0 && has_event_observer_ && |
| 925 event_observer_id == event_observer_id_) | 891 event_observer_id == event_observer_id_) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 936 base::Unretained(tree_), event_id))); | 902 base::Unretained(tree_), event_id))); |
| 937 window->input_event_handler_->OnWindowInputEvent( | 903 window->input_event_handler_->OnWindowInputEvent( |
| 938 window, *event.To<std::unique_ptr<ui::Event>>().get(), &ack_callback); | 904 window, *event.To<std::unique_ptr<ui::Event>>().get(), &ack_callback); |
| 939 | 905 |
| 940 // The handler did not take ownership of the callback, so we send the ack, | 906 // The handler did not take ownership of the callback, so we send the ack, |
| 941 // marking the event as not consumed. | 907 // marking the event as not consumed. |
| 942 if (ack_callback) | 908 if (ack_callback) |
| 943 ack_callback->Run(mojom::EventResult::UNHANDLED); | 909 ack_callback->Run(mojom::EventResult::UNHANDLED); |
| 944 } | 910 } |
| 945 | 911 |
| 946 void WindowTreeClientImpl::OnEventObserved(mojom::EventPtr event, | 912 void WindowTreeClient::OnEventObserved(mojom::EventPtr event, |
| 947 uint32_t event_observer_id) { | 913 uint32_t event_observer_id) { |
| 948 if (has_event_observer_ && event_observer_id == event_observer_id_) { | 914 if (has_event_observer_ && event_observer_id == event_observer_id_) { |
| 949 std::unique_ptr<ui::Event> ui_event = | 915 std::unique_ptr<ui::Event> ui_event = |
| 950 event.To<std::unique_ptr<ui::Event>>(); | 916 event.To<std::unique_ptr<ui::Event>>(); |
| 951 delegate_->OnEventObserved(*ui_event, nullptr /* target */); | 917 delegate_->OnEventObserved(*ui_event, nullptr /* target */); |
| 952 } | 918 } |
| 953 } | 919 } |
| 954 | 920 |
| 955 void WindowTreeClientImpl::OnWindowFocused(Id focused_window_id) { | 921 void WindowTreeClient::OnWindowFocused(Id focused_window_id) { |
| 956 Window* focused_window = GetWindowByServerId(focused_window_id); | 922 Window* focused_window = GetWindowByServerId(focused_window_id); |
| 957 InFlightFocusChange new_change(this, focused_window); | 923 InFlightFocusChange new_change(this, focused_window); |
| 958 if (ApplyServerChangeToExistingInFlightChange(new_change)) | 924 if (ApplyServerChangeToExistingInFlightChange(new_change)) |
| 959 return; | 925 return; |
| 960 | 926 |
| 961 LocalSetFocus(focused_window); | 927 LocalSetFocus(focused_window); |
| 962 } | 928 } |
| 963 | 929 |
| 964 void WindowTreeClientImpl::OnWindowPredefinedCursorChanged( | 930 void WindowTreeClient::OnWindowPredefinedCursorChanged( |
| 965 Id window_id, | 931 Id window_id, |
| 966 mojom::Cursor cursor) { | 932 mojom::Cursor cursor) { |
| 967 Window* window = GetWindowByServerId(window_id); | 933 Window* window = GetWindowByServerId(window_id); |
| 968 if (!window) | 934 if (!window) |
| 969 return; | 935 return; |
| 970 | 936 |
| 971 InFlightPredefinedCursorChange new_change(window, cursor); | 937 InFlightPredefinedCursorChange new_change(window, cursor); |
| 972 if (ApplyServerChangeToExistingInFlightChange(new_change)) | 938 if (ApplyServerChangeToExistingInFlightChange(new_change)) |
| 973 return; | 939 return; |
| 974 | 940 |
| 975 WindowPrivate(window).LocalSetPredefinedCursor(cursor); | 941 WindowPrivate(window).LocalSetPredefinedCursor(cursor); |
| 976 } | 942 } |
| 977 | 943 |
| 978 void WindowTreeClientImpl::OnChangeCompleted(uint32_t change_id, bool success) { | 944 void WindowTreeClient::OnChangeCompleted(uint32_t change_id, bool success) { |
| 979 std::unique_ptr<InFlightChange> change(std::move(in_flight_map_[change_id])); | 945 std::unique_ptr<InFlightChange> change(std::move(in_flight_map_[change_id])); |
| 980 in_flight_map_.erase(change_id); | 946 in_flight_map_.erase(change_id); |
| 981 if (!change) | 947 if (!change) |
| 982 return; | 948 return; |
| 983 | 949 |
| 984 if (!success) | 950 if (!success) |
| 985 change->ChangeFailed(); | 951 change->ChangeFailed(); |
| 986 | 952 |
| 987 InFlightChange* next_change = GetOldestInFlightChangeMatching(*change); | 953 InFlightChange* next_change = GetOldestInFlightChangeMatching(*change); |
| 988 if (next_change) { | 954 if (next_change) { |
| 989 if (!success) | 955 if (!success) |
| 990 next_change->SetRevertValueFrom(*change); | 956 next_change->SetRevertValueFrom(*change); |
| 991 } else if (!success) { | 957 } else if (!success) { |
| 992 change->Revert(); | 958 change->Revert(); |
| 993 } | 959 } |
| 994 } | 960 } |
| 995 | 961 |
| 996 void WindowTreeClientImpl::GetWindowManager( | 962 void WindowTreeClient::GetWindowManager( |
| 997 mojo::AssociatedInterfaceRequest<WindowManager> internal) { | 963 mojo::AssociatedInterfaceRequest<WindowManager> internal) { |
| 998 window_manager_internal_.reset( | 964 window_manager_internal_.reset( |
| 999 new mojo::AssociatedBinding<mojom::WindowManager>(this, | 965 new mojo::AssociatedBinding<mojom::WindowManager>(this, |
| 1000 std::move(internal))); | 966 std::move(internal))); |
| 1001 } | 967 } |
| 1002 | 968 |
| 1003 void WindowTreeClientImpl::RequestClose(uint32_t window_id) { | 969 void WindowTreeClient::RequestClose(uint32_t window_id) { |
| 1004 Window* window = GetWindowByServerId(window_id); | 970 Window* window = GetWindowByServerId(window_id); |
| 1005 if (!window || !IsRoot(window)) | 971 if (!window || !IsRoot(window)) |
| 1006 return; | 972 return; |
| 1007 | 973 |
| 1008 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(window).observers(), | 974 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(window).observers(), |
| 1009 OnRequestClose(window)); | 975 OnRequestClose(window)); |
| 1010 } | 976 } |
| 1011 | 977 |
| 1012 void WindowTreeClientImpl::WmSetBounds(uint32_t change_id, | 978 void WindowTreeClient::WmSetBounds(uint32_t change_id, |
| 1013 Id window_id, | 979 Id window_id, |
| 1014 mojo::RectPtr transit_bounds) { | 980 mojo::RectPtr transit_bounds) { |
| 1015 Window* window = GetWindowByServerId(window_id); | 981 Window* window = GetWindowByServerId(window_id); |
| 1016 bool result = false; | 982 bool result = false; |
| 1017 if (window) { | 983 if (window) { |
| 1018 DCHECK(window_manager_delegate_); | 984 DCHECK(window_manager_delegate_); |
| 1019 gfx::Rect bounds = transit_bounds.To<gfx::Rect>(); | 985 gfx::Rect bounds = transit_bounds.To<gfx::Rect>(); |
| 1020 result = window_manager_delegate_->OnWmSetBounds(window, &bounds); | 986 result = window_manager_delegate_->OnWmSetBounds(window, &bounds); |
| 1021 if (result) { | 987 if (result) { |
| 1022 // If the resulting bounds differ return false. Returning false ensures | 988 // If the resulting bounds differ return false. Returning false ensures |
| 1023 // the client applies the bounds we set below. | 989 // the client applies the bounds we set below. |
| 1024 result = bounds == transit_bounds.To<gfx::Rect>(); | 990 result = bounds == transit_bounds.To<gfx::Rect>(); |
| 1025 window->SetBounds(bounds); | 991 window->SetBounds(bounds); |
| 1026 } | 992 } |
| 1027 } | 993 } |
| 1028 if (window_manager_internal_client_) | 994 if (window_manager_internal_client_) |
| 1029 window_manager_internal_client_->WmResponse(change_id, result); | 995 window_manager_internal_client_->WmResponse(change_id, result); |
| 1030 } | 996 } |
| 1031 | 997 |
| 1032 void WindowTreeClientImpl::WmSetProperty(uint32_t change_id, | 998 void WindowTreeClient::WmSetProperty(uint32_t change_id, |
| 1033 Id window_id, | 999 Id window_id, |
| 1034 const mojo::String& name, | 1000 const mojo::String& name, |
| 1035 mojo::Array<uint8_t> transit_data) { | 1001 mojo::Array<uint8_t> transit_data) { |
| 1036 Window* window = GetWindowByServerId(window_id); | 1002 Window* window = GetWindowByServerId(window_id); |
| 1037 bool result = false; | 1003 bool result = false; |
| 1038 if (window) { | 1004 if (window) { |
| 1039 DCHECK(window_manager_delegate_); | 1005 DCHECK(window_manager_delegate_); |
| 1040 std::unique_ptr<std::vector<uint8_t>> data; | 1006 std::unique_ptr<std::vector<uint8_t>> data; |
| 1041 if (!transit_data.is_null()) { | 1007 if (!transit_data.is_null()) { |
| 1042 data.reset( | 1008 data.reset( |
| 1043 new std::vector<uint8_t>(transit_data.To<std::vector<uint8_t>>())); | 1009 new std::vector<uint8_t>(transit_data.To<std::vector<uint8_t>>())); |
| 1044 } | 1010 } |
| 1045 result = window_manager_delegate_->OnWmSetProperty(window, name, &data); | 1011 result = window_manager_delegate_->OnWmSetProperty(window, name, &data); |
| 1046 if (result) { | 1012 if (result) { |
| 1047 // If the resulting bounds differ return false. Returning false ensures | 1013 // If the resulting bounds differ return false. Returning false ensures |
| 1048 // the client applies the bounds we set below. | 1014 // the client applies the bounds we set below. |
| 1049 window->SetSharedPropertyInternal(name, data.get()); | 1015 window->SetSharedPropertyInternal(name, data.get()); |
| 1050 } | 1016 } |
| 1051 } | 1017 } |
| 1052 if (window_manager_internal_client_) | 1018 if (window_manager_internal_client_) |
| 1053 window_manager_internal_client_->WmResponse(change_id, result); | 1019 window_manager_internal_client_->WmResponse(change_id, result); |
| 1054 } | 1020 } |
| 1055 | 1021 |
| 1056 void WindowTreeClientImpl::WmCreateTopLevelWindow( | 1022 void WindowTreeClient::WmCreateTopLevelWindow( |
| 1057 uint32_t change_id, | 1023 uint32_t change_id, |
| 1058 ClientSpecificId requesting_client_id, | 1024 ClientSpecificId requesting_client_id, |
| 1059 mojo::Map<mojo::String, mojo::Array<uint8_t>> transport_properties) { | 1025 mojo::Map<mojo::String, mojo::Array<uint8_t>> transport_properties) { |
| 1060 std::map<std::string, std::vector<uint8_t>> properties = | 1026 std::map<std::string, std::vector<uint8_t>> properties = |
| 1061 transport_properties.To<std::map<std::string, std::vector<uint8_t>>>(); | 1027 transport_properties.To<std::map<std::string, std::vector<uint8_t>>>(); |
| 1062 Window* window = | 1028 Window* window = |
| 1063 window_manager_delegate_->OnWmCreateTopLevelWindow(&properties); | 1029 window_manager_delegate_->OnWmCreateTopLevelWindow(&properties); |
| 1064 embedded_windows_[requesting_client_id].insert(window); | 1030 embedded_windows_[requesting_client_id].insert(window); |
| 1065 if (window_manager_internal_client_) { | 1031 if (window_manager_internal_client_) { |
| 1066 window_manager_internal_client_->OnWmCreatedTopLevelWindow( | 1032 window_manager_internal_client_->OnWmCreatedTopLevelWindow( |
| 1067 change_id, server_id(window)); | 1033 change_id, server_id(window)); |
| 1068 } | 1034 } |
| 1069 } | 1035 } |
| 1070 | 1036 |
| 1071 void WindowTreeClientImpl::WmClientJankinessChanged(ClientSpecificId client_id, | 1037 void WindowTreeClient::WmClientJankinessChanged(ClientSpecificId client_id, |
| 1072 bool janky) { | 1038 bool janky) { |
| 1073 if (window_manager_delegate_) { | 1039 if (window_manager_delegate_) { |
| 1074 auto it = embedded_windows_.find(client_id); | 1040 auto it = embedded_windows_.find(client_id); |
| 1075 CHECK(it != embedded_windows_.end()); | 1041 CHECK(it != embedded_windows_.end()); |
| 1076 window_manager_delegate_->OnWmClientJankinessChanged( | 1042 window_manager_delegate_->OnWmClientJankinessChanged( |
| 1077 embedded_windows_[client_id], janky); | 1043 embedded_windows_[client_id], janky); |
| 1078 } | 1044 } |
| 1079 } | 1045 } |
| 1080 | 1046 |
| 1081 void WindowTreeClientImpl::OnAccelerator(uint32_t id, mojom::EventPtr event) { | 1047 void WindowTreeClient::OnAccelerator(uint32_t id, mojom::EventPtr event) { |
| 1082 window_manager_delegate_->OnAccelerator( | 1048 window_manager_delegate_->OnAccelerator( |
| 1083 id, *event.To<std::unique_ptr<ui::Event>>().get()); | 1049 id, *event.To<std::unique_ptr<ui::Event>>().get()); |
| 1084 } | 1050 } |
| 1085 | 1051 |
| 1086 void WindowTreeClientImpl::SetFrameDecorationValues( | 1052 void WindowTreeClient::SetFrameDecorationValues( |
| 1087 mojom::FrameDecorationValuesPtr values) { | 1053 mojom::FrameDecorationValuesPtr values) { |
| 1088 if (window_manager_internal_client_) { | 1054 if (window_manager_internal_client_) { |
| 1089 window_manager_internal_client_->WmSetFrameDecorationValues( | 1055 window_manager_internal_client_->WmSetFrameDecorationValues( |
| 1090 std::move(values)); | 1056 std::move(values)); |
| 1091 } | 1057 } |
| 1092 } | 1058 } |
| 1093 | 1059 |
| 1094 void WindowTreeClientImpl::SetNonClientCursor(Window* window, | 1060 void WindowTreeClient::SetNonClientCursor(Window* window, |
| 1095 mus::mojom::Cursor cursor_id) { | 1061 mus::mojom::Cursor cursor_id) { |
| 1096 window_manager_internal_client_->WmSetNonClientCursor(server_id(window), | 1062 window_manager_internal_client_->WmSetNonClientCursor(server_id(window), |
| 1097 cursor_id); | 1063 cursor_id); |
| 1098 } | 1064 } |
| 1099 | 1065 |
| 1100 void WindowTreeClientImpl::AddAccelerator( | 1066 void WindowTreeClient::AddAccelerator( |
| 1101 uint32_t id, | 1067 uint32_t id, |
| 1102 mojom::EventMatcherPtr event_matcher, | 1068 mojom::EventMatcherPtr event_matcher, |
| 1103 const base::Callback<void(bool)>& callback) { | 1069 const base::Callback<void(bool)>& callback) { |
| 1104 if (window_manager_internal_client_) { | 1070 if (window_manager_internal_client_) { |
| 1105 window_manager_internal_client_->AddAccelerator( | 1071 window_manager_internal_client_->AddAccelerator( |
| 1106 id, std::move(event_matcher), callback); | 1072 id, std::move(event_matcher), callback); |
| 1107 } | 1073 } |
| 1108 } | 1074 } |
| 1109 | 1075 |
| 1110 void WindowTreeClientImpl::RemoveAccelerator(uint32_t id) { | 1076 void WindowTreeClient::RemoveAccelerator(uint32_t id) { |
| 1111 if (window_manager_internal_client_) { | 1077 if (window_manager_internal_client_) { |
| 1112 window_manager_internal_client_->RemoveAccelerator(id); | 1078 window_manager_internal_client_->RemoveAccelerator(id); |
| 1113 } | 1079 } |
| 1114 } | 1080 } |
| 1115 | 1081 |
| 1116 void WindowTreeClientImpl::AddActivationParent(Window* window) { | 1082 void WindowTreeClient::AddActivationParent(Window* window) { |
| 1117 if (window_manager_internal_client_) | 1083 if (window_manager_internal_client_) |
| 1118 window_manager_internal_client_->AddActivationParent(server_id(window)); | 1084 window_manager_internal_client_->AddActivationParent(server_id(window)); |
| 1119 } | 1085 } |
| 1120 | 1086 |
| 1121 void WindowTreeClientImpl::RemoveActivationParent(Window* window) { | 1087 void WindowTreeClient::RemoveActivationParent(Window* window) { |
| 1122 if (window_manager_internal_client_) | 1088 if (window_manager_internal_client_) |
| 1123 window_manager_internal_client_->RemoveActivationParent(server_id(window)); | 1089 window_manager_internal_client_->RemoveActivationParent(server_id(window)); |
| 1124 } | 1090 } |
| 1125 | 1091 |
| 1126 void WindowTreeClientImpl::ActivateNextWindow() { | 1092 void WindowTreeClient::ActivateNextWindow() { |
| 1127 if (window_manager_internal_client_) | 1093 if (window_manager_internal_client_) |
| 1128 window_manager_internal_client_->ActivateNextWindow(); | 1094 window_manager_internal_client_->ActivateNextWindow(); |
| 1129 } | 1095 } |
| 1130 | 1096 |
| 1131 void WindowTreeClientImpl::SetUnderlaySurfaceOffsetAndExtendedHitArea( | 1097 void WindowTreeClient::SetUnderlaySurfaceOffsetAndExtendedHitArea( |
| 1132 Window* window, | 1098 Window* window, |
| 1133 const gfx::Vector2d& offset, | 1099 const gfx::Vector2d& offset, |
| 1134 const gfx::Insets& hit_area) { | 1100 const gfx::Insets& hit_area) { |
| 1135 if (window_manager_internal_client_) { | 1101 if (window_manager_internal_client_) { |
| 1136 window_manager_internal_client_->SetUnderlaySurfaceOffsetAndExtendedHitArea( | 1102 window_manager_internal_client_->SetUnderlaySurfaceOffsetAndExtendedHitArea( |
| 1137 server_id(window), offset.x(), offset.y(), | 1103 server_id(window), offset.x(), offset.y(), |
| 1138 mojo::Insets::From(hit_area)); | 1104 mojo::Insets::From(hit_area)); |
| 1139 } | 1105 } |
| 1140 } | 1106 } |
| 1141 | 1107 |
| 1142 } // namespace mus | 1108 } // namespace mus |
| OLD | NEW |