| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_host_impl.h" | 5 #include "components/mus/ws/window_tree_host_impl.h" |
| 6 | 6 |
| 7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
| 8 #include "components/mus/common/types.h" | 8 #include "components/mus/common/types.h" |
| 9 #include "components/mus/ws/connection_manager.h" | 9 #include "components/mus/ws/connection_manager.h" |
| 10 #include "components/mus/ws/display_manager.h" | 10 #include "components/mus/ws/display_manager.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 mojo::ApplicationImpl* app_impl, | 23 mojo::ApplicationImpl* app_impl, |
| 24 const scoped_refptr<GpuState>& gpu_state, | 24 const scoped_refptr<GpuState>& gpu_state, |
| 25 const scoped_refptr<SurfacesState>& surfaces_state, | 25 const scoped_refptr<SurfacesState>& surfaces_state, |
| 26 mojom::WindowManagerPtr window_manager) | 26 mojom::WindowManagerPtr window_manager) |
| 27 : delegate_(nullptr), | 27 : delegate_(nullptr), |
| 28 connection_manager_(connection_manager), | 28 connection_manager_(connection_manager), |
| 29 client_(client.Pass()), | 29 client_(client.Pass()), |
| 30 event_dispatcher_(this), | 30 event_dispatcher_(this), |
| 31 display_manager_( | 31 display_manager_( |
| 32 DisplayManager::Create(app_impl, gpu_state, surfaces_state)), | 32 DisplayManager::Create(app_impl, gpu_state, surfaces_state)), |
| 33 focus_controller_(new FocusController(this)), | 33 focus_controller_(new FocusController), |
| 34 window_manager_(window_manager.Pass()) { | 34 window_manager_(window_manager.Pass()) { |
| 35 focus_controller_->AddObserver(this); |
| 35 display_manager_->Init(this); | 36 display_manager_->Init(this); |
| 36 if (client_) { | 37 if (client_) { |
| 37 client_.set_connection_error_handler(base::Bind( | 38 client_.set_connection_error_handler(base::Bind( |
| 38 &WindowTreeHostImpl::OnClientClosed, base::Unretained(this))); | 39 &WindowTreeHostImpl::OnClientClosed, base::Unretained(this))); |
| 39 } | 40 } |
| 40 } | 41 } |
| 41 | 42 |
| 42 WindowTreeHostImpl::~WindowTreeHostImpl() { | 43 WindowTreeHostImpl::~WindowTreeHostImpl() { |
| 44 DestroyFocusController(); |
| 43 for (ServerWindow* window : windows_needing_frame_destruction_) | 45 for (ServerWindow* window : windows_needing_frame_destruction_) |
| 44 window->RemoveObserver(this); | 46 window->RemoveObserver(this); |
| 45 } | 47 } |
| 46 | 48 |
| 47 void WindowTreeHostImpl::Init(WindowTreeHostDelegate* delegate) { | 49 void WindowTreeHostImpl::Init(WindowTreeHostDelegate* delegate) { |
| 48 delegate_ = delegate; | 50 delegate_ = delegate; |
| 49 if (delegate_ && root_) | 51 if (delegate_ && root_) |
| 50 delegate_->OnDisplayInitialized(); | 52 delegate_->OnDisplayInitialized(); |
| 51 } | 53 } |
| 52 | 54 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 82 const mojom::ViewportMetrics& WindowTreeHostImpl::GetViewportMetrics() const { | 84 const mojom::ViewportMetrics& WindowTreeHostImpl::GetViewportMetrics() const { |
| 83 return display_manager_->GetViewportMetrics(); | 85 return display_manager_->GetViewportMetrics(); |
| 84 } | 86 } |
| 85 | 87 |
| 86 void WindowTreeHostImpl::SetFocusedWindow(ServerWindow* new_focused_window) { | 88 void WindowTreeHostImpl::SetFocusedWindow(ServerWindow* new_focused_window) { |
| 87 ServerWindow* old_focused_window = focus_controller_->GetFocusedWindow(); | 89 ServerWindow* old_focused_window = focus_controller_->GetFocusedWindow(); |
| 88 if (old_focused_window == new_focused_window) | 90 if (old_focused_window == new_focused_window) |
| 89 return; | 91 return; |
| 90 DCHECK(root_window()->Contains(new_focused_window)); | 92 DCHECK(root_window()->Contains(new_focused_window)); |
| 91 focus_controller_->SetFocusedWindow(new_focused_window); | 93 focus_controller_->SetFocusedWindow(new_focused_window); |
| 92 // TODO(beng): have the FocusController notify us via FocusControllerDelegate. | |
| 93 OnFocusChanged(old_focused_window, new_focused_window); | |
| 94 } | 94 } |
| 95 | 95 |
| 96 ServerWindow* WindowTreeHostImpl::GetFocusedWindow() { | 96 ServerWindow* WindowTreeHostImpl::GetFocusedWindow() { |
| 97 return focus_controller_->GetFocusedWindow(); | 97 return focus_controller_->GetFocusedWindow(); |
| 98 } | 98 } |
| 99 | 99 |
| 100 void WindowTreeHostImpl::DestroyFocusController() { | 100 void WindowTreeHostImpl::DestroyFocusController() { |
| 101 if (!focus_controller_) |
| 102 return; |
| 103 |
| 104 focus_controller_->RemoveObserver(this); |
| 101 focus_controller_.reset(); | 105 focus_controller_.reset(); |
| 102 } | 106 } |
| 103 | 107 |
| 104 void WindowTreeHostImpl::UpdateTextInputState(ServerWindow* window, | 108 void WindowTreeHostImpl::UpdateTextInputState(ServerWindow* window, |
| 105 const ui::TextInputState& state) { | 109 const ui::TextInputState& state) { |
| 106 // Do not need to update text input for unfocused windows. | 110 // Do not need to update text input for unfocused windows. |
| 107 if (!display_manager_ || focus_controller_->GetFocusedWindow() != window) | 111 if (!display_manager_ || focus_controller_->GetFocusedWindow() != window) |
| 108 return; | 112 return; |
| 109 display_manager_->UpdateTextInputState(state); | 113 display_manager_->UpdateTextInputState(state); |
| 110 } | 114 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 | 182 |
| 179 void WindowTreeHostImpl::OnCompositorFrameDrawn() { | 183 void WindowTreeHostImpl::OnCompositorFrameDrawn() { |
| 180 std::set<ServerWindow*> windows; | 184 std::set<ServerWindow*> windows; |
| 181 windows.swap(windows_needing_frame_destruction_); | 185 windows.swap(windows_needing_frame_destruction_); |
| 182 for (ServerWindow* window : windows) { | 186 for (ServerWindow* window : windows) { |
| 183 window->RemoveObserver(this); | 187 window->RemoveObserver(this); |
| 184 window->DestroySurfacesScheduledForDestruction(); | 188 window->DestroySurfacesScheduledForDestruction(); |
| 185 } | 189 } |
| 186 } | 190 } |
| 187 | 191 |
| 188 void WindowTreeHostImpl::OnFocusChanged(ServerWindow* old_focused_window, | 192 void WindowTreeHostImpl::OnFocusChanged( |
| 189 ServerWindow* new_focused_window) { | 193 FocusControllerChangeSource change_source, |
| 194 ServerWindow* old_focused_window, |
| 195 ServerWindow* new_focused_window) { |
| 190 // There are up to four connections that need to be notified: | 196 // There are up to four connections that need to be notified: |
| 191 // . the connection containing |old_focused_window|. | 197 // . the connection containing |old_focused_window|. |
| 192 // . the connection with |old_focused_window| as its root. | 198 // . the connection with |old_focused_window| as its root. |
| 193 // . the connection containing |new_focused_window|. | 199 // . the connection containing |new_focused_window|. |
| 194 // . the connection with |new_focused_window| as its root. | 200 // . the connection with |new_focused_window| as its root. |
| 195 // Some of these connections may be the same. The following takes care to | 201 // Some of these connections may be the same. The following takes care to |
| 196 // notify each only once. | 202 // notify each only once. |
| 197 WindowTreeImpl* owning_connection_old = nullptr; | 203 WindowTreeImpl* owning_connection_old = nullptr; |
| 198 WindowTreeImpl* embedded_connection_old = nullptr; | 204 WindowTreeImpl* embedded_connection_old = nullptr; |
| 199 | 205 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 base::Bind(&base::DoNothing)); | 286 base::Bind(&base::DoNothing)); |
| 281 } | 287 } |
| 282 | 288 |
| 283 void WindowTreeHostImpl::OnWindowDestroyed(ServerWindow* window) { | 289 void WindowTreeHostImpl::OnWindowDestroyed(ServerWindow* window) { |
| 284 windows_needing_frame_destruction_.erase(window); | 290 windows_needing_frame_destruction_.erase(window); |
| 285 window->RemoveObserver(this); | 291 window->RemoveObserver(this); |
| 286 } | 292 } |
| 287 | 293 |
| 288 } // namespace ws | 294 } // namespace ws |
| 289 } // namespace mus | 295 } // namespace mus |
| OLD | NEW |