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 "ui/aura/mus/window_tree_client.h" | 5 #include "ui/aura/mus/window_tree_client.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/auto_reset.h" | 13 #include "base/auto_reset.h" |
14 #include "base/bind.h" | 14 #include "base/bind.h" |
15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
16 #include "services/service_manager/public/cpp/connector.h" | 16 #include "services/service_manager/public/cpp/connector.h" |
17 #include "services/ui/public/interfaces/window_manager_window_tree_factory.mojom
.h" | 17 #include "services/ui/public/interfaces/window_manager_window_tree_factory.mojom
.h" |
18 #include "ui/aura/client/aura_constants.h" | 18 #include "ui/aura/client/aura_constants.h" |
19 #include "ui/aura/client/drag_drop_client.h" | 19 #include "ui/aura/client/drag_drop_client.h" |
20 #include "ui/aura/client/focus_client.h" | |
21 #include "ui/aura/client/transient_window_client.h" | 20 #include "ui/aura/client/transient_window_client.h" |
22 #include "ui/aura/mus/capture_synchronizer.h" | 21 #include "ui/aura/mus/capture_synchronizer.h" |
23 #include "ui/aura/mus/drag_drop_controller_mus.h" | 22 #include "ui/aura/mus/drag_drop_controller_mus.h" |
| 23 #include "ui/aura/mus/focus_synchronizer.h" |
24 #include "ui/aura/mus/in_flight_change.h" | 24 #include "ui/aura/mus/in_flight_change.h" |
25 #include "ui/aura/mus/input_method_mus.h" | 25 #include "ui/aura/mus/input_method_mus.h" |
26 #include "ui/aura/mus/property_converter.h" | 26 #include "ui/aura/mus/property_converter.h" |
27 #include "ui/aura/mus/surface_id_handler.h" | 27 #include "ui/aura/mus/surface_id_handler.h" |
28 #include "ui/aura/mus/window_manager_delegate.h" | 28 #include "ui/aura/mus/window_manager_delegate.h" |
29 #include "ui/aura/mus/window_mus.h" | 29 #include "ui/aura/mus/window_mus.h" |
30 #include "ui/aura/mus/window_port_mus.h" | 30 #include "ui/aura/mus/window_port_mus.h" |
31 #include "ui/aura/mus/window_tree_client_delegate.h" | 31 #include "ui/aura/mus/window_tree_client_delegate.h" |
32 #include "ui/aura/mus/window_tree_client_observer.h" | 32 #include "ui/aura/mus/window_tree_client_observer.h" |
33 #include "ui/aura/mus/window_tree_host_mus.h" | 33 #include "ui/aura/mus/window_tree_host_mus.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 next_change_id_(1), | 128 next_change_id_(1), |
129 delegate_(delegate), | 129 delegate_(delegate), |
130 window_manager_delegate_(window_manager_delegate), | 130 window_manager_delegate_(window_manager_delegate), |
131 binding_(this), | 131 binding_(this), |
132 tree_(nullptr), | 132 tree_(nullptr), |
133 in_destructor_(false), | 133 in_destructor_(false), |
134 weak_factory_(this) { | 134 weak_factory_(this) { |
135 // Allow for a null request in tests. | 135 // Allow for a null request in tests. |
136 if (request.is_pending()) | 136 if (request.is_pending()) |
137 binding_.Bind(std::move(request)); | 137 binding_.Bind(std::move(request)); |
138 delegate_->GetFocusClient()->AddObserver(this); | |
139 client::GetTransientWindowClient()->AddObserver(this); | 138 client::GetTransientWindowClient()->AddObserver(this); |
140 if (window_manager_delegate) | 139 if (window_manager_delegate) |
141 window_manager_delegate->SetWindowManagerClient(this); | 140 window_manager_delegate->SetWindowManagerClient(this); |
142 } | 141 } |
143 | 142 |
144 WindowTreeClient::~WindowTreeClient() { | 143 WindowTreeClient::~WindowTreeClient() { |
145 in_destructor_ = true; | 144 in_destructor_ = true; |
146 | 145 |
147 for (WindowTreeClientObserver& observer : observers_) | 146 for (WindowTreeClientObserver& observer : observers_) |
148 observer.OnWillDestroyClient(this); | 147 observer.OnWillDestroyClient(this); |
(...skipping 17 matching lines...) Expand all Loading... |
166 // other random windows that it doesn't own. | 165 // other random windows that it doesn't own. |
167 while (!tracker.windows().empty()) | 166 while (!tracker.windows().empty()) |
168 delete tracker.windows().front(); | 167 delete tracker.windows().front(); |
169 | 168 |
170 for (WindowTreeClientObserver& observer : observers_) | 169 for (WindowTreeClientObserver& observer : observers_) |
171 observer.OnDidDestroyClient(this); | 170 observer.OnDidDestroyClient(this); |
172 | 171 |
173 capture_synchronizer_.reset(); | 172 capture_synchronizer_.reset(); |
174 | 173 |
175 client::GetTransientWindowClient()->RemoveObserver(this); | 174 client::GetTransientWindowClient()->RemoveObserver(this); |
176 delegate_->GetFocusClient()->RemoveObserver(this); | |
177 } | 175 } |
178 | 176 |
179 void WindowTreeClient::ConnectViaWindowTreeFactory( | 177 void WindowTreeClient::ConnectViaWindowTreeFactory( |
180 service_manager::Connector* connector) { | 178 service_manager::Connector* connector) { |
181 // The client id doesn't really matter, we use 101 purely for debugging. | 179 // The client id doesn't really matter, we use 101 purely for debugging. |
182 client_id_ = 101; | 180 client_id_ = 101; |
183 | 181 |
184 ui::mojom::WindowTreeFactoryPtr factory; | 182 ui::mojom::WindowTreeFactoryPtr factory; |
185 connector->ConnectToInterface("service:ui", &factory); | 183 connector->ConnectToInterface("service:ui", &factory); |
186 ui::mojom::WindowTreePtr window_tree; | 184 ui::mojom::WindowTreePtr window_tree; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 return it != windows_.end() ? it->second : nullptr; | 283 return it != windows_.end() ? it->second : nullptr; |
286 } | 284 } |
287 | 285 |
288 bool WindowTreeClient::WasCreatedByThisClient(const WindowMus* window) const { | 286 bool WindowTreeClient::WasCreatedByThisClient(const WindowMus* window) const { |
289 // Windows created via CreateTopLevelWindow() are not owned by us, but have | 287 // Windows created via CreateTopLevelWindow() are not owned by us, but have |
290 // our client id. const_cast is required by set. | 288 // our client id. const_cast is required by set. |
291 return HiWord(window->server_id()) == client_id_ && | 289 return HiWord(window->server_id()) == client_id_ && |
292 roots_.count(const_cast<WindowMus*>(window)) == 0; | 290 roots_.count(const_cast<WindowMus*>(window)) == 0; |
293 } | 291 } |
294 | 292 |
295 void WindowTreeClient::SetFocusFromServer(WindowMus* window) { | |
296 if (focused_window_ == window) | |
297 return; | |
298 | |
299 if (window) { | |
300 client::FocusClient* focus_client = | |
301 client::GetFocusClient(window->GetWindow()); | |
302 if (focus_client) { | |
303 SetFocusFromServerImpl(focus_client, window); | |
304 } else { | |
305 SetFocusFromServerImpl( | |
306 client::GetFocusClient(focused_window_->GetWindow()), nullptr); | |
307 } | |
308 } else { | |
309 SetFocusFromServerImpl(client::GetFocusClient(focused_window_->GetWindow()), | |
310 nullptr); | |
311 } | |
312 } | |
313 | |
314 void WindowTreeClient::SetFocusFromServerImpl(client::FocusClient* focus_client, | |
315 WindowMus* window) { | |
316 if (!focus_client) | |
317 return; | |
318 | |
319 DCHECK(!setting_focus_); | |
320 base::AutoReset<bool> focus_reset(&setting_focus_, true); | |
321 base::AutoReset<WindowMus*> window_setting_focus_to_reset( | |
322 &window_setting_focus_to_, window); | |
323 focus_client->FocusWindow(window ? window->GetWindow() : nullptr); | |
324 } | |
325 | |
326 InFlightChange* WindowTreeClient::GetOldestInFlightChangeMatching( | 293 InFlightChange* WindowTreeClient::GetOldestInFlightChangeMatching( |
327 const InFlightChange& change) { | 294 const InFlightChange& change) { |
328 for (const auto& pair : in_flight_map_) { | 295 for (const auto& pair : in_flight_map_) { |
329 if (pair.second->window() == change.window() && | 296 if (pair.second->window() == change.window() && |
330 pair.second->change_type() == change.change_type() && | 297 pair.second->change_type() == change.change_type() && |
331 pair.second->Matches(change)) { | 298 pair.second->Matches(change)) { |
332 return pair.second.get(); | 299 return pair.second.get(); |
333 } | 300 } |
334 } | 301 } |
335 return nullptr; | 302 return nullptr; |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 } | 410 } |
444 } | 411 } |
445 | 412 |
446 void WindowTreeClient::WindowTreeConnectionEstablished( | 413 void WindowTreeClient::WindowTreeConnectionEstablished( |
447 ui::mojom::WindowTree* window_tree) { | 414 ui::mojom::WindowTree* window_tree) { |
448 tree_ = window_tree; | 415 tree_ = window_tree; |
449 | 416 |
450 drag_drop_controller_ = base::MakeUnique<DragDropControllerMus>(this, tree_); | 417 drag_drop_controller_ = base::MakeUnique<DragDropControllerMus>(this, tree_); |
451 capture_synchronizer_ = base::MakeUnique<CaptureSynchronizer>( | 418 capture_synchronizer_ = base::MakeUnique<CaptureSynchronizer>( |
452 this, tree_, delegate_->GetCaptureClient()); | 419 this, tree_, delegate_->GetCaptureClient()); |
| 420 focus_synchronizer_ = base::MakeUnique<FocusSynchronizer>(this, tree_); |
453 } | 421 } |
454 | 422 |
455 void WindowTreeClient::OnConnectionLost() { | 423 void WindowTreeClient::OnConnectionLost() { |
456 delegate_->OnLostConnection(this); | 424 delegate_->OnLostConnection(this); |
457 } | 425 } |
458 | 426 |
459 bool WindowTreeClient::HandleInternalPropertyChanged(WindowMus* window, | 427 bool WindowTreeClient::HandleInternalPropertyChanged(WindowMus* window, |
460 const void* key) { | 428 const void* key) { |
461 if (key != client::kModalKey) | 429 if (key != client::kModalKey) |
462 return false; | 430 return false; |
(...skipping 21 matching lines...) Expand all Loading... |
484 bool drawn) { | 452 bool drawn) { |
485 // WARNING: this is only called if WindowTreeClient was created as the | 453 // WARNING: this is only called if WindowTreeClient was created as the |
486 // result of an embedding. | 454 // result of an embedding. |
487 client_id_ = client_id; | 455 client_id_ = client_id; |
488 WindowTreeConnectionEstablished(window_tree); | 456 WindowTreeConnectionEstablished(window_tree); |
489 | 457 |
490 DCHECK(roots_.empty()); | 458 DCHECK(roots_.empty()); |
491 std::unique_ptr<WindowTreeHostMus> window_tree_host = | 459 std::unique_ptr<WindowTreeHostMus> window_tree_host = |
492 CreateWindowTreeHost(WindowMusType::EMBED, root_data, display_id); | 460 CreateWindowTreeHost(WindowMusType::EMBED, root_data, display_id); |
493 | 461 |
494 SetFocusFromServer(GetWindowByServerId(focused_window_id)); | 462 focus_synchronizer_->SetFocusFromServer( |
| 463 GetWindowByServerId(focused_window_id)); |
495 | 464 |
496 delegate_->OnEmbed(std::move(window_tree_host)); | 465 delegate_->OnEmbed(std::move(window_tree_host)); |
497 } | 466 } |
498 | 467 |
499 WindowTreeHost* WindowTreeClient::WmNewDisplayAddedImpl( | 468 WindowTreeHost* WindowTreeClient::WmNewDisplayAddedImpl( |
500 const display::Display& display, | 469 const display::Display& display, |
501 ui::mojom::WindowDataPtr root_data, | 470 ui::mojom::WindowDataPtr root_data, |
502 bool parent_drawn) { | 471 bool parent_drawn) { |
503 DCHECK(window_manager_delegate_); | 472 DCHECK(window_manager_delegate_); |
504 | 473 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 if (create_top_level) { | 564 if (create_top_level) { |
596 tree_->NewTopLevelWindow(change_id, window->server_id(), | 565 tree_->NewTopLevelWindow(change_id, window->server_id(), |
597 std::move(transport_properties)); | 566 std::move(transport_properties)); |
598 } else { | 567 } else { |
599 tree_->NewWindow(change_id, window->server_id(), | 568 tree_->NewWindow(change_id, window->server_id(), |
600 std::move(transport_properties)); | 569 std::move(transport_properties)); |
601 } | 570 } |
602 } | 571 } |
603 | 572 |
604 void WindowTreeClient::OnWindowMusDestroyed(WindowMus* window) { | 573 void WindowTreeClient::OnWindowMusDestroyed(WindowMus* window) { |
605 if (focused_window_ == window) | 574 if (focus_synchronizer_->focused_window() == window) |
606 focused_window_ = nullptr; | 575 focus_synchronizer_->OnFocusedWindowDestroyed(); |
607 | 576 |
608 // TODO: decide how to deal with windows not owned by this client. | 577 // TODO: decide how to deal with windows not owned by this client. |
609 if (WasCreatedByThisClient(window) || IsRoot(window)) { | 578 if (WasCreatedByThisClient(window) || IsRoot(window)) { |
610 const uint32_t change_id = | 579 const uint32_t change_id = |
611 ScheduleInFlightChange(base::MakeUnique<CrashInFlightChange>( | 580 ScheduleInFlightChange(base::MakeUnique<CrashInFlightChange>( |
612 window, ChangeType::DELETE_WINDOW)); | 581 window, ChangeType::DELETE_WINDOW)); |
613 tree_->DeleteWindow(change_id, window->server_id()); | 582 tree_->DeleteWindow(change_id, window->server_id()); |
614 } | 583 } |
615 | 584 |
616 windows_.erase(window->server_id()); | 585 windows_.erase(window->server_id()); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 //////////////////////////////////////////////////////////////////////////////// | 735 //////////////////////////////////////////////////////////////////////////////// |
767 // WindowTreeClient, WindowTreeClient implementation: | 736 // WindowTreeClient, WindowTreeClient implementation: |
768 | 737 |
769 std::set<Window*> WindowTreeClient::GetRoots() { | 738 std::set<Window*> WindowTreeClient::GetRoots() { |
770 std::set<Window*> roots; | 739 std::set<Window*> roots; |
771 for (WindowMus* window : roots_) | 740 for (WindowMus* window : roots_) |
772 roots.insert(window->GetWindow()); | 741 roots.insert(window->GetWindow()); |
773 return roots; | 742 return roots; |
774 } | 743 } |
775 | 744 |
776 Window* WindowTreeClient::GetFocusedWindow() { | |
777 return focused_window_ ? focused_window_->GetWindow() : nullptr; | |
778 } | |
779 | |
780 gfx::Point WindowTreeClient::GetCursorScreenPoint() { | 745 gfx::Point WindowTreeClient::GetCursorScreenPoint() { |
781 // We raced initialization. Return (0, 0). | 746 // We raced initialization. Return (0, 0). |
782 if (!cursor_location_memory()) | 747 if (!cursor_location_memory()) |
783 return gfx::Point(); | 748 return gfx::Point(); |
784 | 749 |
785 base::subtle::Atomic32 location = | 750 base::subtle::Atomic32 location = |
786 base::subtle::NoBarrier_Load(cursor_location_memory()); | 751 base::subtle::NoBarrier_Load(cursor_location_memory()); |
787 return gfx::Point(static_cast<int16_t>(location >> 16), | 752 return gfx::Point(static_cast<int16_t>(location >> 16), |
788 static_cast<int16_t>(location & 0xFFFF)); | 753 static_cast<int16_t>(location & 0xFFFF)); |
789 } | 754 } |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 return; | 1141 return; |
1177 | 1142 |
1178 WindowMus* target_window = GetWindowByServerId(window_id); | 1143 WindowMus* target_window = GetWindowByServerId(window_id); |
1179 delegate_->OnPointerEventObserved( | 1144 delegate_->OnPointerEventObserved( |
1180 *event->AsPointerEvent(), | 1145 *event->AsPointerEvent(), |
1181 target_window ? target_window->GetWindow() : nullptr); | 1146 target_window ? target_window->GetWindow() : nullptr); |
1182 } | 1147 } |
1183 | 1148 |
1184 void WindowTreeClient::OnWindowFocused(Id focused_window_id) { | 1149 void WindowTreeClient::OnWindowFocused(Id focused_window_id) { |
1185 WindowMus* focused_window = GetWindowByServerId(focused_window_id); | 1150 WindowMus* focused_window = GetWindowByServerId(focused_window_id); |
1186 InFlightFocusChange new_change(this, focused_window); | 1151 InFlightFocusChange new_change(this, focus_synchronizer_.get(), |
| 1152 focused_window); |
1187 if (ApplyServerChangeToExistingInFlightChange(new_change)) | 1153 if (ApplyServerChangeToExistingInFlightChange(new_change)) |
1188 return; | 1154 return; |
1189 | 1155 |
1190 SetFocusFromServer(focused_window); | 1156 focus_synchronizer_->SetFocusFromServer(focused_window); |
1191 } | 1157 } |
1192 | 1158 |
1193 void WindowTreeClient::OnWindowPredefinedCursorChanged( | 1159 void WindowTreeClient::OnWindowPredefinedCursorChanged( |
1194 Id window_id, | 1160 Id window_id, |
1195 ui::mojom::Cursor cursor) { | 1161 ui::mojom::Cursor cursor) { |
1196 WindowMus* window = GetWindowByServerId(window_id); | 1162 WindowMus* window = GetWindowByServerId(window_id); |
1197 if (!window) | 1163 if (!window) |
1198 return; | 1164 return; |
1199 | 1165 |
1200 InFlightPredefinedCursorChange new_change(window, cursor); | 1166 InFlightPredefinedCursorChange new_change(window, cursor); |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1503 void WindowTreeClient::SetUnderlaySurfaceOffsetAndExtendedHitArea( | 1469 void WindowTreeClient::SetUnderlaySurfaceOffsetAndExtendedHitArea( |
1504 Window* window, | 1470 Window* window, |
1505 const gfx::Vector2d& offset, | 1471 const gfx::Vector2d& offset, |
1506 const gfx::Insets& hit_area) { | 1472 const gfx::Insets& hit_area) { |
1507 if (window_manager_internal_client_) { | 1473 if (window_manager_internal_client_) { |
1508 window_manager_internal_client_->SetUnderlaySurfaceOffsetAndExtendedHitArea( | 1474 window_manager_internal_client_->SetUnderlaySurfaceOffsetAndExtendedHitArea( |
1509 WindowMus::Get(window)->server_id(), offset.x(), offset.y(), hit_area); | 1475 WindowMus::Get(window)->server_id(), offset.x(), offset.y(), hit_area); |
1510 } | 1476 } |
1511 } | 1477 } |
1512 | 1478 |
1513 void WindowTreeClient::OnWindowFocused(Window* gained_focus, | |
1514 Window* lost_focus) { | |
1515 WindowMus* gained_focus_mus = WindowMus::Get(gained_focus); | |
1516 if (setting_focus_ && gained_focus_mus == window_setting_focus_to_) { | |
1517 focused_window_ = gained_focus_mus; | |
1518 return; | |
1519 } | |
1520 | |
1521 const uint32_t change_id = ScheduleInFlightChange( | |
1522 base::MakeUnique<InFlightFocusChange>(this, focused_window_)); | |
1523 focused_window_ = gained_focus_mus; | |
1524 tree_->SetFocus(change_id, focused_window_ ? focused_window_->server_id() | |
1525 : kInvalidServerId); | |
1526 } | |
1527 | |
1528 void WindowTreeClient::OnWindowTreeHostBoundsWillChange( | 1479 void WindowTreeClient::OnWindowTreeHostBoundsWillChange( |
1529 WindowTreeHostMus* window_tree_host, | 1480 WindowTreeHostMus* window_tree_host, |
1530 const gfx::Rect& bounds) { | 1481 const gfx::Rect& bounds) { |
1531 ScheduleInFlightBoundsChange(WindowMus::Get(window_tree_host->window()), | 1482 ScheduleInFlightBoundsChange(WindowMus::Get(window_tree_host->window()), |
1532 window_tree_host->GetBounds(), bounds); | 1483 window_tree_host->GetBounds(), bounds); |
1533 } | 1484 } |
1534 | 1485 |
1535 std::unique_ptr<WindowPortMus> WindowTreeClient::CreateWindowPortForTopLevel() { | 1486 std::unique_ptr<WindowPortMus> WindowTreeClient::CreateWindowPortForTopLevel() { |
1536 std::unique_ptr<WindowPortMus> window_port = | 1487 std::unique_ptr<WindowPortMus> window_port = |
1537 base::MakeUnique<WindowPortMus>(this, WindowMusType::TOP_LEVEL); | 1488 base::MakeUnique<WindowPortMus>(this, WindowMusType::TOP_LEVEL); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1581 uint32_t WindowTreeClient::CreateChangeIdForDrag(WindowMus* window) { | 1532 uint32_t WindowTreeClient::CreateChangeIdForDrag(WindowMus* window) { |
1582 return ScheduleInFlightChange( | 1533 return ScheduleInFlightChange( |
1583 base::MakeUnique<InFlightDragChange>(window, ChangeType::DRAG_LOOP)); | 1534 base::MakeUnique<InFlightDragChange>(window, ChangeType::DRAG_LOOP)); |
1584 } | 1535 } |
1585 | 1536 |
1586 uint32_t WindowTreeClient::CreateChangeIdForCapture(WindowMus* window) { | 1537 uint32_t WindowTreeClient::CreateChangeIdForCapture(WindowMus* window) { |
1587 return ScheduleInFlightChange(base::MakeUnique<InFlightCaptureChange>( | 1538 return ScheduleInFlightChange(base::MakeUnique<InFlightCaptureChange>( |
1588 this, capture_synchronizer_.get(), window)); | 1539 this, capture_synchronizer_.get(), window)); |
1589 } | 1540 } |
1590 | 1541 |
| 1542 uint32_t WindowTreeClient::CreateChangeIdForFocus(WindowMus* window) { |
| 1543 return ScheduleInFlightChange(base::MakeUnique<InFlightFocusChange>( |
| 1544 this, focus_synchronizer_.get(), window)); |
| 1545 } |
| 1546 |
1591 } // namespace aura | 1547 } // namespace aura |
OLD | NEW |