Index: components/mus/ws/server_window.cc |
diff --git a/components/mus/ws/server_window.cc b/components/mus/ws/server_window.cc |
index 518c0640fe0abcbe126f08b9557f6b1ebbbb3ec6..8c546a16b6c5103be3a834a40e5a202cc7d391c0 100644 |
--- a/components/mus/ws/server_window.cc |
+++ b/components/mus/ws/server_window.cc |
@@ -18,6 +18,28 @@ namespace mus { |
namespace ws { |
+namespace { |
+ |
+const ServerWindow* GetModalChildForWindowAncestor(const ServerWindow* window) { |
+ for (const ServerWindow* ancestor = window; ancestor; |
+ ancestor = ancestor->parent()) { |
+ for (const auto& transient_child : ancestor->transient_children()) { |
+ if (transient_child->is_modal() && transient_child->IsDrawn()) |
+ return transient_child; |
+ } |
+ } |
+ return nullptr; |
+} |
+ |
+const ServerWindow* GetModalTargetForWindow(const ServerWindow* window) { |
+ const ServerWindow* modal_window = GetModalChildForWindowAncestor(window); |
+ if (!modal_window) |
+ return window; |
+ return GetModalTargetForWindow(modal_window); |
+} |
+ |
+} // namespace |
+ |
ServerWindow::ServerWindow(ServerWindowDelegate* delegate, const WindowId& id) |
: ServerWindow(delegate, id, Properties()) {} |
@@ -29,6 +51,7 @@ ServerWindow::ServerWindow(ServerWindowDelegate* delegate, |
parent_(nullptr), |
stacking_target_(nullptr), |
transient_parent_(nullptr), |
+ is_modal_(false), |
visible_(false), |
cursor_id_(mojom::Cursor::CURSOR_NULL), |
opacity_(1), |
@@ -241,6 +264,18 @@ void ServerWindow::RemoveTransientWindow(ServerWindow* child) { |
OnTransientWindowRemoved(this, child)); |
} |
+void ServerWindow::SetModal() { |
+ is_modal_ = true; |
+} |
+ |
+bool ServerWindow::IsBlockedByModalWindow() const { |
+ return !!GetModalChildForWindowAncestor(this); |
+} |
+ |
+const ServerWindow* ServerWindow::GetModalTarget() const { |
+ return GetModalTargetForWindow(this); |
+} |
+ |
bool ServerWindow::Contains(const ServerWindow* window) const { |
for (const ServerWindow* parent = window; parent; parent = parent->parent_) { |
if (parent == this) |