Index: mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.cc |
diff --git a/mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.cc b/mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.cc |
index fd618b87d3c77790f5f8c9bd93426a51f8f5df44..e210c2bc42882e784369d82cf1c8c9beaf0c037d 100644 |
--- a/mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.cc |
+++ b/mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.cc |
@@ -80,8 +80,8 @@ class RootObserver : public ViewObserver { |
// Overridden from ViewObserver: |
void OnViewDestroyed(View* view) override { |
DCHECK_EQ(view, root_); |
- static_cast<ViewManagerClientImpl*>( |
- ViewPrivate(root_).view_manager())->RootDestroyed(root_); |
+ static_cast<ViewManagerClientImpl*>(root_->view_manager()) |
+ ->RootDestroyed(root_); |
view->RemoveObserver(this); |
delete this; |
} |
@@ -100,7 +100,9 @@ ViewManagerClientImpl::ViewManagerClientImpl(ViewManagerDelegate* delegate, |
next_id_(1), |
delegate_(delegate), |
root_(nullptr), |
+ capture_view_(nullptr), |
focused_view_(nullptr), |
+ activated_view_(nullptr), |
binding_(this, handle.Pass()), |
service_(binding_.client()), |
delete_on_error_(delete_on_error) { |
@@ -127,13 +129,6 @@ ViewManagerClientImpl::~ViewManagerClientImpl() { |
delegate_->OnViewManagerDisconnected(this); |
} |
-Id ViewManagerClientImpl::CreateView() { |
- DCHECK(connected_); |
- const Id view_id = MakeTransportId(connection_id_, ++next_id_); |
- service_->CreateView(view_id, ActionCompletedCallbackWithErrorCode()); |
- return view_id; |
-} |
- |
void ViewManagerClientImpl::DestroyView(Id view_id) { |
DCHECK(connected_); |
service_->DeleteView(view_id, ActionCompletedCallback()); |
@@ -228,6 +223,13 @@ void ViewManagerClientImpl::RemoveView(Id view_id) { |
//////////////////////////////////////////////////////////////////////////////// |
// ViewManagerClientImpl, ViewManager implementation: |
+Id ViewManagerClientImpl::CreateViewOnServer() { |
+ DCHECK(connected_); |
+ const Id view_id = MakeTransportId(connection_id_, ++next_id_); |
+ service_->CreateView(view_id, ActionCompletedCallbackWithErrorCode()); |
+ return view_id; |
+} |
+ |
const std::string& ViewManagerClientImpl::GetEmbedderURL() const { |
return creator_url_; |
} |
@@ -245,6 +247,12 @@ View* ViewManagerClientImpl::GetFocusedView() { |
return focused_view_; |
} |
+View* ViewManagerClientImpl::CreateView() { |
+ View* view = new View(this, CreateViewOnServer()); |
+ AddView(view); |
+ return view; |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// ViewManagerClientImpl, ViewManagerClient implementation: |
@@ -279,7 +287,7 @@ void ViewManagerClientImpl::OnEmbed( |
window_manager_->GetFocusedAndActiveViews( |
base::Bind(&ViewManagerClientImpl::OnGotFocusedAndActiveViews, |
base::Unretained(this))); |
- delegate_->OnEmbed(this, root_, exported_services, remote.Pass()); |
+ delegate_->OnEmbed(root_, exported_services, remote.Pass()); |
} |
void ViewManagerClientImpl::OnEmbeddedAppDisconnected(Id view_id) { |
@@ -380,7 +388,21 @@ void ViewManagerClientImpl::OnViewInputEvent( |
// ViewManagerClientImpl, WindowManagerClient implementation: |
void ViewManagerClientImpl::OnCaptureChanged(Id old_capture_view_id, |
- Id new_capture_view_id) {} |
+ Id new_capture_view_id) { |
+ View* gained_capture = GetViewById(new_capture_view_id); |
+ View* lost_capture = GetViewById(old_capture_view_id); |
+ if (lost_capture) { |
+ FOR_EACH_OBSERVER(ViewObserver, |
+ *ViewPrivate(lost_capture).observers(), |
+ OnViewFocusChanged(gained_capture, lost_capture)); |
+ } |
+ capture_view_ = gained_capture; |
+ if (gained_capture) { |
+ FOR_EACH_OBSERVER(ViewObserver, |
+ *ViewPrivate(gained_capture).observers(), |
+ OnViewFocusChanged(gained_capture, lost_capture)); |
+ } |
+} |
void ViewManagerClientImpl::OnFocusChanged(Id old_focused_view_id, |
Id new_focused_view_id) { |
@@ -399,8 +421,22 @@ void ViewManagerClientImpl::OnFocusChanged(Id old_focused_view_id, |
} |
} |
-void ViewManagerClientImpl::OnActiveWindowChanged(Id old_focused_window, |
- Id new_focused_window) {} |
+void ViewManagerClientImpl::OnActiveWindowChanged(Id old_active_view_id, |
+ Id new_active_view_id) { |
+ View* activated = GetViewById(new_active_view_id); |
+ View* deactivated = GetViewById(old_active_view_id); |
+ if (deactivated) { |
+ FOR_EACH_OBSERVER(ViewObserver, |
+ *ViewPrivate(deactivated).observers(), |
+ OnViewActivationChanged(activated, deactivated)); |
+ } |
+ activated_view_ = activated; |
+ if (activated) { |
+ FOR_EACH_OBSERVER(ViewObserver, |
+ *ViewPrivate(activated).observers(), |
+ OnViewActivationChanged(activated, deactivated)); |
+ } |
+} |
//////////////////////////////////////////////////////////////////////////////// |
// OnConnectionError, private: |
@@ -441,6 +477,10 @@ void ViewManagerClientImpl::OnGotFocusedAndActiveViews(uint32 focused_view_id, |
uint32 active_view_id) { |
if (GetViewById(focused_view_id) != focused_view_) |
OnFocusChanged(focused_view_ ? focused_view_->id() : 0, focused_view_id); |
+ if (GetViewById(active_view_id) != activated_view_) { |
+ OnActiveWindowChanged(activated_view_ ? activated_view_->id() : 0, |
+ active_view_id); |
+ } |
} |
} // namespace mojo |