Index: services/ui/ws/window_tree.cc |
diff --git a/services/ui/ws/window_tree.cc b/services/ui/ws/window_tree.cc |
index 85acf92d84d8d1ec95b9b2dff9b33e870d645bd4..ecb78b50aae7dd687b301c83002ada55e5df25cc 100644 |
--- a/services/ui/ws/window_tree.cc |
+++ b/services/ui/ws/window_tree.cc |
@@ -12,6 +12,7 @@ |
#include "base/macros.h" |
#include "base/memory/ptr_util.h" |
#include "mojo/public/cpp/bindings/map.h" |
+#include "services/ui/display/screen_manager.h" |
#include "services/ui/ws/cursor_location_manager.h" |
#include "services/ui/ws/default_access_policy.h" |
#include "services/ui/ws/display.h" |
@@ -29,6 +30,8 @@ |
#include "services/ui/ws/window_server.h" |
#include "services/ui/ws/window_tree_binding.h" |
#include "ui/display/display.h" |
+#include "ui/display/display_list.h" |
+#include "ui/display/screen_base.h" |
#include "ui/display/types/display_constants.h" |
#include "ui/platform_window/mojo/ime_type_converters.h" |
#include "ui/platform_window/text_input_state.h" |
@@ -263,20 +266,26 @@ void WindowTree::OnWmMoveDragImageAck() { |
} |
} |
-bool WindowTree::ProcessSetDisplayRoot(int64_t display_id, |
- const ClientWindowId& client_window_id) { |
+ServerWindow* WindowTree::ProcessSetDisplayRoot( |
+ const display::Display& display_to_create, |
+ const mojom::WmViewportMetrics& transport_viewport_metrics, |
+ bool is_primary_display, |
+ const ClientWindowId& client_window_id) { |
DCHECK(window_manager_state_); // Only called for window manager. |
+ DVLOG(3) << "SetDisplayRoot client=" << id_ |
+ << " global window_id=" << client_window_id.id; |
Display* display = |
- window_server_->display_manager()->GetDisplayById(display_id); |
- if (!display) { |
- DVLOG(1) << "SetDisplayRoot called with unknown display " << display_id; |
- return false; |
+ window_server_->display_manager()->GetDisplayById(display_to_create.id()); |
+ if (display) { |
+ DVLOG(1) << "SetDisplayRoot called with existing display " |
+ << display_to_create.id(); |
+ return nullptr; |
} |
if (automatically_create_display_roots_) { |
DVLOG(1) << "SetDisplayRoot is only applicable when " |
<< "automatically_create_display_roots is false"; |
- return false; |
+ return nullptr; |
} |
ServerWindow* window = GetWindowByClientId(client_window_id); |
@@ -284,29 +293,44 @@ bool WindowTree::ProcessSetDisplayRoot(int64_t display_id, |
if (!window || window->parent()) { |
DVLOG(1) << "SetDisplayRoot called with invalid window id " |
<< client_window_id.id; |
- return false; |
+ return nullptr; |
} |
+ if (base::ContainsValue(roots_, window)) { |
+ DVLOG(1) << "SetDisplayRoot called with existing root"; |
+ return nullptr; |
+ } |
+ |
+ const display::DisplayList::Type display_type = |
+ is_primary_display ? display::DisplayList::Type::PRIMARY |
+ : display::DisplayList::Type::NOT_PRIMARY; |
+ display::ScreenManager::GetInstance()->GetScreen()->display_list().AddDisplay( |
+ display_to_create, display_type); |
+ display::ViewportMetrics viewport_metrics; |
+ viewport_metrics.bounds_in_pixels = |
+ transport_viewport_metrics.bounds_in_pixels; |
+ viewport_metrics.device_scale_factor = |
+ transport_viewport_metrics.device_scale_factor; |
+ viewport_metrics.ui_scale_factor = transport_viewport_metrics.ui_scale_factor; |
+ window_server_->display_manager()->AddDisplayForWindowManager( |
+ display_to_create, viewport_metrics); |
+ |
+ // OnDisplayAdded() should trigger creation of the Display. |
+ display = |
+ window_server_->display_manager()->GetDisplayById(display_to_create.id()); |
+ DCHECK(display); |
WindowManagerDisplayRoot* display_root = |
display->GetWindowManagerDisplayRootForUser( |
window_manager_state_->user_id()); |
DCHECK(display_root); |
- if (!display_root->root()->children().empty()) { |
- DVLOG(1) << "SetDisplayRoot called more than once"; |
- return false; |
- } |
- |
- if (base::ContainsValue(roots_, window)) { |
- DVLOG(1) << "SetDisplayRoot called with existing root"; |
- return false; |
- } |
+ DCHECK(display_root->root()->children().empty()); |
// NOTE: this doesn't resize the window in anyway. We assume the client takes |
// care of any modifications it needs to do. |
roots_.insert(window); |
Operation op(this, window_server_, OperationType::ADD_WINDOW); |
display_root->root()->Add(window); |
- return true; |
+ return window; |
} |
bool WindowTree::SetCapture(const ClientWindowId& client_window_id) { |
@@ -347,8 +371,12 @@ bool WindowTree::ReleaseCapture(const ClientWindowId& client_window_id) { |
bool WindowTree::NewWindow( |
const ClientWindowId& client_window_id, |
const std::map<std::string, std::vector<uint8_t>>& properties) { |
- if (!IsValidIdForNewWindow(client_window_id)) |
+ DVLOG(3) << "new window client=" << id_ |
+ << " window_id=" << client_window_id.id; |
+ if (!IsValidIdForNewWindow(client_window_id)) { |
+ DVLOG(1) << "new window failed, id is not valid for client"; |
return false; |
+ } |
const WindowId window_id = GenerateNewWindowId(); |
DCHECK(!GetWindow(window_id)); |
ServerWindow* window = |
@@ -497,8 +525,17 @@ std::vector<const ServerWindow*> WindowTree::GetWindowTree( |
bool WindowTree::SetWindowVisibility(const ClientWindowId& window_id, |
bool visible) { |
ServerWindow* window = GetWindowByClientId(window_id); |
- if (!window || !access_policy_->CanChangeWindowVisibility(window)) |
+ DVLOG(3) << "SetWindowVisibility client=" << id_ |
+ << " client window_id= " << window_id.id << " global window_id=" |
+ << (window ? WindowIdToTransportId(window->id()) : 0); |
+ if (!window) { |
+ DVLOG(1) << "SetWindowVisibility failure, no window"; |
+ return false; |
+ } |
+ if (!access_policy_->CanChangeWindowVisibility(window)) { |
+ DVLOG(1) << "SetWindowVisibility failure, access policy denied change"; |
return false; |
+ } |
if (window->visible() == visible) |
return true; |
Operation op(this, window_server_, OperationType::SET_WINDOW_VISIBILITY); |
@@ -2105,10 +2142,20 @@ void WindowTree::SetExtendedHitArea(Id window_id, const gfx::Insets& hit_area) { |
window->set_extended_hit_test_region(hit_area); |
} |
-void WindowTree::SetDisplayRoot(int64_t display_id, |
+void WindowTree::SetDisplayRoot(const display::Display& display, |
+ mojom::WmViewportMetricsPtr viewport_metrics, |
+ bool is_primary_display, |
Id window_id, |
const SetDisplayRootCallback& callback) { |
- callback.Run(ProcessSetDisplayRoot(display_id, ClientWindowId(window_id))); |
+ ServerWindow* display_root = |
+ ProcessSetDisplayRoot(display, *viewport_metrics, is_primary_display, |
+ ClientWindowId(window_id)); |
+ if (!display_root) { |
+ callback.Run(base::Optional<cc::FrameSinkId>()); |
+ return; |
+ } |
+ display_root->parent()->SetVisible(true); |
+ callback.Run(display_root->frame_sink_id()); |
} |
void WindowTree::WmResponse(uint32_t change_id, bool response) { |