| 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/ws/window_tree.h" | 5 #include "components/mus/ws/window_tree.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "components/mus/ws/operation.h" | 21 #include "components/mus/ws/operation.h" |
| 22 #include "components/mus/ws/platform_display.h" | 22 #include "components/mus/ws/platform_display.h" |
| 23 #include "components/mus/ws/server_window.h" | 23 #include "components/mus/ws/server_window.h" |
| 24 #include "components/mus/ws/server_window_observer.h" | 24 #include "components/mus/ws/server_window_observer.h" |
| 25 #include "components/mus/ws/user_display_manager.h" | 25 #include "components/mus/ws/user_display_manager.h" |
| 26 #include "components/mus/ws/window_manager_state.h" | 26 #include "components/mus/ws/window_manager_state.h" |
| 27 #include "components/mus/ws/window_server.h" | 27 #include "components/mus/ws/window_server.h" |
| 28 #include "components/mus/ws/window_tree_binding.h" | 28 #include "components/mus/ws/window_tree_binding.h" |
| 29 #include "ui/display/display.h" | 29 #include "ui/display/display.h" |
| 30 #include "ui/events/mojo/input_events_type_converters.h" | 30 #include "ui/events/mojo/input_events_type_converters.h" |
| 31 #include "ui/gfx/geometry/mojo/geometry_type_converters.h" | |
| 32 #include "ui/platform_window/mojo/ime_type_converters.h" | 31 #include "ui/platform_window/mojo/ime_type_converters.h" |
| 33 #include "ui/platform_window/text_input_state.h" | 32 #include "ui/platform_window/text_input_state.h" |
| 34 | 33 |
| 35 using mojo::Array; | 34 using mojo::Array; |
| 36 using mojo::Callback; | 35 using mojo::Callback; |
| 37 using mojo::InterfaceRequest; | 36 using mojo::InterfaceRequest; |
| 38 using mojo::Rect; | |
| 39 using mojo::String; | 37 using mojo::String; |
| 40 | 38 |
| 41 namespace mus { | 39 namespace mus { |
| 42 namespace ws { | 40 namespace ws { |
| 43 | 41 |
| 44 class TargetedEvent : public ServerWindowObserver { | 42 class TargetedEvent : public ServerWindowObserver { |
| 45 public: | 43 public: |
| 46 TargetedEvent(ServerWindow* target, const ui::Event& event) | 44 TargetedEvent(ServerWindow* target, const ui::Event& event) |
| 47 : target_(target), event_(ui::Event::Clone(event)) { | 45 : target_(target), event_(ui::Event::Clone(event)) { |
| 48 target_->AddObserver(this); | 46 target_->AddObserver(this); |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 } | 411 } |
| 414 } | 412 } |
| 415 | 413 |
| 416 void WindowTree::ProcessWindowBoundsChanged(const ServerWindow* window, | 414 void WindowTree::ProcessWindowBoundsChanged(const ServerWindow* window, |
| 417 const gfx::Rect& old_bounds, | 415 const gfx::Rect& old_bounds, |
| 418 const gfx::Rect& new_bounds, | 416 const gfx::Rect& new_bounds, |
| 419 bool originated_change) { | 417 bool originated_change) { |
| 420 ClientWindowId client_window_id; | 418 ClientWindowId client_window_id; |
| 421 if (originated_change || !IsWindowKnown(window, &client_window_id)) | 419 if (originated_change || !IsWindowKnown(window, &client_window_id)) |
| 422 return; | 420 return; |
| 423 client()->OnWindowBoundsChanged(client_window_id.id, Rect::From(old_bounds), | 421 client()->OnWindowBoundsChanged(client_window_id.id, old_bounds, new_bounds); |
| 424 Rect::From(new_bounds)); | |
| 425 } | 422 } |
| 426 | 423 |
| 427 void WindowTree::ProcessClientAreaChanged( | 424 void WindowTree::ProcessClientAreaChanged( |
| 428 const ServerWindow* window, | 425 const ServerWindow* window, |
| 429 const gfx::Insets& new_client_area, | 426 const gfx::Insets& new_client_area, |
| 430 const std::vector<gfx::Rect>& new_additional_client_areas, | 427 const std::vector<gfx::Rect>& new_additional_client_areas, |
| 431 bool originated_change) { | 428 bool originated_change) { |
| 432 ClientWindowId client_window_id; | 429 ClientWindowId client_window_id; |
| 433 if (originated_change || !IsWindowKnown(window, &client_window_id)) | 430 if (originated_change || !IsWindowKnown(window, &client_window_id)) |
| 434 return; | 431 return; |
| 435 client()->OnClientAreaChanged( | 432 client()->OnClientAreaChanged( |
| 436 client_window_id.id, mojo::Insets::From(new_client_area), | 433 client_window_id.id, new_client_area, |
| 437 mojo::Array<mojo::RectPtr>::From(new_additional_client_areas)); | 434 std::vector<gfx::Rect>(new_additional_client_areas)); |
| 438 } | 435 } |
| 439 | 436 |
| 440 void WindowTree::ProcessWillChangeWindowHierarchy( | 437 void WindowTree::ProcessWillChangeWindowHierarchy( |
| 441 const ServerWindow* window, | 438 const ServerWindow* window, |
| 442 const ServerWindow* new_parent, | 439 const ServerWindow* new_parent, |
| 443 const ServerWindow* old_parent, | 440 const ServerWindow* old_parent, |
| 444 bool originated_change) { | 441 bool originated_change) { |
| 445 if (originated_change) | 442 if (originated_change) |
| 446 return; | 443 return; |
| 447 | 444 |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 858 const ServerWindow* parent = window->parent(); | 855 const ServerWindow* parent = window->parent(); |
| 859 // If the parent isn't known, it means the parent is not visible to us (not | 856 // If the parent isn't known, it means the parent is not visible to us (not |
| 860 // in roots), and should not be sent over. | 857 // in roots), and should not be sent over. |
| 861 if (parent && !IsWindowKnown(parent)) | 858 if (parent && !IsWindowKnown(parent)) |
| 862 parent = nullptr; | 859 parent = nullptr; |
| 863 mojom::WindowDataPtr window_data(mojom::WindowData::New()); | 860 mojom::WindowDataPtr window_data(mojom::WindowData::New()); |
| 864 window_data->parent_id = | 861 window_data->parent_id = |
| 865 parent ? ClientWindowIdForWindow(parent).id : ClientWindowId().id; | 862 parent ? ClientWindowIdForWindow(parent).id : ClientWindowId().id; |
| 866 window_data->window_id = | 863 window_data->window_id = |
| 867 window ? ClientWindowIdForWindow(window).id : ClientWindowId().id; | 864 window ? ClientWindowIdForWindow(window).id : ClientWindowId().id; |
| 868 window_data->bounds = Rect::From(window->bounds()); | 865 window_data->bounds = window->bounds(); |
| 869 window_data->properties = | 866 window_data->properties = |
| 870 mojo::Map<String, Array<uint8_t>>::From(window->properties()); | 867 mojo::Map<String, Array<uint8_t>>::From(window->properties()); |
| 871 window_data->visible = window->visible(); | 868 window_data->visible = window->visible(); |
| 872 return window_data; | 869 return window_data; |
| 873 } | 870 } |
| 874 | 871 |
| 875 void WindowTree::GetWindowTreeImpl( | 872 void WindowTree::GetWindowTreeImpl( |
| 876 const ServerWindow* window, | 873 const ServerWindow* window, |
| 877 std::vector<const ServerWindow*>* windows) const { | 874 std::vector<const ServerWindow*>* windows) const { |
| 878 DCHECK(window); | 875 DCHECK(window); |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1162 DVLOG(1) << "SetEventObserver event type not allowed"; | 1159 DVLOG(1) << "SetEventObserver event type not allowed"; |
| 1163 return; | 1160 return; |
| 1164 } | 1161 } |
| 1165 | 1162 |
| 1166 event_observer_matcher_.reset(new EventMatcher(*matcher)); | 1163 event_observer_matcher_.reset(new EventMatcher(*matcher)); |
| 1167 event_observer_id_ = observer_id; | 1164 event_observer_id_ = observer_id; |
| 1168 } | 1165 } |
| 1169 | 1166 |
| 1170 void WindowTree::SetWindowBounds(uint32_t change_id, | 1167 void WindowTree::SetWindowBounds(uint32_t change_id, |
| 1171 Id window_id, | 1168 Id window_id, |
| 1172 mojo::RectPtr bounds) { | 1169 const gfx::Rect& bounds) { |
| 1173 ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id)); | 1170 ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id)); |
| 1174 if (window && ShouldRouteToWindowManager(window)) { | 1171 if (window && ShouldRouteToWindowManager(window)) { |
| 1175 const uint32_t wm_change_id = | 1172 const uint32_t wm_change_id = |
| 1176 window_server_->GenerateWindowManagerChangeId(this, change_id); | 1173 window_server_->GenerateWindowManagerChangeId(this, change_id); |
| 1177 // |window_id| may be a client id, use the id from the window to ensure | 1174 // |window_id| may be a client id, use the id from the window to ensure |
| 1178 // the windowmanager doesn't get an id it doesn't know about. | 1175 // the windowmanager doesn't get an id it doesn't know about. |
| 1179 WindowManagerState* wms = display_manager() | 1176 WindowManagerState* wms = display_manager() |
| 1180 ->GetWindowManagerAndDisplay(window) | 1177 ->GetWindowManagerAndDisplay(window) |
| 1181 .window_manager_state; | 1178 .window_manager_state; |
| 1182 wms->tree()->window_manager_internal_->WmSetBounds( | 1179 wms->tree()->window_manager_internal_->WmSetBounds( |
| 1183 wm_change_id, wms->tree()->ClientWindowIdForWindow(window).id, | 1180 wm_change_id, wms->tree()->ClientWindowIdForWindow(window).id, |
| 1184 std::move(bounds)); | 1181 std::move(bounds)); |
| 1185 return; | 1182 return; |
| 1186 } | 1183 } |
| 1187 | 1184 |
| 1188 // Only the owner of the window can change the bounds. | 1185 // Only the owner of the window can change the bounds. |
| 1189 bool success = window && access_policy_->CanSetWindowBounds(window); | 1186 bool success = window && access_policy_->CanSetWindowBounds(window); |
| 1190 if (success) { | 1187 if (success) { |
| 1191 Operation op(this, window_server_, OperationType::SET_WINDOW_BOUNDS); | 1188 Operation op(this, window_server_, OperationType::SET_WINDOW_BOUNDS); |
| 1192 window->SetBounds(bounds.To<gfx::Rect>()); | 1189 window->SetBounds(bounds); |
| 1193 } | 1190 } |
| 1194 client()->OnChangeCompleted(change_id, success); | 1191 client()->OnChangeCompleted(change_id, success); |
| 1195 } | 1192 } |
| 1196 | 1193 |
| 1197 void WindowTree::SetWindowVisibility(uint32_t change_id, | 1194 void WindowTree::SetWindowVisibility(uint32_t change_id, |
| 1198 Id transport_window_id, | 1195 Id transport_window_id, |
| 1199 bool visible) { | 1196 bool visible) { |
| 1200 client()->OnChangeCompleted( | 1197 client()->OnChangeCompleted( |
| 1201 change_id, | 1198 change_id, |
| 1202 SetWindowVisibility(ClientWindowId(transport_window_id), visible)); | 1199 SetWindowVisibility(ClientWindowId(transport_window_id), visible)); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1304 target = targeted_event->target(); | 1301 target = targeted_event->target(); |
| 1305 event = targeted_event->TakeEvent(); | 1302 event = targeted_event->TakeEvent(); |
| 1306 } while (!event_queue_.empty() && !GetDisplay(target)); | 1303 } while (!event_queue_.empty() && !GetDisplay(target)); |
| 1307 if (target) | 1304 if (target) |
| 1308 DispatchInputEventImpl(target, *event); | 1305 DispatchInputEventImpl(target, *event); |
| 1309 } | 1306 } |
| 1310 } | 1307 } |
| 1311 | 1308 |
| 1312 void WindowTree::SetClientArea( | 1309 void WindowTree::SetClientArea( |
| 1313 Id transport_window_id, | 1310 Id transport_window_id, |
| 1314 mojo::InsetsPtr insets, | 1311 const gfx::Insets& insets, |
| 1315 mojo::Array<mojo::RectPtr> transport_additional_client_areas) { | 1312 mojo::Array<gfx::Rect> transport_additional_client_areas) { |
| 1316 ServerWindow* window = | 1313 ServerWindow* window = |
| 1317 GetWindowByClientId(ClientWindowId(transport_window_id)); | 1314 GetWindowByClientId(ClientWindowId(transport_window_id)); |
| 1318 if (!window || !access_policy_->CanSetClientArea(window)) | 1315 if (!window || !access_policy_->CanSetClientArea(window)) |
| 1319 return; | 1316 return; |
| 1320 | 1317 |
| 1321 std::vector<gfx::Rect> additional_client_areas = | 1318 std::vector<gfx::Rect> additional_client_areas = |
| 1322 transport_additional_client_areas.To<std::vector<gfx::Rect>>(); | 1319 transport_additional_client_areas.To<std::vector<gfx::Rect>>(); |
| 1323 window->SetClientArea(insets.To<gfx::Insets>(), additional_client_areas); | 1320 window->SetClientArea(insets, additional_client_areas); |
| 1324 } | 1321 } |
| 1325 | 1322 |
| 1326 void WindowTree::SetHitTestMask(Id transport_window_id, mojo::RectPtr mask) { | 1323 void WindowTree::SetHitTestMask(Id transport_window_id, const gfx::Rect& mask) { |
| 1327 ServerWindow* window = | 1324 ServerWindow* window = |
| 1328 GetWindowByClientId(ClientWindowId(transport_window_id)); | 1325 GetWindowByClientId(ClientWindowId(transport_window_id)); |
| 1329 if (!window || !access_policy_->CanSetHitTestMask(window)) { | 1326 if (!window || !access_policy_->CanSetHitTestMask(window)) { |
| 1330 DVLOG(1) << "SetHitTestMask failed"; | 1327 DVLOG(1) << "SetHitTestMask failed"; |
| 1331 return; | 1328 return; |
| 1332 } | 1329 } |
| 1333 | 1330 |
| 1334 if (mask) | 1331 if (!mask.IsEmpty()) |
| 1335 window->SetHitTestMask(mask.To<gfx::Rect>()); | 1332 window->SetHitTestMask(mask); |
| 1336 else | 1333 else |
| 1337 window->ClearHitTestMask(); | 1334 window->ClearHitTestMask(); |
| 1338 } | 1335 } |
| 1339 | 1336 |
| 1340 void WindowTree::Embed(Id transport_window_id, | 1337 void WindowTree::Embed(Id transport_window_id, |
| 1341 mojom::WindowTreeClientPtr client, | 1338 mojom::WindowTreeClientPtr client, |
| 1342 const EmbedCallback& callback) { | 1339 const EmbedCallback& callback) { |
| 1343 callback.Run(Embed(ClientWindowId(transport_window_id), std::move(client))); | 1340 callback.Run(Embed(ClientWindowId(transport_window_id), std::move(client))); |
| 1344 } | 1341 } |
| 1345 | 1342 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1423 Display* display = GetDisplayForWindowManager(); | 1420 Display* display = GetDisplayForWindowManager(); |
| 1424 if (!display) | 1421 if (!display) |
| 1425 return; | 1422 return; |
| 1426 display->ActivateNextWindow(); | 1423 display->ActivateNextWindow(); |
| 1427 } | 1424 } |
| 1428 | 1425 |
| 1429 void WindowTree::SetUnderlaySurfaceOffsetAndExtendedHitArea( | 1426 void WindowTree::SetUnderlaySurfaceOffsetAndExtendedHitArea( |
| 1430 Id window_id, | 1427 Id window_id, |
| 1431 int32_t x_offset, | 1428 int32_t x_offset, |
| 1432 int32_t y_offset, | 1429 int32_t y_offset, |
| 1433 mojo::InsetsPtr hit_area) { | 1430 const gfx::Insets& hit_area) { |
| 1434 ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id)); | 1431 ServerWindow* window = GetWindowByClientId(ClientWindowId(window_id)); |
| 1435 if (!window) | 1432 if (!window) |
| 1436 return; | 1433 return; |
| 1437 | 1434 |
| 1438 window->SetUnderlayOffset(gfx::Vector2d(x_offset, y_offset)); | 1435 window->SetUnderlayOffset(gfx::Vector2d(x_offset, y_offset)); |
| 1439 window->set_extended_hit_test_region(hit_area.To<gfx::Insets>()); | 1436 window->set_extended_hit_test_region(hit_area); |
| 1440 } | 1437 } |
| 1441 | 1438 |
| 1442 void WindowTree::WmResponse(uint32_t change_id, bool response) { | 1439 void WindowTree::WmResponse(uint32_t change_id, bool response) { |
| 1443 // TODO(sky): think about what else case means. | 1440 // TODO(sky): think about what else case means. |
| 1444 if (GetDisplayForWindowManager()) | 1441 if (GetDisplayForWindowManager()) |
| 1445 window_server_->WindowManagerChangeCompleted(change_id, response); | 1442 window_server_->WindowManagerChangeCompleted(change_id, response); |
| 1446 } | 1443 } |
| 1447 | 1444 |
| 1448 void WindowTree::WmRequestClose(Id transport_window_id) { | 1445 void WindowTree::WmRequestClose(Id transport_window_id) { |
| 1449 // Only the WindowManager should be using this. | 1446 // Only the WindowManager should be using this. |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1501 } | 1498 } |
| 1502 | 1499 |
| 1503 bool WindowTree::IsWindowRootOfAnotherTreeForAccessPolicy( | 1500 bool WindowTree::IsWindowRootOfAnotherTreeForAccessPolicy( |
| 1504 const ServerWindow* window) const { | 1501 const ServerWindow* window) const { |
| 1505 WindowTree* tree = window_server_->GetTreeWithRoot(window); | 1502 WindowTree* tree = window_server_->GetTreeWithRoot(window); |
| 1506 return tree && tree != this; | 1503 return tree && tree != this; |
| 1507 } | 1504 } |
| 1508 | 1505 |
| 1509 } // namespace ws | 1506 } // namespace ws |
| 1510 } // namespace mus | 1507 } // namespace mus |
| OLD | NEW |