Index: services/window_manager/window_manager_app.cc |
diff --git a/services/window_manager/window_manager_app.cc b/services/window_manager/window_manager_app.cc |
index 023af5f81a53e8821e5f2ab8075cb57fa0e38a1e..2c25e2b8912d9bc4f70bdd920c24af9f2ccb34e9 100644 |
--- a/services/window_manager/window_manager_app.cc |
+++ b/services/window_manager/window_manager_app.cc |
@@ -13,6 +13,7 @@ |
#include "mojo/public/interfaces/application/shell.mojom.h" |
#include "mojo/services/view_manager/public/cpp/view.h" |
#include "mojo/services/view_manager/public/cpp/view_manager.h" |
+#include "services/window_manager/capture_controller.h" |
#include "services/window_manager/focus_controller.h" |
#include "services/window_manager/focus_rules.h" |
#include "services/window_manager/view_event_dispatcher.h" |
@@ -72,13 +73,10 @@ void WindowManagerApp::RemoveConnection(WindowManagerImpl* connection) { |
connections_.erase(connection); |
} |
-void WindowManagerApp::SetCapture(Id view) { |
- // TODO(erg): Capture. Another pile of worms that is mixed in here. |
- |
- // capture_client_->capture_client()->SetCapture(GetWindowForViewId(view)); |
- |
- // TODO(beng): notify connected clients that capture has changed, probably |
- // by implementing some capture-client observer. |
+void WindowManagerApp::SetCapture(Id view_id) { |
+ View* view = view_manager_->GetViewById(view_id); |
+ DCHECK(view); |
+ capture_controller_->SetCapture(view); |
} |
void WindowManagerApp::FocusWindow(Id view_id) { |
@@ -98,11 +96,15 @@ bool WindowManagerApp::IsReady() const { |
} |
void WindowManagerApp::InitFocus(scoped_ptr<FocusRules> rules) { |
+ DCHECK(root_); |
+ |
focus_controller_.reset(new FocusController(rules.Pass())); |
focus_controller_->AddObserver(this); |
- |
- DCHECK(root_); |
SetFocusController(root_, focus_controller_.get()); |
+ |
+ capture_controller_.reset(new CaptureController); |
+ capture_controller_->AddObserver(this); |
+ SetCaptureController(root_, capture_controller_.get()); |
} |
void WindowManagerApp::Embed( |
@@ -147,11 +149,6 @@ void WindowManagerApp::OnEmbed(mojo::ViewManager* view_manager, |
RegisterSubtree(root_); |
- // TODO(erg): Also move the capture client over. |
- // |
- // capture_client_.reset( |
- // new wm::ScopedCaptureClient(window_tree_host_->window())); |
- |
if (wrapped_view_manager_delegate_) { |
wrapped_view_manager_delegate_->OnEmbed( |
view_manager, root, exported_services, imported_services.Pass()); |
@@ -203,6 +200,8 @@ void WindowManagerApp::OnViewDestroying(View* view) { |
root_ = nullptr; |
if (focus_controller_) |
focus_controller_->RemoveObserver(this); |
+ if (capture_controller_) |
+ capture_controller_->RemoveObserver(this); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -247,6 +246,20 @@ void WindowManagerApp::OnViewActivated(View* gained_active, |
} |
//////////////////////////////////////////////////////////////////////////////// |
+// WindowManagerApp, mojo::CaptureControllerObserver implementation: |
+ |
+void WindowManagerApp::OnCaptureChanged(View* gained_capture, |
+ View* lost_capture) { |
+ for (Connections::const_iterator it = connections_.begin(); |
+ it != connections_.end(); ++it) { |
+ (*it)->NotifyCaptureChanged(GetIdForView(gained_capture), |
+ GetIdForView(lost_capture)); |
+ } |
+ if (gained_capture) |
+ gained_capture->MoveToFront(); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
// WindowManagerApp, private: |
void WindowManagerApp::RegisterSubtree(View* view) { |