Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(713)

Side by Side Diff: mojo/services/view_manager/connection_manager.cc

Issue 1092033003: Pulls display related changes from mojo to chrome (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "mojo/services/view_manager/connection_manager.h" 5 #include "mojo/services/view_manager/connection_manager.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "mojo/converters/geometry/geometry_type_converters.h" 9 #include "mojo/converters/geometry/geometry_type_converters.h"
10 #include "mojo/converters/input_events/input_events_type_converters.h" 10 #include "mojo/converters/input_events/input_events_type_converters.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 connection_manager_->FinishChange(); 109 connection_manager_->FinishChange();
110 } 110 }
111 111
112 ConnectionManager::ConnectionManager(ConnectionManagerDelegate* delegate, 112 ConnectionManager::ConnectionManager(ConnectionManagerDelegate* delegate,
113 scoped_ptr<DisplayManager> display_manager, 113 scoped_ptr<DisplayManager> display_manager,
114 mojo::WindowManagerInternal* wm_internal) 114 mojo::WindowManagerInternal* wm_internal)
115 : delegate_(delegate), 115 : delegate_(delegate),
116 window_manager_client_connection_(nullptr), 116 window_manager_client_connection_(nullptr),
117 next_connection_id_(1), 117 next_connection_id_(1),
118 display_manager_(display_manager.Pass()), 118 display_manager_(display_manager.Pass()),
119 root_(new ServerView(this, RootViewId())), 119 root_(CreateServerView(RootViewId())),
120 wm_internal_(wm_internal), 120 wm_internal_(wm_internal),
121 current_change_(nullptr), 121 current_change_(nullptr),
122 in_destructor_(false), 122 in_destructor_(false),
123 animation_runner_(base::TimeTicks::Now()) { 123 animation_runner_(base::TimeTicks::Now()) {
124 root_->SetBounds(gfx::Rect(800, 600)); 124 root_->SetBounds(gfx::Rect(800, 600));
125 root_->SetVisible(true); 125 root_->SetVisible(true);
126 display_manager_->Init(this); 126 display_manager_->Init(this);
127 } 127 }
128 128
129 ConnectionManager::~ConnectionManager() { 129 ConnectionManager::~ConnectionManager() {
130 in_destructor_ = true; 130 in_destructor_ = true;
131 131
132 STLDeleteValues(&connection_map_); 132 STLDeleteValues(&connection_map_);
133 // All the connections should have been destroyed. 133 // All the connections should have been destroyed.
134 DCHECK(connection_map_.empty()); 134 DCHECK(connection_map_.empty());
135 root_.reset(); 135 root_.reset();
136 } 136 }
137 137
138 ServerView* ConnectionManager::CreateServerView(const ViewId& id) {
139 ServerView* view = new ServerView(this, id);
140 view->AddObserver(this);
141 return view;
142 }
143
138 ConnectionSpecificId ConnectionManager::GetAndAdvanceNextConnectionId() { 144 ConnectionSpecificId ConnectionManager::GetAndAdvanceNextConnectionId() {
139 const ConnectionSpecificId id = next_connection_id_++; 145 const ConnectionSpecificId id = next_connection_id_++;
140 DCHECK_LT(id, next_connection_id_); 146 DCHECK_LT(id, next_connection_id_);
141 return id; 147 return id;
142 } 148 }
143 149
144 void ConnectionManager::OnConnectionError(ClientConnection* connection) { 150 void ConnectionManager::OnConnectionError(ClientConnection* connection) {
145 if (connection == window_manager_client_connection_) { 151 if (connection == window_manager_client_connection_) {
146 window_manager_client_connection_ = nullptr; 152 window_manager_client_connection_ = nullptr;
147 delegate_->OnLostConnectionToWindowManager(); 153 delegate_->OnLostConnectionToWindowManager();
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 void ConnectionManager::DoAnimation() { 339 void ConnectionManager::DoAnimation() {
334 if (!DecrementAnimatingViewsOpacity(root())) 340 if (!DecrementAnimatingViewsOpacity(root()))
335 animation_timer_.Stop(); 341 animation_timer_.Stop();
336 } 342 }
337 343
338 void ConnectionManager::AddConnection(ClientConnection* connection) { 344 void ConnectionManager::AddConnection(ClientConnection* connection) {
339 DCHECK_EQ(0u, connection_map_.count(connection->service()->id())); 345 DCHECK_EQ(0u, connection_map_.count(connection->service()->id()));
340 connection_map_[connection->service()->id()] = connection; 346 connection_map_[connection->service()->id()] = connection;
341 } 347 }
342 348
343 void ConnectionManager::OnWillDestroyView(ServerView* view) { 349 void ConnectionManager::PrepareToDestroyView(ServerView* view) {
344 if (!in_destructor_ && root_->Contains(view) && view != root_.get() && 350 if (!in_destructor_ && root_->Contains(view) && view != root_.get() &&
345 view->id() != ClonedViewId()) { 351 view->id() != ClonedViewId()) {
346 // We're about to destroy a view. Any cloned views need to be reparented 352 // We're about to destroy a view. Any cloned views need to be reparented
347 // else the animation would no longer be visible. By moving to a visible 353 // else the animation would no longer be visible. By moving to a visible
348 // view, view->parent(), we ensure the animation is still visible. 354 // view, view->parent(), we ensure the animation is still visible.
349 ServerView* parent_above = view; 355 ServerView* parent_above = view;
350 ReparentClonedViews(view->parent(), &parent_above, view); 356 ReparentClonedViews(view->parent(), &parent_above, view);
351 } 357 }
352 358
353 animation_runner_.CancelAnimationForView(view); 359 animation_runner_.CancelAnimationForView(view);
354 } 360 }
355 361
356 void ConnectionManager::OnViewDestroyed(const ServerView* view) { 362 void ConnectionManager::PrepareToChangeViewHierarchy(ServerView* view,
357 if (!in_destructor_) 363 ServerView* new_parent,
358 ProcessViewDeleted(view->id()); 364 ServerView* old_parent) {
359 }
360
361 void ConnectionManager::OnWillChangeViewHierarchy(ServerView* view,
362 ServerView* new_parent,
363 ServerView* old_parent) {
364 if (view->id() == ClonedViewId() || in_destructor_) 365 if (view->id() == ClonedViewId() || in_destructor_)
365 return; 366 return;
366 367
367 if (root_->Contains(view) && view != root_.get()) { 368 if (root_->Contains(view) && view != root_.get()) {
368 // We're about to reparent a view. Any cloned views need to be reparented 369 // We're about to reparent a view. Any cloned views need to be reparented
369 // else the animation may be effected in unusual ways. For example, the view 370 // else the animation may be effected in unusual ways. For example, the view
370 // could move to a new location such that the animation is entirely clipped. 371 // could move to a new location such that the animation is entirely clipped.
371 // By moving to view->parent() we ensure the animation is still visible. 372 // By moving to view->parent() we ensure the animation is still visible.
372 ServerView* parent_above = view; 373 ServerView* parent_above = view;
373 ReparentClonedViews(view->parent(), &parent_above, view); 374 ReparentClonedViews(view->parent(), &parent_above, view);
374 } 375 }
375 376
376 ProcessWillChangeViewHierarchy(view, new_parent, old_parent);
377
378 animation_runner_.CancelAnimationForView(view); 377 animation_runner_.CancelAnimationForView(view);
379 } 378 }
380 379
381 void ConnectionManager::OnViewHierarchyChanged(const ServerView* view, 380 void ConnectionManager::PrepareToChangeViewVisibility(ServerView* view) {
382 const ServerView* new_parent,
383 const ServerView* old_parent) {
384 if (in_destructor_) 381 if (in_destructor_)
385 return; 382 return;
386 383
384 if (view != root_.get() && view->id() != ClonedViewId() &&
385 root_->Contains(view) && view->IsDrawn(root_.get())) {
386 // We're about to hide |view|, this would implicitly make any cloned views
387 // hide too. Reparent so that animations are still visible.
388 ServerView* parent_above = view;
389 ReparentClonedViews(view->parent(), &parent_above, view);
390 }
391
392 const bool is_parent_drawn =
393 view->parent() && view->parent()->IsDrawn(root_.get());
394 if (!is_parent_drawn || !view->visible())
395 animation_runner_.CancelAnimationForView(view);
396 }
397
398 void ConnectionManager::OnScheduleViewPaint(const ServerView* view) {
399 if (!in_destructor_)
400 display_manager_->SchedulePaint(view, gfx::Rect(view->bounds().size()));
401 }
402
403 void ConnectionManager::OnViewDestroyed(ServerView* view) {
404 if (!in_destructor_)
405 ProcessViewDeleted(view->id());
406 }
407
408 void ConnectionManager::OnWillChangeViewHierarchy(ServerView* view,
409 ServerView* new_parent,
410 ServerView* old_parent) {
411 if (view->id() == ClonedViewId() || in_destructor_)
412 return;
413
414 ProcessWillChangeViewHierarchy(view, new_parent, old_parent);
415 }
416
417 void ConnectionManager::OnViewHierarchyChanged(ServerView* view,
418 ServerView* new_parent,
419 ServerView* old_parent) {
420 if (in_destructor_)
421 return;
422
387 ProcessViewHierarchyChanged(view, new_parent, old_parent); 423 ProcessViewHierarchyChanged(view, new_parent, old_parent);
388 424
389 // TODO(beng): optimize. 425 // TODO(beng): optimize.
390 if (old_parent) { 426 if (old_parent) {
391 display_manager_->SchedulePaint(old_parent, 427 display_manager_->SchedulePaint(old_parent,
392 gfx::Rect(old_parent->bounds().size())); 428 gfx::Rect(old_parent->bounds().size()));
393 } 429 }
394 if (new_parent) { 430 if (new_parent) {
395 display_manager_->SchedulePaint(new_parent, 431 display_manager_->SchedulePaint(new_parent,
396 gfx::Rect(new_parent->bounds().size())); 432 gfx::Rect(new_parent->bounds().size()));
397 } 433 }
398 } 434 }
399 435
400 void ConnectionManager::OnViewBoundsChanged(const ServerView* view, 436 void ConnectionManager::OnViewBoundsChanged(ServerView* view,
401 const gfx::Rect& old_bounds, 437 const gfx::Rect& old_bounds,
402 const gfx::Rect& new_bounds) { 438 const gfx::Rect& new_bounds) {
403 if (in_destructor_) 439 if (in_destructor_)
404 return; 440 return;
405 441
406 ProcessViewBoundsChanged(view, old_bounds, new_bounds); 442 ProcessViewBoundsChanged(view, old_bounds, new_bounds);
407 if (!view->parent()) 443 if (!view->parent())
408 return; 444 return;
409 445
410 // TODO(sky): optimize this. 446 // TODO(sky): optimize this.
411 display_manager_->SchedulePaint(view->parent(), old_bounds); 447 display_manager_->SchedulePaint(view->parent(), old_bounds);
412 display_manager_->SchedulePaint(view->parent(), new_bounds); 448 display_manager_->SchedulePaint(view->parent(), new_bounds);
413 } 449 }
414 450
415 void ConnectionManager::OnViewSurfaceIdChanged(const ServerView* view) { 451 void ConnectionManager::OnViewReordered(ServerView* view,
416 if (!in_destructor_) 452 ServerView* relative,
417 display_manager_->SchedulePaint(view, gfx::Rect(view->bounds().size()));
418 }
419
420 void ConnectionManager::OnViewReordered(const ServerView* view,
421 const ServerView* relative,
422 mojo::OrderDirection direction) { 453 mojo::OrderDirection direction) {
423 if (!in_destructor_) 454 if (!in_destructor_)
424 display_manager_->SchedulePaint(view, gfx::Rect(view->bounds().size())); 455 display_manager_->SchedulePaint(view, gfx::Rect(view->bounds().size()));
425 } 456 }
426 457
427 void ConnectionManager::OnWillChangeViewVisibility(ServerView* view) { 458 void ConnectionManager::OnWillChangeViewVisibility(ServerView* view) {
428 if (in_destructor_) 459 if (in_destructor_)
429 return; 460 return;
430 461
431 // Need to repaint if the view was drawn (which means it'll in the process of 462 // Need to repaint if the view was drawn (which means it's in the process of
432 // hiding) or the view is transitioning to drawn. 463 // hiding) or the view is transitioning to drawn.
433 if (view->IsDrawn(root_.get()) || (!view->visible() && view->parent() && 464 if (view->IsDrawn(root_.get()) || (!view->visible() && view->parent() &&
434 view->parent()->IsDrawn(root_.get()))) { 465 view->parent()->IsDrawn(root_.get()))) {
435 display_manager_->SchedulePaint(view->parent(), view->bounds()); 466 display_manager_->SchedulePaint(view->parent(), view->bounds());
436 } 467 }
437 468
438 if (view != root_.get() && view->id() != ClonedViewId() &&
439 root_->Contains(view) && view->IsDrawn(root_.get())) {
440 // We're about to hide |view|, this would implicitly make any cloned views
441 // hide to. Reparent so that animations are still visible.
442 ServerView* parent_above = view;
443 ReparentClonedViews(view->parent(), &parent_above, view);
444 }
445
446 for (auto& pair : connection_map_) { 469 for (auto& pair : connection_map_) {
447 pair.second->service()->ProcessWillChangeViewVisibility( 470 pair.second->service()->ProcessWillChangeViewVisibility(
448 view, IsChangeSource(pair.first)); 471 view, IsChangeSource(pair.first));
449 } 472 }
450
451 const bool is_parent_drawn =
452 view->parent() && view->parent()->IsDrawn(root_.get());
453 if (!is_parent_drawn || !view->visible())
454 animation_runner_.CancelAnimationForView(view);
455 } 473 }
456 474
457 void ConnectionManager::OnViewSharedPropertyChanged( 475 void ConnectionManager::OnViewSharedPropertyChanged(
458 const ServerView* view, 476 ServerView* view,
459 const std::string& name, 477 const std::string& name,
460 const std::vector<uint8_t>* new_data) { 478 const std::vector<uint8_t>* new_data) {
461 for (auto& pair : connection_map_) { 479 for (auto& pair : connection_map_) {
462 pair.second->service()->ProcessViewPropertyChanged( 480 pair.second->service()->ProcessViewPropertyChanged(
463 view, name, new_data, IsChangeSource(pair.first)); 481 view, name, new_data, IsChangeSource(pair.first));
464 } 482 }
465 } 483 }
466 484
467 void ConnectionManager::OnScheduleViewPaint(const ServerView* view) {
468 if (!in_destructor_)
469 display_manager_->SchedulePaint(view, gfx::Rect(view->bounds().size()));
470 }
471
472 void ConnectionManager::DispatchInputEventToView(mojo::Id transport_view_id, 485 void ConnectionManager::DispatchInputEventToView(mojo::Id transport_view_id,
473 mojo::EventPtr event) { 486 mojo::EventPtr event) {
474 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); 487 const ViewId view_id(ViewIdFromTransportId(transport_view_id));
475 488
476 ViewManagerServiceImpl* connection = GetConnectionWithRoot(view_id); 489 ViewManagerServiceImpl* connection = GetConnectionWithRoot(view_id);
477 if (!connection) 490 if (!connection)
478 connection = GetConnection(view_id.connection_id); 491 connection = GetConnection(view_id.connection_id);
479 if (connection) { 492 if (connection) {
480 connection->client()->OnViewInputEvent( 493 connection->client()->OnViewInputEvent(
481 transport_view_id, event.Pass(), base::Bind(&base::DoNothing)); 494 transport_view_id, event.Pass(), base::Bind(&base::DoNothing));
482 } 495 }
483 } 496 }
484 497
485 void ConnectionManager::SetViewportSize(mojo::SizePtr size) { 498 void ConnectionManager::SetViewportSize(mojo::SizePtr size) {
486 gfx::Size new_size = size.To<gfx::Size>(); 499 gfx::Size new_size = size.To<gfx::Size>();
487 display_manager_->SetViewportSize(new_size); 500 display_manager_->SetViewportSize(new_size);
488 } 501 }
489 502
490 void ConnectionManager::CloneAndAnimate(mojo::Id transport_view_id) { 503 void ConnectionManager::CloneAndAnimate(mojo::Id transport_view_id) {
491 CloneAndAnimate(ViewIdFromTransportId(transport_view_id)); 504 CloneAndAnimate(ViewIdFromTransportId(transport_view_id));
492 } 505 }
493 506
494 } // namespace view_manager 507 } // namespace view_manager
OLDNEW
« no previous file with comments | « mojo/services/view_manager/connection_manager.h ('k') | mojo/services/view_manager/focus_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698