| Index: ui/aura/mus/window_tree_client.cc
|
| diff --git a/ui/aura/mus/window_tree_client.cc b/ui/aura/mus/window_tree_client.cc
|
| index 5e8b37d2d29ec593d7aa67ab8d9cea795e9fb481..9e5ca403d9403a5291aa8262a873270e2c845d72 100644
|
| --- a/ui/aura/mus/window_tree_client.cc
|
| +++ b/ui/aura/mus/window_tree_client.cc
|
| @@ -17,10 +17,10 @@
|
| #include "services/ui/public/interfaces/window_manager_window_tree_factory.mojom.h"
|
| #include "ui/aura/client/aura_constants.h"
|
| #include "ui/aura/client/drag_drop_client.h"
|
| +#include "ui/aura/client/focus_client.h"
|
| #include "ui/aura/client/transient_window_client.h"
|
| #include "ui/aura/mus/capture_synchronizer.h"
|
| #include "ui/aura/mus/drag_drop_controller_mus.h"
|
| -#include "ui/aura/mus/focus_synchronizer.h"
|
| #include "ui/aura/mus/in_flight_change.h"
|
| #include "ui/aura/mus/input_method_mus.h"
|
| #include "ui/aura/mus/property_converter.h"
|
| @@ -135,6 +135,7 @@
|
| // Allow for a null request in tests.
|
| if (request.is_pending())
|
| binding_.Bind(std::move(request));
|
| + delegate_->GetFocusClient()->AddObserver(this);
|
| client::GetTransientWindowClient()->AddObserver(this);
|
| if (window_manager_delegate)
|
| window_manager_delegate->SetWindowManagerClient(this);
|
| @@ -172,6 +173,7 @@
|
| capture_synchronizer_.reset();
|
|
|
| client::GetTransientWindowClient()->RemoveObserver(this);
|
| + delegate_->GetFocusClient()->RemoveObserver(this);
|
| }
|
|
|
| void WindowTreeClient::ConnectViaWindowTreeFactory(
|
| @@ -288,6 +290,37 @@
|
| // our client id. const_cast is required by set.
|
| return HiWord(window->server_id()) == client_id_ &&
|
| roots_.count(const_cast<WindowMus*>(window)) == 0;
|
| +}
|
| +
|
| +void WindowTreeClient::SetFocusFromServer(WindowMus* window) {
|
| + if (focused_window_ == window)
|
| + return;
|
| +
|
| + if (window) {
|
| + client::FocusClient* focus_client =
|
| + client::GetFocusClient(window->GetWindow());
|
| + if (focus_client) {
|
| + SetFocusFromServerImpl(focus_client, window);
|
| + } else {
|
| + SetFocusFromServerImpl(
|
| + client::GetFocusClient(focused_window_->GetWindow()), nullptr);
|
| + }
|
| + } else {
|
| + SetFocusFromServerImpl(client::GetFocusClient(focused_window_->GetWindow()),
|
| + nullptr);
|
| + }
|
| +}
|
| +
|
| +void WindowTreeClient::SetFocusFromServerImpl(client::FocusClient* focus_client,
|
| + WindowMus* window) {
|
| + if (!focus_client)
|
| + return;
|
| +
|
| + DCHECK(!setting_focus_);
|
| + base::AutoReset<bool> focus_reset(&setting_focus_, true);
|
| + base::AutoReset<WindowMus*> window_setting_focus_to_reset(
|
| + &window_setting_focus_to_, window);
|
| + focus_client->FocusWindow(window ? window->GetWindow() : nullptr);
|
| }
|
|
|
| InFlightChange* WindowTreeClient::GetOldestInFlightChangeMatching(
|
| @@ -417,7 +450,6 @@
|
| drag_drop_controller_ = base::MakeUnique<DragDropControllerMus>(this, tree_);
|
| capture_synchronizer_ = base::MakeUnique<CaptureSynchronizer>(
|
| this, tree_, delegate_->GetCaptureClient());
|
| - focus_synchronizer_ = base::MakeUnique<FocusSynchronizer>(this, tree_);
|
| }
|
|
|
| void WindowTreeClient::OnConnectionLost() {
|
| @@ -459,8 +491,7 @@
|
| std::unique_ptr<WindowTreeHostMus> window_tree_host =
|
| CreateWindowTreeHost(WindowMusType::EMBED, root_data, display_id);
|
|
|
| - focus_synchronizer_->SetFocusFromServer(
|
| - GetWindowByServerId(focused_window_id));
|
| + SetFocusFromServer(GetWindowByServerId(focused_window_id));
|
|
|
| delegate_->OnEmbed(std::move(window_tree_host));
|
| }
|
| @@ -571,8 +602,8 @@
|
| }
|
|
|
| void WindowTreeClient::OnWindowMusDestroyed(WindowMus* window) {
|
| - if (focus_synchronizer_->focused_window() == window)
|
| - focus_synchronizer_->OnFocusedWindowDestroyed();
|
| + if (focused_window_ == window)
|
| + focused_window_ = nullptr;
|
|
|
| // TODO: decide how to deal with windows not owned by this client.
|
| if (WasCreatedByThisClient(window) || IsRoot(window)) {
|
| @@ -742,6 +773,10 @@
|
| return roots;
|
| }
|
|
|
| +Window* WindowTreeClient::GetFocusedWindow() {
|
| + return focused_window_ ? focused_window_->GetWindow() : nullptr;
|
| +}
|
| +
|
| gfx::Point WindowTreeClient::GetCursorScreenPoint() {
|
| // We raced initialization. Return (0, 0).
|
| if (!cursor_location_memory())
|
| @@ -1148,12 +1183,11 @@
|
|
|
| void WindowTreeClient::OnWindowFocused(Id focused_window_id) {
|
| WindowMus* focused_window = GetWindowByServerId(focused_window_id);
|
| - InFlightFocusChange new_change(this, focus_synchronizer_.get(),
|
| - focused_window);
|
| + InFlightFocusChange new_change(this, focused_window);
|
| if (ApplyServerChangeToExistingInFlightChange(new_change))
|
| return;
|
|
|
| - focus_synchronizer_->SetFocusFromServer(focused_window);
|
| + SetFocusFromServer(focused_window);
|
| }
|
|
|
| void WindowTreeClient::OnWindowPredefinedCursorChanged(
|
| @@ -1476,6 +1510,21 @@
|
| }
|
| }
|
|
|
| +void WindowTreeClient::OnWindowFocused(Window* gained_focus,
|
| + Window* lost_focus) {
|
| + WindowMus* gained_focus_mus = WindowMus::Get(gained_focus);
|
| + if (setting_focus_ && gained_focus_mus == window_setting_focus_to_) {
|
| + focused_window_ = gained_focus_mus;
|
| + return;
|
| + }
|
| +
|
| + const uint32_t change_id = ScheduleInFlightChange(
|
| + base::MakeUnique<InFlightFocusChange>(this, focused_window_));
|
| + focused_window_ = gained_focus_mus;
|
| + tree_->SetFocus(change_id, focused_window_ ? focused_window_->server_id()
|
| + : kInvalidServerId);
|
| +}
|
| +
|
| void WindowTreeClient::OnWindowTreeHostBoundsWillChange(
|
| WindowTreeHostMus* window_tree_host,
|
| const gfx::Rect& bounds) {
|
| @@ -1539,9 +1588,4 @@
|
| this, capture_synchronizer_.get(), window));
|
| }
|
|
|
| -uint32_t WindowTreeClient::CreateChangeIdForFocus(WindowMus* window) {
|
| - return ScheduleInFlightChange(base::MakeUnique<InFlightFocusChange>(
|
| - this, focus_synchronizer_.get(), window));
|
| -}
|
| -
|
| } // namespace aura
|
|
|