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

Side by Side Diff: services/ui/ws/server_window.cc

Issue 2580703005: Fixes bug in ServerWindowCompositorFrameSinkManager (Closed)
Patch Set: merge Created 4 years 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 "services/ui/ws/server_window.h" 5 #include "services/ui/ws/server_window.h"
6 6
7 #include <inttypes.h> 7 #include <inttypes.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
11 #include "services/ui/common/transient_window_utils.h" 11 #include "services/ui/common/transient_window_utils.h"
12 #include "services/ui/public/interfaces/window_manager.mojom.h" 12 #include "services/ui/public/interfaces/window_manager.mojom.h"
13 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" 13 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
14 #include "services/ui/ws/server_window_delegate.h" 14 #include "services/ui/ws/server_window_delegate.h"
15 #include "services/ui/ws/server_window_observer.h" 15 #include "services/ui/ws/server_window_observer.h"
16 16
17 namespace ui { 17 namespace ui {
18
19 namespace ws { 18 namespace ws {
20 19
21 ServerWindow::ServerWindow(ServerWindowDelegate* delegate, const WindowId& id) 20 ServerWindow::ServerWindow(ServerWindowDelegate* delegate, const WindowId& id)
22 : ServerWindow(delegate, id, Properties()) {} 21 : ServerWindow(delegate, id, Properties()) {}
23 22
24 ServerWindow::ServerWindow(ServerWindowDelegate* delegate, 23 ServerWindow::ServerWindow(ServerWindowDelegate* delegate,
25 const WindowId& id, 24 const WindowId& id,
26 const Properties& properties) 25 const Properties& properties)
27 : delegate_(delegate), 26 : delegate_(delegate),
28 id_(id), 27 id_(id),
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 if (children_.size() == 1) 107 if (children_.size() == 1)
109 return; // Already in the right position. 108 return; // Already in the right position.
110 child->Reorder(children_.back(), mojom::OrderDirection::ABOVE); 109 child->Reorder(children_.back(), mojom::OrderDirection::ABOVE);
111 return; 110 return;
112 } 111 }
113 112
114 ServerWindow* old_parent = child->parent(); 113 ServerWindow* old_parent = child->parent();
115 for (auto& observer : child->observers_) 114 for (auto& observer : child->observers_)
116 observer.OnWillChangeWindowHierarchy(child, this, old_parent); 115 observer.OnWillChangeWindowHierarchy(child, this, old_parent);
117 116
117 ServerWindow* old_root = child->GetRoot();
118 ServerWindow* new_root = GetRoot();
119
118 if (child->parent()) 120 if (child->parent())
119 child->parent()->RemoveImpl(child); 121 child->parent()->RemoveImpl(child);
120 122
121 child->parent_ = this; 123 child->parent_ = this;
122 children_.push_back(child); 124 children_.push_back(child);
123 125
126 if (old_root != new_root)
127 child->ProcessRootChanged(old_root, new_root);
128
124 // Stack the child properly if it is a transient child of a sibling. 129 // Stack the child properly if it is a transient child of a sibling.
125 if (child->transient_parent_ && child->transient_parent_->parent() == this) 130 if (child->transient_parent_ && child->transient_parent_->parent() == this)
126 RestackTransientDescendants(child->transient_parent_, &GetStackingTarget, 131 RestackTransientDescendants(child->transient_parent_, &GetStackingTarget,
127 &ReorderImpl); 132 &ReorderImpl);
128 133
129 for (auto& observer : child->observers_) 134 for (auto& observer : child->observers_)
130 observer.OnWindowHierarchyChanged(child, this, old_parent); 135 observer.OnWindowHierarchyChanged(child, this, old_parent);
131 } 136 }
132 137
133 void ServerWindow::Remove(ServerWindow* child) { 138 void ServerWindow::Remove(ServerWindow* child) {
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 for (const ServerWindow* child : children_) 417 for (const ServerWindow* child : children_)
413 child->BuildDebugInfo(depth + " ", result); 418 child->BuildDebugInfo(depth + " ", result);
414 } 419 }
415 #endif 420 #endif
416 421
417 void ServerWindow::RemoveImpl(ServerWindow* window) { 422 void ServerWindow::RemoveImpl(ServerWindow* window) {
418 window->parent_ = nullptr; 423 window->parent_ = nullptr;
419 children_.erase(std::find(children_.begin(), children_.end(), window)); 424 children_.erase(std::find(children_.begin(), children_.end(), window));
420 } 425 }
421 426
427 void ServerWindow::ProcessRootChanged(ServerWindow* old_root,
428 ServerWindow* new_root) {
429 if (compositor_frame_sink_manager_)
430 compositor_frame_sink_manager_->OnRootChanged(old_root, new_root);
431 for (ServerWindow* child : children_)
432 child->ProcessRootChanged(old_root, new_root);
433 }
434
422 void ServerWindow::OnStackingChanged() { 435 void ServerWindow::OnStackingChanged() {
423 if (stacking_target_) { 436 if (stacking_target_) {
424 Windows::const_iterator window_i = std::find( 437 Windows::const_iterator window_i = std::find(
425 parent()->children().begin(), parent()->children().end(), this); 438 parent()->children().begin(), parent()->children().end(), this);
426 DCHECK(window_i != parent()->children().end()); 439 DCHECK(window_i != parent()->children().end());
427 if (window_i != parent()->children().begin() && 440 if (window_i != parent()->children().begin() &&
428 (*(window_i - 1) == stacking_target_)) { 441 (*(window_i - 1) == stacking_target_)) {
429 return; 442 return;
430 } 443 }
431 } 444 }
(...skipping 28 matching lines...) Expand all
460 observer.OnWindowReordered(window, relative, direction); 473 observer.OnWindowReordered(window, relative, direction);
461 window->OnStackingChanged(); 474 window->OnStackingChanged();
462 } 475 }
463 476
464 // static 477 // static
465 ServerWindow** ServerWindow::GetStackingTarget(ServerWindow* window) { 478 ServerWindow** ServerWindow::GetStackingTarget(ServerWindow* window) {
466 return &window->stacking_target_; 479 return &window->stacking_target_;
467 } 480 }
468 481
469 } // namespace ws 482 } // namespace ws
470
471 } // namespace ui 483 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698