| 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/public/cpp/lib/window_tree_client_impl.h" | 5 #include "components/mus/public/cpp/lib/window_tree_client_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/bind.h" | 13 #include "base/bind.h" |
| 14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 15 #include "components/mus/common/util.h" | 15 #include "components/mus/common/util.h" |
| 16 #include "components/mus/public/cpp/input_event_handler.h" | 16 #include "components/mus/public/cpp/input_event_handler.h" |
| 17 #include "components/mus/public/cpp/lib/in_flight_change.h" | 17 #include "components/mus/public/cpp/lib/in_flight_change.h" |
| 18 #include "components/mus/public/cpp/lib/window_private.h" | 18 #include "components/mus/public/cpp/lib/window_private.h" |
| 19 #include "components/mus/public/cpp/window_manager_delegate.h" | 19 #include "components/mus/public/cpp/window_manager_delegate.h" |
| 20 #include "components/mus/public/cpp/window_observer.h" | 20 #include "components/mus/public/cpp/window_observer.h" |
| 21 #include "components/mus/public/cpp/window_tracker.h" | 21 #include "components/mus/public/cpp/window_tracker.h" |
| 22 #include "components/mus/public/cpp/window_tree_connection.h" | 22 #include "components/mus/public/cpp/window_tree_connection.h" |
| 23 #include "components/mus/public/cpp/window_tree_connection_observer.h" | 23 #include "components/mus/public/cpp/window_tree_connection_observer.h" |
| 24 #include "components/mus/public/cpp/window_tree_delegate.h" | 24 #include "components/mus/public/cpp/window_tree_delegate.h" |
| 25 #include "services/shell/public/cpp/connector.h" | 25 #include "services/shell/public/cpp/connector.h" |
| 26 #include "ui/events/event.h" | 26 #include "ui/events/event.h" |
| 27 #include "ui/events/mojo/input_events_type_converters.h" | 27 #include "ui/events/mojo/input_events_type_converters.h" |
| 28 #include "ui/gfx/geometry/insets.h" | 28 #include "ui/gfx/geometry/insets.h" |
| 29 #include "ui/gfx/geometry/mojo/geometry_type_converters.h" | |
| 30 #include "ui/gfx/geometry/size.h" | 29 #include "ui/gfx/geometry/size.h" |
| 31 | 30 |
| 32 namespace mus { | 31 namespace mus { |
| 33 | 32 |
| 34 Id MakeTransportId(ClientSpecificId client_id, ClientSpecificId local_id) { | 33 Id MakeTransportId(ClientSpecificId client_id, ClientSpecificId local_id) { |
| 35 return (client_id << 16) | local_id; | 34 return (client_id << 16) | local_id; |
| 36 } | 35 } |
| 37 | 36 |
| 38 Id server_id(Window* window) { | 37 Id server_id(Window* window) { |
| 39 return WindowPrivate(window).server_id(); | 38 return WindowPrivate(window).server_id(); |
| 40 } | 39 } |
| 41 | 40 |
| 42 // Helper called to construct a local window object from transport data. | 41 // Helper called to construct a local window object from transport data. |
| 43 Window* AddWindowToClient(WindowTreeClientImpl* client, | 42 Window* AddWindowToClient(WindowTreeClientImpl* client, |
| 44 Window* parent, | 43 Window* parent, |
| 45 const mojom::WindowDataPtr& window_data) { | 44 const mojom::WindowDataPtr& window_data) { |
| 46 // We don't use the ctor that takes a WindowTreeConnection here, since it | 45 // We don't use the ctor that takes a WindowTreeConnection here, since it |
| 47 // will call back to the service and attempt to create a new window. | 46 // will call back to the service and attempt to create a new window. |
| 48 Window* window = WindowPrivate::LocalCreate(); | 47 Window* window = WindowPrivate::LocalCreate(); |
| 49 WindowPrivate private_window(window); | 48 WindowPrivate private_window(window); |
| 50 private_window.set_connection(client); | 49 private_window.set_connection(client); |
| 51 private_window.set_server_id(window_data->window_id); | 50 private_window.set_server_id(window_data->window_id); |
| 52 private_window.set_visible(window_data->visible); | 51 private_window.set_visible(window_data->visible); |
| 53 private_window.set_properties( | 52 private_window.set_properties( |
| 54 window_data->properties | 53 window_data->properties |
| 55 .To<std::map<std::string, std::vector<uint8_t>>>()); | 54 .To<std::map<std::string, std::vector<uint8_t>>>()); |
| 56 client->AddWindow(window); | 55 client->AddWindow(window); |
| 57 private_window.LocalSetBounds(gfx::Rect(), | 56 private_window.LocalSetBounds(gfx::Rect(), window_data->bounds); |
| 58 window_data->bounds.To<gfx::Rect>()); | |
| 59 if (parent) | 57 if (parent) |
| 60 WindowPrivate(parent).LocalAddChild(window); | 58 WindowPrivate(parent).LocalAddChild(window); |
| 61 return window; | 59 return window; |
| 62 } | 60 } |
| 63 | 61 |
| 64 Window* BuildWindowTree(WindowTreeClientImpl* client, | 62 Window* BuildWindowTree(WindowTreeClientImpl* client, |
| 65 const mojo::Array<mojom::WindowDataPtr>& windows, | 63 const mojo::Array<mojom::WindowDataPtr>& windows, |
| 66 Window* initial_parent) { | 64 Window* initial_parent) { |
| 67 std::vector<Window*> parents; | 65 std::vector<Window*> parents; |
| 68 Window* root = NULL; | 66 Window* root = NULL; |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 return HiWord(server_id(window)) == client_id_ && | 253 return HiWord(server_id(window)) == client_id_ && |
| 256 roots_.count(window) == 0; | 254 roots_.count(window) == 0; |
| 257 } | 255 } |
| 258 | 256 |
| 259 void WindowTreeClientImpl::SetBounds(Window* window, | 257 void WindowTreeClientImpl::SetBounds(Window* window, |
| 260 const gfx::Rect& old_bounds, | 258 const gfx::Rect& old_bounds, |
| 261 const gfx::Rect& bounds) { | 259 const gfx::Rect& bounds) { |
| 262 DCHECK(tree_); | 260 DCHECK(tree_); |
| 263 const uint32_t change_id = ScheduleInFlightChange( | 261 const uint32_t change_id = ScheduleInFlightChange( |
| 264 base::WrapUnique(new InFlightBoundsChange(window, old_bounds))); | 262 base::WrapUnique(new InFlightBoundsChange(window, old_bounds))); |
| 265 tree_->SetWindowBounds(change_id, server_id(window), | 263 tree_->SetWindowBounds(change_id, server_id(window), bounds); |
| 266 mojo::Rect::From(bounds)); | |
| 267 } | 264 } |
| 268 | 265 |
| 269 void WindowTreeClientImpl::SetCapture(Window* window) { | 266 void WindowTreeClientImpl::SetCapture(Window* window) { |
| 270 // In order for us to get here we had to have exposed a window, which implies | 267 // In order for us to get here we had to have exposed a window, which implies |
| 271 // we got a client. | 268 // we got a client. |
| 272 DCHECK(tree_); | 269 DCHECK(tree_); |
| 273 if (capture_window_ == window) | 270 if (capture_window_ == window) |
| 274 return; | 271 return; |
| 275 const uint32_t change_id = ScheduleInFlightChange( | 272 const uint32_t change_id = ScheduleInFlightChange( |
| 276 base::WrapUnique(new InFlightCaptureChange(this, capture_window_))); | 273 base::WrapUnique(new InFlightCaptureChange(this, capture_window_))); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 288 base::WrapUnique(new InFlightCaptureChange(this, window))); | 285 base::WrapUnique(new InFlightCaptureChange(this, window))); |
| 289 tree_->ReleaseCapture(change_id, server_id(window)); | 286 tree_->ReleaseCapture(change_id, server_id(window)); |
| 290 LocalSetCapture(nullptr); | 287 LocalSetCapture(nullptr); |
| 291 } | 288 } |
| 292 | 289 |
| 293 void WindowTreeClientImpl::SetClientArea( | 290 void WindowTreeClientImpl::SetClientArea( |
| 294 Id window_id, | 291 Id window_id, |
| 295 const gfx::Insets& client_area, | 292 const gfx::Insets& client_area, |
| 296 const std::vector<gfx::Rect>& additional_client_areas) { | 293 const std::vector<gfx::Rect>& additional_client_areas) { |
| 297 DCHECK(tree_); | 294 DCHECK(tree_); |
| 298 tree_->SetClientArea( | 295 tree_->SetClientArea(window_id, client_area, additional_client_areas); |
| 299 window_id, mojo::Insets::From(client_area), | |
| 300 mojo::Array<mojo::RectPtr>::From(additional_client_areas)); | |
| 301 } | 296 } |
| 302 | 297 |
| 303 void WindowTreeClientImpl::SetHitTestMask(Id window_id, const gfx::Rect& mask) { | 298 void WindowTreeClientImpl::SetHitTestMask(Id window_id, const gfx::Rect& mask) { |
| 304 DCHECK(tree_); | 299 DCHECK(tree_); |
| 305 tree_->SetHitTestMask(window_id, mojo::Rect::From(mask)); | 300 tree_->SetHitTestMask(window_id, mask); |
| 306 } | 301 } |
| 307 | 302 |
| 308 void WindowTreeClientImpl::ClearHitTestMask(Id window_id) { | 303 void WindowTreeClientImpl::ClearHitTestMask(Id window_id) { |
| 309 DCHECK(tree_); | 304 DCHECK(tree_); |
| 310 tree_->SetHitTestMask(window_id, nullptr); | 305 tree_->SetHitTestMask(window_id, {}); |
| 311 } | 306 } |
| 312 | 307 |
| 313 void WindowTreeClientImpl::SetFocus(Window* window) { | 308 void WindowTreeClientImpl::SetFocus(Window* window) { |
| 314 // In order for us to get here we had to have exposed a window, which implies | 309 // In order for us to get here we had to have exposed a window, which implies |
| 315 // we got a client. | 310 // we got a client. |
| 316 DCHECK(tree_); | 311 DCHECK(tree_); |
| 317 const uint32_t change_id = ScheduleInFlightChange( | 312 const uint32_t change_id = ScheduleInFlightChange( |
| 318 base::WrapUnique(new InFlightFocusChange(this, focused_window_))); | 313 base::WrapUnique(new InFlightFocusChange(this, focused_window_))); |
| 319 tree_->SetFocus(change_id, window ? server_id(window) : 0); | 314 tree_->SetFocus(change_id, window ? server_id(window) : 0); |
| 320 LocalSetFocus(window); | 315 LocalSetFocus(window); |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 if (data->visible) { | 730 if (data->visible) { |
| 736 InFlightVisibleChange visible_change(window, data->visible); | 731 InFlightVisibleChange visible_change(window, data->visible); |
| 737 InFlightChange* current_change = | 732 InFlightChange* current_change = |
| 738 GetOldestInFlightChangeMatching(visible_change); | 733 GetOldestInFlightChangeMatching(visible_change); |
| 739 if (current_change) | 734 if (current_change) |
| 740 current_change->SetRevertValueFrom(visible_change); | 735 current_change->SetRevertValueFrom(visible_change); |
| 741 else | 736 else |
| 742 window_private.LocalSetVisible(true); | 737 window_private.LocalSetVisible(true); |
| 743 } | 738 } |
| 744 | 739 |
| 745 const gfx::Rect bounds(data->bounds.To<gfx::Rect>()); | 740 const gfx::Rect bounds(data->bounds); |
| 746 { | 741 { |
| 747 InFlightBoundsChange bounds_change(window, bounds); | 742 InFlightBoundsChange bounds_change(window, bounds); |
| 748 InFlightChange* current_change = | 743 InFlightChange* current_change = |
| 749 GetOldestInFlightChangeMatching(bounds_change); | 744 GetOldestInFlightChangeMatching(bounds_change); |
| 750 if (current_change) | 745 if (current_change) |
| 751 current_change->SetRevertValueFrom(bounds_change); | 746 current_change->SetRevertValueFrom(bounds_change); |
| 752 else if (window->bounds() != bounds) | 747 else if (window->bounds() != bounds) |
| 753 window_private.LocalSetBounds(window->bounds(), bounds); | 748 window_private.LocalSetBounds(window->bounds(), bounds); |
| 754 } | 749 } |
| 755 | 750 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 766 current_change->SetRevertValueFrom(property_change); | 761 current_change->SetRevertValueFrom(property_change); |
| 767 else | 762 else |
| 768 window_private.LocalSetSharedProperty(pair.first, &(pair.second)); | 763 window_private.LocalSetSharedProperty(pair.first, &(pair.second)); |
| 769 } | 764 } |
| 770 | 765 |
| 771 // Top level windows should not have a parent. | 766 // Top level windows should not have a parent. |
| 772 DCHECK_EQ(0u, data->parent_id); | 767 DCHECK_EQ(0u, data->parent_id); |
| 773 } | 768 } |
| 774 | 769 |
| 775 void WindowTreeClientImpl::OnWindowBoundsChanged(Id window_id, | 770 void WindowTreeClientImpl::OnWindowBoundsChanged(Id window_id, |
| 776 mojo::RectPtr old_bounds, | 771 const gfx::Rect& old_bounds, |
| 777 mojo::RectPtr new_bounds) { | 772 const gfx::Rect& new_bounds) { |
| 778 Window* window = GetWindowByServerId(window_id); | 773 Window* window = GetWindowByServerId(window_id); |
| 779 if (!window) | 774 if (!window) |
| 780 return; | 775 return; |
| 781 | 776 |
| 782 InFlightBoundsChange new_change(window, new_bounds.To<gfx::Rect>()); | 777 InFlightBoundsChange new_change(window, new_bounds); |
| 783 if (ApplyServerChangeToExistingInFlightChange(new_change)) | 778 if (ApplyServerChangeToExistingInFlightChange(new_change)) |
| 784 return; | 779 return; |
| 785 | 780 |
| 786 WindowPrivate(window) | 781 WindowPrivate(window).LocalSetBounds(old_bounds, new_bounds); |
| 787 .LocalSetBounds(old_bounds.To<gfx::Rect>(), new_bounds.To<gfx::Rect>()); | |
| 788 } | 782 } |
| 789 | 783 |
| 790 void WindowTreeClientImpl::OnClientAreaChanged( | 784 void WindowTreeClientImpl::OnClientAreaChanged( |
| 791 uint32_t window_id, | 785 uint32_t window_id, |
| 792 mojo::InsetsPtr new_client_area, | 786 const gfx::Insets& new_client_area, |
| 793 mojo::Array<mojo::RectPtr> new_additional_client_areas) { | 787 mojo::Array<gfx::Rect> new_additional_client_areas) { |
| 794 Window* window = GetWindowByServerId(window_id); | 788 Window* window = GetWindowByServerId(window_id); |
| 795 if (window) { | 789 if (window) { |
| 796 WindowPrivate(window).LocalSetClientArea( | 790 WindowPrivate(window).LocalSetClientArea( |
| 797 new_client_area.To<gfx::Insets>(), | 791 new_client_area, |
| 798 new_additional_client_areas.To<std::vector<gfx::Rect>>()); | 792 new_additional_client_areas.To<std::vector<gfx::Rect>>()); |
| 799 } | 793 } |
| 800 } | 794 } |
| 801 | 795 |
| 802 void WindowTreeClientImpl::OnTransientWindowAdded( | 796 void WindowTreeClientImpl::OnTransientWindowAdded( |
| 803 uint32_t window_id, | 797 uint32_t window_id, |
| 804 uint32_t transient_window_id) { | 798 uint32_t transient_window_id) { |
| 805 Window* window = GetWindowByServerId(window_id); | 799 Window* window = GetWindowByServerId(window_id); |
| 806 Window* transient_window = GetWindowByServerId(transient_window_id); | 800 Window* transient_window = GetWindowByServerId(transient_window_id); |
| 807 // window or transient_window or both may be null if a local delete occurs | 801 // window or transient_window or both may be null if a local delete occurs |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1007 Window* window = GetWindowByServerId(window_id); | 1001 Window* window = GetWindowByServerId(window_id); |
| 1008 if (!window || !IsRoot(window)) | 1002 if (!window || !IsRoot(window)) |
| 1009 return; | 1003 return; |
| 1010 | 1004 |
| 1011 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(window).observers(), | 1005 FOR_EACH_OBSERVER(WindowObserver, *WindowPrivate(window).observers(), |
| 1012 OnRequestClose(window)); | 1006 OnRequestClose(window)); |
| 1013 } | 1007 } |
| 1014 | 1008 |
| 1015 void WindowTreeClientImpl::WmSetBounds(uint32_t change_id, | 1009 void WindowTreeClientImpl::WmSetBounds(uint32_t change_id, |
| 1016 Id window_id, | 1010 Id window_id, |
| 1017 mojo::RectPtr transit_bounds) { | 1011 const gfx::Rect& transit_bounds) { |
| 1018 Window* window = GetWindowByServerId(window_id); | 1012 Window* window = GetWindowByServerId(window_id); |
| 1019 bool result = false; | 1013 bool result = false; |
| 1020 if (window) { | 1014 if (window) { |
| 1021 DCHECK(window_manager_delegate_); | 1015 DCHECK(window_manager_delegate_); |
| 1022 gfx::Rect bounds = transit_bounds.To<gfx::Rect>(); | 1016 gfx::Rect bounds = transit_bounds; |
| 1023 result = window_manager_delegate_->OnWmSetBounds(window, &bounds); | 1017 result = window_manager_delegate_->OnWmSetBounds(window, &bounds); |
| 1024 if (result) { | 1018 if (result) { |
| 1025 // If the resulting bounds differ return false. Returning false ensures | 1019 // If the resulting bounds differ return false. Returning false ensures |
| 1026 // the client applies the bounds we set below. | 1020 // the client applies the bounds we set below. |
| 1027 result = bounds == transit_bounds.To<gfx::Rect>(); | 1021 result = bounds == transit_bounds; |
| 1028 window->SetBounds(bounds); | 1022 window->SetBounds(bounds); |
| 1029 } | 1023 } |
| 1030 } | 1024 } |
| 1031 if (window_manager_internal_client_) | 1025 if (window_manager_internal_client_) |
| 1032 window_manager_internal_client_->WmResponse(change_id, result); | 1026 window_manager_internal_client_->WmResponse(change_id, result); |
| 1033 } | 1027 } |
| 1034 | 1028 |
| 1035 void WindowTreeClientImpl::WmSetProperty(uint32_t change_id, | 1029 void WindowTreeClientImpl::WmSetProperty(uint32_t change_id, |
| 1036 Id window_id, | 1030 Id window_id, |
| 1037 const mojo::String& name, | 1031 const mojo::String& name, |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1130 if (window_manager_internal_client_) | 1124 if (window_manager_internal_client_) |
| 1131 window_manager_internal_client_->ActivateNextWindow(); | 1125 window_manager_internal_client_->ActivateNextWindow(); |
| 1132 } | 1126 } |
| 1133 | 1127 |
| 1134 void WindowTreeClientImpl::SetUnderlaySurfaceOffsetAndExtendedHitArea( | 1128 void WindowTreeClientImpl::SetUnderlaySurfaceOffsetAndExtendedHitArea( |
| 1135 Window* window, | 1129 Window* window, |
| 1136 const gfx::Vector2d& offset, | 1130 const gfx::Vector2d& offset, |
| 1137 const gfx::Insets& hit_area) { | 1131 const gfx::Insets& hit_area) { |
| 1138 if (window_manager_internal_client_) { | 1132 if (window_manager_internal_client_) { |
| 1139 window_manager_internal_client_->SetUnderlaySurfaceOffsetAndExtendedHitArea( | 1133 window_manager_internal_client_->SetUnderlaySurfaceOffsetAndExtendedHitArea( |
| 1140 server_id(window), offset.x(), offset.y(), | 1134 server_id(window), offset.x(), offset.y(), hit_area); |
| 1141 mojo::Insets::From(hit_area)); | |
| 1142 } | 1135 } |
| 1143 } | 1136 } |
| 1144 | 1137 |
| 1145 } // namespace mus | 1138 } // namespace mus |
| OLD | NEW |