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/window.h" | 5 #include "components/mus/public/cpp/window.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <set> | 10 #include <set> |
11 #include <string> | 11 #include <string> |
12 | 12 |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
15 #include "components/mus/common/transient_window_utils.h" | 15 #include "components/mus/common/transient_window_utils.h" |
16 #include "components/mus/public/cpp/lib/window_private.h" | 16 #include "components/mus/public/cpp/lib/window_private.h" |
17 #include "components/mus/public/cpp/lib/window_tree_client_impl.h" | |
18 #include "components/mus/public/cpp/property_type_converters.h" | 17 #include "components/mus/public/cpp/property_type_converters.h" |
19 #include "components/mus/public/cpp/window_observer.h" | 18 #include "components/mus/public/cpp/window_observer.h" |
20 #include "components/mus/public/cpp/window_property.h" | 19 #include "components/mus/public/cpp/window_property.h" |
21 #include "components/mus/public/cpp/window_surface.h" | 20 #include "components/mus/public/cpp/window_surface.h" |
22 #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_client.h" |
23 #include "components/mus/public/interfaces/window_manager.mojom.h" | 23 #include "components/mus/public/interfaces/window_manager.mojom.h" |
24 #include "ui/display/display.h" | 24 #include "ui/display/display.h" |
25 #include "ui/gfx/geometry/rect.h" | 25 #include "ui/gfx/geometry/rect.h" |
26 #include "ui/gfx/geometry/size.h" | 26 #include "ui/gfx/geometry/size.h" |
27 | 27 |
28 namespace mus { | 28 namespace mus { |
29 | 29 |
30 namespace { | 30 namespace { |
31 | 31 |
32 void NotifyWindowTreeChangeAtReceiver( | 32 void NotifyWindowTreeChangeAtReceiver( |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 } | 140 } |
141 | 141 |
142 private: | 142 private: |
143 Window* window_; | 143 Window* window_; |
144 const gfx::Rect old_bounds_; | 144 const gfx::Rect old_bounds_; |
145 const gfx::Rect new_bounds_; | 145 const gfx::Rect new_bounds_; |
146 | 146 |
147 DISALLOW_COPY_AND_ASSIGN(ScopedSetBoundsNotifier); | 147 DISALLOW_COPY_AND_ASSIGN(ScopedSetBoundsNotifier); |
148 }; | 148 }; |
149 | 149 |
150 // Some operations are only permitted in the connection that created the window. | 150 // Some operations are only permitted in the client that created the window. |
151 bool OwnsWindow(WindowTreeConnection* connection, Window* window) { | 151 bool OwnsWindow(WindowTreeClient* client, Window* window) { |
152 return !connection || | 152 return !client || client->OwnsWindow(window); |
153 static_cast<WindowTreeClientImpl*>(connection)->OwnsWindow(window); | |
154 } | 153 } |
155 | 154 |
156 bool IsConnectionRoot(Window* window) { | 155 bool IsClientRoot(Window* window) { |
157 return window->connection() && | 156 return window->window_tree() && |
158 window->connection()->GetRoots().count(window) > 0; | 157 window->window_tree()->GetRoots().count(window) > 0; |
159 } | 158 } |
160 | 159 |
161 bool OwnsWindowOrIsRoot(Window* window) { | 160 bool OwnsWindowOrIsRoot(Window* window) { |
162 return OwnsWindow(window->connection(), window) || IsConnectionRoot(window); | 161 return OwnsWindow(window->window_tree(), window) || IsClientRoot(window); |
163 } | 162 } |
164 | 163 |
165 void EmptyEmbedCallback(bool result) {} | 164 void EmptyEmbedCallback(bool result) {} |
166 | 165 |
167 } // namespace | 166 } // namespace |
168 | 167 |
169 //////////////////////////////////////////////////////////////////////////////// | 168 //////////////////////////////////////////////////////////////////////////////// |
170 // Window, public: | 169 // Window, public: |
171 | 170 |
172 void Window::Destroy() { | 171 void Window::Destroy() { |
173 if (!OwnsWindowOrIsRoot(this)) | 172 if (!OwnsWindowOrIsRoot(this)) |
174 return; | 173 return; |
175 | 174 |
176 if (connection_) | 175 if (client_) |
177 tree_client()->DestroyWindow(this); | 176 client_->DestroyWindow(this); |
178 while (!children_.empty()) { | 177 while (!children_.empty()) { |
179 Window* child = children_.front(); | 178 Window* child = children_.front(); |
180 if (!OwnsWindow(connection_, child)) { | 179 if (!OwnsWindow(client_, child)) { |
181 WindowPrivate(child).ClearParent(); | 180 WindowPrivate(child).ClearParent(); |
182 children_.erase(children_.begin()); | 181 children_.erase(children_.begin()); |
183 } else { | 182 } else { |
184 child->Destroy(); | 183 child->Destroy(); |
185 DCHECK(std::find(children_.begin(), children_.end(), child) == | 184 DCHECK(std::find(children_.begin(), children_.end(), child) == |
186 children_.end()); | 185 children_.end()); |
187 } | 186 } |
188 } | 187 } |
189 LocalDestroy(); | 188 LocalDestroy(); |
190 } | 189 } |
191 | 190 |
192 void Window::SetBounds(const gfx::Rect& bounds) { | 191 void Window::SetBounds(const gfx::Rect& bounds) { |
193 if (!OwnsWindowOrIsRoot(this)) | 192 if (!OwnsWindowOrIsRoot(this)) |
194 return; | 193 return; |
195 if (bounds_ == bounds) | 194 if (bounds_ == bounds) |
196 return; | 195 return; |
197 if (connection_) | 196 if (client_) |
198 tree_client()->SetBounds(this, bounds_, bounds); | 197 client_->SetBounds(this, bounds_, bounds); |
199 LocalSetBounds(bounds_, bounds); | 198 LocalSetBounds(bounds_, bounds); |
200 } | 199 } |
201 | 200 |
202 gfx::Rect Window::GetBoundsInRoot() const { | 201 gfx::Rect Window::GetBoundsInRoot() const { |
203 gfx::Vector2d offset; | 202 gfx::Vector2d offset; |
204 for (const Window* w = parent(); w != nullptr; w = w->parent()) | 203 for (const Window* w = parent(); w != nullptr; w = w->parent()) |
205 offset += w->bounds().OffsetFromOrigin(); | 204 offset += w->bounds().OffsetFromOrigin(); |
206 return bounds() + offset; | 205 return bounds() + offset; |
207 } | 206 } |
208 | 207 |
209 void Window::SetClientArea( | 208 void Window::SetClientArea( |
210 const gfx::Insets& client_area, | 209 const gfx::Insets& client_area, |
211 const std::vector<gfx::Rect>& additional_client_areas) { | 210 const std::vector<gfx::Rect>& additional_client_areas) { |
212 if (!OwnsWindowOrIsRoot(this)) | 211 if (!OwnsWindowOrIsRoot(this)) |
213 return; | 212 return; |
214 | 213 |
215 if (connection_) | 214 if (client_) |
216 tree_client()->SetClientArea(server_id_, client_area, | 215 client_->SetClientArea(server_id_, client_area, |
217 additional_client_areas); | 216 additional_client_areas); |
218 LocalSetClientArea(client_area, additional_client_areas); | 217 LocalSetClientArea(client_area, additional_client_areas); |
219 } | 218 } |
220 | 219 |
221 void Window::SetHitTestMask(const gfx::Rect& mask) { | 220 void Window::SetHitTestMask(const gfx::Rect& mask) { |
222 if (!OwnsWindowOrIsRoot(this)) | 221 if (!OwnsWindowOrIsRoot(this)) |
223 return; | 222 return; |
224 | 223 |
225 if (hit_test_mask_ && *hit_test_mask_ == mask) | 224 if (hit_test_mask_ && *hit_test_mask_ == mask) |
226 return; | 225 return; |
227 | 226 |
228 if (connection_) | 227 if (client_) |
229 tree_client()->SetHitTestMask(server_id_, mask); | 228 client_->SetHitTestMask(server_id_, mask); |
230 hit_test_mask_.reset(new gfx::Rect(mask)); | 229 hit_test_mask_.reset(new gfx::Rect(mask)); |
231 } | 230 } |
232 | 231 |
233 void Window::ClearHitTestMask() { | 232 void Window::ClearHitTestMask() { |
234 if (!OwnsWindowOrIsRoot(this)) | 233 if (!OwnsWindowOrIsRoot(this)) |
235 return; | 234 return; |
236 | 235 |
237 if (!hit_test_mask_) | 236 if (!hit_test_mask_) |
238 return; | 237 return; |
239 | 238 |
240 if (connection_) | 239 if (client_) |
241 tree_client()->ClearHitTestMask(server_id_); | 240 client_->ClearHitTestMask(server_id_); |
242 hit_test_mask_.reset(); | 241 hit_test_mask_.reset(); |
243 } | 242 } |
244 | 243 |
245 void Window::SetVisible(bool value) { | 244 void Window::SetVisible(bool value) { |
246 if (visible_ == value) | 245 if (visible_ == value) |
247 return; | 246 return; |
248 | 247 |
249 if (connection_) | 248 if (client_) |
250 tree_client()->SetVisible(this, value); | 249 client_->SetVisible(this, value); |
251 LocalSetVisible(value); | 250 LocalSetVisible(value); |
252 } | 251 } |
253 | 252 |
254 void Window::SetOpacity(float opacity) { | 253 void Window::SetOpacity(float opacity) { |
255 if (connection_) | 254 if (client_) |
256 tree_client()->SetOpacity(this, opacity); | 255 client_->SetOpacity(this, opacity); |
257 LocalSetOpacity(opacity); | 256 LocalSetOpacity(opacity); |
258 } | 257 } |
259 | 258 |
260 void Window::SetPredefinedCursor(mus::mojom::Cursor cursor_id) { | 259 void Window::SetPredefinedCursor(mus::mojom::Cursor cursor_id) { |
261 if (cursor_id_ == cursor_id) | 260 if (cursor_id_ == cursor_id) |
262 return; | 261 return; |
263 | 262 |
264 if (connection_) | 263 if (client_) |
265 tree_client()->SetPredefinedCursor(server_id_, cursor_id); | 264 client_->SetPredefinedCursor(server_id_, cursor_id); |
266 LocalSetPredefinedCursor(cursor_id); | 265 LocalSetPredefinedCursor(cursor_id); |
267 } | 266 } |
268 | 267 |
269 bool Window::IsDrawn() const { | 268 bool Window::IsDrawn() const { |
270 if (!visible_) | 269 if (!visible_) |
271 return false; | 270 return false; |
272 return parent_ ? parent_->IsDrawn() : parent_drawn_; | 271 return parent_ ? parent_->IsDrawn() : parent_drawn_; |
273 } | 272 } |
274 | 273 |
275 std::unique_ptr<WindowSurface> Window::RequestSurface(mojom::SurfaceType type) { | 274 std::unique_ptr<WindowSurface> Window::RequestSurface(mojom::SurfaceType type) { |
276 std::unique_ptr<WindowSurfaceBinding> surface_binding; | 275 std::unique_ptr<WindowSurfaceBinding> surface_binding; |
277 std::unique_ptr<WindowSurface> surface = | 276 std::unique_ptr<WindowSurface> surface = |
278 WindowSurface::Create(&surface_binding); | 277 WindowSurface::Create(&surface_binding); |
279 AttachSurface(type, std::move(surface_binding)); | 278 AttachSurface(type, std::move(surface_binding)); |
280 return surface; | 279 return surface; |
281 } | 280 } |
282 | 281 |
283 void Window::AttachSurface( | 282 void Window::AttachSurface( |
284 mojom::SurfaceType type, | 283 mojom::SurfaceType type, |
285 std::unique_ptr<WindowSurfaceBinding> surface_binding) { | 284 std::unique_ptr<WindowSurfaceBinding> surface_binding) { |
286 tree_client()->AttachSurface( | 285 window_tree()->AttachSurface( |
287 server_id_, type, std::move(surface_binding->surface_request_), | 286 server_id_, type, std::move(surface_binding->surface_request_), |
288 mojo::MakeProxy(std::move(surface_binding->surface_client_))); | 287 mojo::MakeProxy(std::move(surface_binding->surface_client_))); |
289 } | 288 } |
290 | 289 |
291 void Window::ClearSharedProperty(const std::string& name) { | 290 void Window::ClearSharedProperty(const std::string& name) { |
292 SetSharedPropertyInternal(name, nullptr); | 291 SetSharedPropertyInternal(name, nullptr); |
293 } | 292 } |
294 | 293 |
295 bool Window::HasSharedProperty(const std::string& name) const { | 294 bool Window::HasSharedProperty(const std::string& name) const { |
296 return properties_.count(name) > 0; | 295 return properties_.count(name) > 0; |
297 } | 296 } |
298 | 297 |
299 void Window::AddObserver(WindowObserver* observer) { | 298 void Window::AddObserver(WindowObserver* observer) { |
300 observers_.AddObserver(observer); | 299 observers_.AddObserver(observer); |
301 } | 300 } |
302 | 301 |
303 void Window::RemoveObserver(WindowObserver* observer) { | 302 void Window::RemoveObserver(WindowObserver* observer) { |
304 observers_.RemoveObserver(observer); | 303 observers_.RemoveObserver(observer); |
305 } | 304 } |
306 | 305 |
307 const Window* Window::GetRoot() const { | 306 const Window* Window::GetRoot() const { |
308 const Window* root = this; | 307 const Window* root = this; |
309 for (const Window* parent = this; parent; parent = parent->parent()) | 308 for (const Window* parent = this; parent; parent = parent->parent()) |
310 root = parent; | 309 root = parent; |
311 return root; | 310 return root; |
312 } | 311 } |
313 | 312 |
314 void Window::AddChild(Window* child) { | 313 void Window::AddChild(Window* child) { |
315 // TODO(beng): not necessarily valid to all connections, but possibly to the | 314 // TODO(beng): not necessarily valid to all clients, but possibly to the |
316 // embeddee in an embedder-embeddee relationship. | 315 // embeddee in an embedder-embeddee relationship. |
317 if (connection_) | 316 if (client_) |
318 CHECK_EQ(child->connection(), connection_); | 317 CHECK_EQ(child->client_, client_); |
319 // Roots can not be added as children of other windows. | 318 // Roots can not be added as children of other windows. |
320 if (tree_client() && tree_client()->IsRoot(child)) | 319 if (window_tree() && window_tree()->IsRoot(child)) |
321 return; | 320 return; |
322 LocalAddChild(child); | 321 LocalAddChild(child); |
323 if (connection_) | 322 if (client_) |
324 tree_client()->AddChild(this, child->server_id()); | 323 client_->AddChild(this, child->server_id()); |
325 } | 324 } |
326 | 325 |
327 void Window::RemoveChild(Window* child) { | 326 void Window::RemoveChild(Window* child) { |
328 // TODO(beng): not necessarily valid to all connections, but possibly to the | 327 // TODO(beng): not necessarily valid to all clients, but possibly to the |
329 // embeddee in an embedder-embeddee relationship. | 328 // embeddee in an embedder-embeddee relationship. |
330 if (connection_) | 329 if (client_) |
331 CHECK_EQ(child->connection(), connection_); | 330 CHECK_EQ(child->client_, client_); |
332 LocalRemoveChild(child); | 331 LocalRemoveChild(child); |
333 if (connection_) | 332 if (client_) |
334 tree_client()->RemoveChild(this, child->server_id()); | 333 client_->RemoveChild(this, child->server_id()); |
335 } | 334 } |
336 | 335 |
337 void Window::Reorder(Window* relative, mojom::OrderDirection direction) { | 336 void Window::Reorder(Window* relative, mojom::OrderDirection direction) { |
338 if (!LocalReorder(relative, direction)) | 337 if (!LocalReorder(relative, direction)) |
339 return; | 338 return; |
340 if (connection_) | 339 if (client_) |
341 tree_client()->Reorder(this, relative->server_id(), direction); | 340 client_->Reorder(this, relative->server_id(), direction); |
342 } | 341 } |
343 | 342 |
344 void Window::MoveToFront() { | 343 void Window::MoveToFront() { |
345 if (!parent_ || parent_->children_.back() == this) | 344 if (!parent_ || parent_->children_.back() == this) |
346 return; | 345 return; |
347 Reorder(parent_->children_.back(), mojom::OrderDirection::ABOVE); | 346 Reorder(parent_->children_.back(), mojom::OrderDirection::ABOVE); |
348 } | 347 } |
349 | 348 |
350 void Window::MoveToBack() { | 349 void Window::MoveToBack() { |
351 if (!parent_ || parent_->children_.front() == this) | 350 if (!parent_ || parent_->children_.front() == this) |
352 return; | 351 return; |
353 Reorder(parent_->children_.front(), mojom::OrderDirection::BELOW); | 352 Reorder(parent_->children_.front(), mojom::OrderDirection::BELOW); |
354 } | 353 } |
355 | 354 |
356 bool Window::Contains(const Window* child) const { | 355 bool Window::Contains(const Window* child) const { |
357 if (!child) | 356 if (!child) |
358 return false; | 357 return false; |
359 if (child == this) | 358 if (child == this) |
360 return true; | 359 return true; |
361 if (connection_) | 360 if (client_) |
362 CHECK_EQ(child->connection_, connection_); | 361 CHECK_EQ(child->client_, client_); |
363 for (const Window* p = child->parent(); p; p = p->parent()) { | 362 for (const Window* p = child->parent(); p; p = p->parent()) { |
364 if (p == this) | 363 if (p == this) |
365 return true; | 364 return true; |
366 } | 365 } |
367 return false; | 366 return false; |
368 } | 367 } |
369 | 368 |
370 void Window::AddTransientWindow(Window* transient_window) { | 369 void Window::AddTransientWindow(Window* transient_window) { |
371 // A system modal window cannot become a transient child. | 370 // A system modal window cannot become a transient child. |
372 DCHECK(!transient_window->is_modal() || transient_window->transient_parent()); | 371 DCHECK(!transient_window->is_modal() || transient_window->transient_parent()); |
373 | 372 |
374 if (connection_) | 373 if (client_) |
375 CHECK_EQ(transient_window->connection(), connection_); | 374 CHECK_EQ(transient_window->client_, client_); |
376 LocalAddTransientWindow(transient_window); | 375 LocalAddTransientWindow(transient_window); |
377 if (connection_) | 376 if (client_) |
378 tree_client()->AddTransientWindow(this, transient_window->server_id()); | 377 client_->AddTransientWindow(this, transient_window->server_id()); |
379 } | 378 } |
380 | 379 |
381 void Window::RemoveTransientWindow(Window* transient_window) { | 380 void Window::RemoveTransientWindow(Window* transient_window) { |
382 if (connection_) | 381 if (client_) |
383 CHECK_EQ(transient_window->connection(), connection_); | 382 CHECK_EQ(transient_window->window_tree(), client_); |
384 LocalRemoveTransientWindow(transient_window); | 383 LocalRemoveTransientWindow(transient_window); |
385 if (connection_) | 384 if (client_) |
386 tree_client()->RemoveTransientWindowFromParent(transient_window); | 385 client_->RemoveTransientWindowFromParent(transient_window); |
387 } | 386 } |
388 | 387 |
389 void Window::SetModal() { | 388 void Window::SetModal() { |
390 if (is_modal_) | 389 if (is_modal_) |
391 return; | 390 return; |
392 | 391 |
393 LocalSetModal(); | 392 LocalSetModal(); |
394 if (connection_) | 393 if (client_) |
395 tree_client()->SetModal(this); | 394 client_->SetModal(this); |
396 } | 395 } |
397 | 396 |
398 Window* Window::GetChildByLocalId(int id) { | 397 Window* Window::GetChildByLocalId(int id) { |
399 if (id == local_id_) | 398 if (id == local_id_) |
400 return this; | 399 return this; |
401 // TODO(beng): this could be improved depending on how we decide to own | 400 // TODO(beng): this could be improved depending on how we decide to own |
402 // windows. | 401 // windows. |
403 for (Window* child : children_) { | 402 for (Window* child : children_) { |
404 Window* matching_child = child->GetChildByLocalId(id); | 403 Window* matching_child = child->GetChildByLocalId(id); |
405 if (matching_child) | 404 if (matching_child) |
406 return matching_child; | 405 return matching_child; |
407 } | 406 } |
408 return nullptr; | 407 return nullptr; |
409 } | 408 } |
410 | 409 |
411 void Window::SetTextInputState(mojo::TextInputStatePtr state) { | 410 void Window::SetTextInputState(mojo::TextInputStatePtr state) { |
412 if (connection_) | 411 if (client_) |
413 tree_client()->SetWindowTextInputState(server_id_, std::move(state)); | 412 client_->SetWindowTextInputState(server_id_, std::move(state)); |
414 } | 413 } |
415 | 414 |
416 void Window::SetImeVisibility(bool visible, mojo::TextInputStatePtr state) { | 415 void Window::SetImeVisibility(bool visible, mojo::TextInputStatePtr state) { |
417 // SetImeVisibility() shouldn't be used if the window is not editable. | 416 // SetImeVisibility() shouldn't be used if the window is not editable. |
418 DCHECK(state.is_null() || state->type != mojo::TextInputType::NONE); | 417 DCHECK(state.is_null() || state->type != mojo::TextInputType::NONE); |
419 if (connection_) | 418 if (client_) |
420 tree_client()->SetImeVisibility(server_id_, visible, std::move(state)); | 419 client_->SetImeVisibility(server_id_, visible, std::move(state)); |
421 } | 420 } |
422 | 421 |
423 bool Window::HasCapture() const { | 422 bool Window::HasCapture() const { |
424 return connection_ && connection_->GetCaptureWindow() == this; | 423 return client_ && client_->GetCaptureWindow() == this; |
425 } | 424 } |
426 | 425 |
427 void Window::SetCapture() { | 426 void Window::SetCapture() { |
428 if (connection_) | 427 if (client_) |
429 tree_client()->SetCapture(this); | 428 client_->SetCapture(this); |
430 } | 429 } |
431 | 430 |
432 void Window::ReleaseCapture() { | 431 void Window::ReleaseCapture() { |
433 if (connection_) | 432 if (client_) |
434 tree_client()->ReleaseCapture(this); | 433 client_->ReleaseCapture(this); |
435 } | 434 } |
436 | 435 |
437 void Window::SetFocus() { | 436 void Window::SetFocus() { |
438 if (connection_ && IsDrawn()) | 437 if (client_ && IsDrawn()) |
439 tree_client()->SetFocus(this); | 438 client_->SetFocus(this); |
440 } | 439 } |
441 | 440 |
442 bool Window::HasFocus() const { | 441 bool Window::HasFocus() const { |
443 return connection_ && connection_->GetFocusedWindow() == this; | 442 return client_ && client_->GetFocusedWindow() == this; |
444 } | 443 } |
445 | 444 |
446 void Window::SetCanFocus(bool can_focus) { | 445 void Window::SetCanFocus(bool can_focus) { |
447 if (connection_) | 446 if (client_) |
448 tree_client()->SetCanFocus(server_id_, can_focus); | 447 client_->SetCanFocus(server_id_, can_focus); |
449 } | 448 } |
450 | 449 |
451 void Window::Embed(mus::mojom::WindowTreeClientPtr client) { | 450 void Window::Embed(mus::mojom::WindowTreeClientPtr client) { |
452 Embed(std::move(client), base::Bind(&EmptyEmbedCallback)); | 451 Embed(std::move(client), base::Bind(&EmptyEmbedCallback)); |
453 } | 452 } |
454 | 453 |
455 void Window::Embed(mus::mojom::WindowTreeClientPtr client, | 454 void Window::Embed(mus::mojom::WindowTreeClientPtr client, |
456 const EmbedCallback& callback) { | 455 const EmbedCallback& callback) { |
457 if (PrepareForEmbed()) | 456 if (PrepareForEmbed()) |
458 tree_client()->Embed(server_id_, std::move(client), callback); | 457 client_->Embed(server_id_, std::move(client), callback); |
459 else | 458 else |
460 callback.Run(false); | 459 callback.Run(false); |
461 } | 460 } |
462 | 461 |
463 void Window::RequestClose() { | 462 void Window::RequestClose() { |
464 if (tree_client()) | 463 if (client_) |
465 tree_client()->RequestClose(this); | 464 client_->RequestClose(this); |
466 } | 465 } |
467 | 466 |
468 std::string Window::GetName() const { | 467 std::string Window::GetName() const { |
469 if (HasSharedProperty(mojom::WindowManager::kName_Property)) | 468 if (HasSharedProperty(mojom::WindowManager::kName_Property)) |
470 return GetSharedProperty<std::string>(mojom::WindowManager::kName_Property); | 469 return GetSharedProperty<std::string>(mojom::WindowManager::kName_Property); |
471 | 470 |
472 return std::string(); | 471 return std::string(); |
473 } | 472 } |
474 | 473 |
475 //////////////////////////////////////////////////////////////////////////////// | 474 //////////////////////////////////////////////////////////////////////////////// |
476 // Window, protected: | 475 // Window, protected: |
477 | 476 |
478 Window::Window() : Window(nullptr, static_cast<Id>(-1)) {} | 477 Window::Window() : Window(nullptr, static_cast<Id>(-1)) {} |
479 | 478 |
480 Window::~Window() { | 479 Window::~Window() { |
481 FOR_EACH_OBSERVER(WindowObserver, observers_, OnWindowDestroying(this)); | 480 FOR_EACH_OBSERVER(WindowObserver, observers_, OnWindowDestroying(this)); |
482 if (tree_client()) | 481 if (client_) |
483 tree_client()->OnWindowDestroying(this); | 482 client_->OnWindowDestroying(this); |
484 | 483 |
485 if (HasFocus()) { | 484 if (HasFocus()) { |
486 // The focused window is being removed. When this happens the server | 485 // The focused window is being removed. When this happens the server |
487 // advances focus. We don't want to randomly pick a Window to get focus, so | 486 // advances focus. We don't want to randomly pick a Window to get focus, so |
488 // we update local state only, and wait for the next focus change from the | 487 // we update local state only, and wait for the next focus change from the |
489 // server. | 488 // server. |
490 tree_client()->LocalSetFocus(nullptr); | 489 client_->LocalSetFocus(nullptr); |
491 } | 490 } |
492 | 491 |
493 // Remove from transient parent. | 492 // Remove from transient parent. |
494 if (transient_parent_) | 493 if (transient_parent_) |
495 transient_parent_->LocalRemoveTransientWindow(this); | 494 transient_parent_->LocalRemoveTransientWindow(this); |
496 | 495 |
497 // Remove transient children. | 496 // Remove transient children. |
498 while (!transient_children_.empty()) { | 497 while (!transient_children_.empty()) { |
499 Window* transient_child = transient_children_.front(); | 498 Window* transient_child = transient_children_.front(); |
500 LocalRemoveTransientWindow(transient_child); | 499 LocalRemoveTransientWindow(transient_child); |
(...skipping 17 matching lines...) Expand all Loading... |
518 for (auto& pair : prop_map_) { | 517 for (auto& pair : prop_map_) { |
519 if (pair.second.deallocator) | 518 if (pair.second.deallocator) |
520 (*pair.second.deallocator)(pair.second.value); | 519 (*pair.second.deallocator)(pair.second.value); |
521 } | 520 } |
522 prop_map_.clear(); | 521 prop_map_.clear(); |
523 | 522 |
524 FOR_EACH_OBSERVER(WindowObserver, observers_, OnWindowDestroyed(this)); | 523 FOR_EACH_OBSERVER(WindowObserver, observers_, OnWindowDestroyed(this)); |
525 | 524 |
526 // Invoke after observers so that can clean up any internal state observers | 525 // Invoke after observers so that can clean up any internal state observers |
527 // may have changed. | 526 // may have changed. |
528 if (tree_client()) | 527 if (window_tree()) |
529 tree_client()->OnWindowDestroyed(this); | 528 window_tree()->OnWindowDestroyed(this); |
530 } | 529 } |
531 | 530 |
532 //////////////////////////////////////////////////////////////////////////////// | 531 //////////////////////////////////////////////////////////////////////////////// |
533 // Window, private: | 532 // Window, private: |
534 | 533 |
535 Window::Window(WindowTreeConnection* connection, Id id) | 534 Window::Window(WindowTreeClient* client, Id id) |
536 : connection_(connection), | 535 : client_(client), |
537 server_id_(id), | 536 server_id_(id), |
538 parent_(nullptr), | 537 parent_(nullptr), |
539 stacking_target_(nullptr), | 538 stacking_target_(nullptr), |
540 transient_parent_(nullptr), | 539 transient_parent_(nullptr), |
541 is_modal_(false), | 540 is_modal_(false), |
542 // Matches aura, see aura::Window for details. | 541 // Matches aura, see aura::Window for details. |
543 observers_(base::ObserverList<WindowObserver>::NOTIFY_EXISTING_ONLY), | 542 observers_(base::ObserverList<WindowObserver>::NOTIFY_EXISTING_ONLY), |
544 input_event_handler_(nullptr), | 543 input_event_handler_(nullptr), |
545 visible_(false), | 544 visible_(false), |
546 opacity_(1.0f), | 545 opacity_(1.0f), |
547 display_id_(display::Display::kInvalidDisplayID), | 546 display_id_(display::Display::kInvalidDisplayID), |
548 cursor_id_(mojom::Cursor::CURSOR_NULL), | 547 cursor_id_(mojom::Cursor::CURSOR_NULL), |
549 parent_drawn_(false) {} | 548 parent_drawn_(false) {} |
550 | 549 |
551 WindowTreeClientImpl* Window::tree_client() { | |
552 return static_cast<WindowTreeClientImpl*>(connection_); | |
553 } | |
554 | |
555 void Window::SetSharedPropertyInternal(const std::string& name, | 550 void Window::SetSharedPropertyInternal(const std::string& name, |
556 const std::vector<uint8_t>* value) { | 551 const std::vector<uint8_t>* value) { |
557 if (!OwnsWindowOrIsRoot(this)) | 552 if (!OwnsWindowOrIsRoot(this)) |
558 return; | 553 return; |
559 | 554 |
560 if (connection_) { | 555 if (client_) { |
561 mojo::Array<uint8_t> transport_value(nullptr); | 556 mojo::Array<uint8_t> transport_value(nullptr); |
562 if (value) { | 557 if (value) { |
563 transport_value.resize(value->size()); | 558 transport_value.resize(value->size()); |
564 if (value->size()) | 559 if (value->size()) |
565 memcpy(&transport_value.front(), &(value->front()), value->size()); | 560 memcpy(&transport_value.front(), &(value->front()), value->size()); |
566 } | 561 } |
567 // TODO: add test coverage of this (450303). | 562 // TODO: add test coverage of this (450303). |
568 tree_client()->SetProperty(this, name, std::move(transport_value)); | 563 client_->SetProperty(this, name, std::move(transport_value)); |
569 } | 564 } |
570 LocalSetSharedProperty(name, value); | 565 LocalSetSharedProperty(name, value); |
571 } | 566 } |
572 | 567 |
573 int64_t Window::SetLocalPropertyInternal(const void* key, | 568 int64_t Window::SetLocalPropertyInternal(const void* key, |
574 const char* name, | 569 const char* name, |
575 PropertyDeallocator deallocator, | 570 PropertyDeallocator deallocator, |
576 int64_t value, | 571 int64_t value, |
577 int64_t default_value) { | 572 int64_t default_value) { |
578 int64_t old = GetLocalPropertyInternal(key, default_value); | 573 int64_t old = GetLocalPropertyInternal(key, default_value); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 | 639 |
645 bool Window::LocalReorder(Window* relative, mojom::OrderDirection direction) { | 640 bool Window::LocalReorder(Window* relative, mojom::OrderDirection direction) { |
646 OrderChangedNotifier notifier(this, relative, direction); | 641 OrderChangedNotifier notifier(this, relative, direction); |
647 return ReorderImpl(this, relative, direction, ¬ifier); | 642 return ReorderImpl(this, relative, direction, ¬ifier); |
648 } | 643 } |
649 | 644 |
650 void Window::LocalSetBounds(const gfx::Rect& old_bounds, | 645 void Window::LocalSetBounds(const gfx::Rect& old_bounds, |
651 const gfx::Rect& new_bounds) { | 646 const gfx::Rect& new_bounds) { |
652 // If this client owns the window, then it should be the only one to change | 647 // If this client owns the window, then it should be the only one to change |
653 // the bounds. | 648 // the bounds. |
654 DCHECK(!OwnsWindow(connection_, this) || old_bounds == bounds_); | 649 DCHECK(!OwnsWindow(client_, this) || old_bounds == bounds_); |
655 ScopedSetBoundsNotifier notifier(this, old_bounds, new_bounds); | 650 ScopedSetBoundsNotifier notifier(this, old_bounds, new_bounds); |
656 bounds_ = new_bounds; | 651 bounds_ = new_bounds; |
657 } | 652 } |
658 | 653 |
659 void Window::LocalSetClientArea( | 654 void Window::LocalSetClientArea( |
660 const gfx::Insets& new_client_area, | 655 const gfx::Insets& new_client_area, |
661 const std::vector<gfx::Rect>& additional_client_areas) { | 656 const std::vector<gfx::Rect>& additional_client_areas) { |
662 const std::vector<gfx::Rect> old_additional_client_areas = | 657 const std::vector<gfx::Rect> old_additional_client_areas = |
663 additional_client_areas_; | 658 additional_client_areas_; |
664 const gfx::Insets old_client_area = client_area_; | 659 const gfx::Insets old_client_area = client_area_; |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 void Window::NotifyWindowVisibilityChangedUp(Window* target) { | 798 void Window::NotifyWindowVisibilityChangedUp(Window* target) { |
804 // Start with the parent as we already notified |this| | 799 // Start with the parent as we already notified |this| |
805 // in NotifyWindowVisibilityChangedDown. | 800 // in NotifyWindowVisibilityChangedDown. |
806 for (Window* window = parent(); window; window = window->parent()) { | 801 for (Window* window = parent(); window; window = window->parent()) { |
807 bool ret = window->NotifyWindowVisibilityChangedAtReceiver(target); | 802 bool ret = window->NotifyWindowVisibilityChangedAtReceiver(target); |
808 DCHECK(ret); | 803 DCHECK(ret); |
809 } | 804 } |
810 } | 805 } |
811 | 806 |
812 bool Window::PrepareForEmbed() { | 807 bool Window::PrepareForEmbed() { |
813 if (!OwnsWindow(connection_, this)) | 808 if (!OwnsWindow(client_, this)) |
814 return false; | 809 return false; |
815 | 810 |
816 while (!children_.empty()) | 811 while (!children_.empty()) |
817 RemoveChild(children_[0]); | 812 RemoveChild(children_[0]); |
818 return true; | 813 return true; |
819 } | 814 } |
820 | 815 |
821 void Window::RemoveTransientWindowImpl(Window* transient_window) { | 816 void Window::RemoveTransientWindowImpl(Window* transient_window) { |
822 Window::Children::iterator it = std::find( | 817 Window::Children::iterator it = std::find( |
823 transient_children_.begin(), transient_children_.end(), transient_window); | 818 transient_children_.begin(), transient_children_.end(), transient_window); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 notifier->NotifyWindowReordered(); | 881 notifier->NotifyWindowReordered(); |
887 | 882 |
888 return true; | 883 return true; |
889 } | 884 } |
890 | 885 |
891 // static | 886 // static |
892 Window** Window::GetStackingTarget(Window* window) { | 887 Window** Window::GetStackingTarget(Window* window) { |
893 return &window->stacking_target_; | 888 return &window->stacking_target_; |
894 } | 889 } |
895 } // namespace mus | 890 } // namespace mus |
OLD | NEW |