[go: nahoru, domu]

Adds CaptureClientObserver as a way to track changes in capture

I'm going to need this for the aura-mus work so that what is the
WindowTreeClient implementation can track capture and update the
server appropriately.

I didn't update the desktop client as I don't think I'll need that one.

BUG=none
TEST=none
R=sadrul@chromium.org

Review-Url: https://chromiumcodereview.appspot.com/2436023003
Cr-Commit-Position: refs/heads/master@{#426848}
diff --git a/ash/display/mirror_window_controller.cc b/ash/display/mirror_window_controller.cc
index 84c07ce..8963c4ad 100644
--- a/ash/display/mirror_window_controller.cc
+++ b/ash/display/mirror_window_controller.cc
@@ -94,21 +94,21 @@
   DISALLOW_COPY_AND_ASSIGN(MirroringScreenPositionClient);
 };
 
+// A trivial CaptureClient that does nothing. That is, calls to set/release
+// capture are dropped.
 class NoneCaptureClient : public aura::client::CaptureClient {
  public:
   NoneCaptureClient() {}
   ~NoneCaptureClient() override {}
 
  private:
-  // Does a capture on the |window|.
+  // aura::client::CaptureClient:
   void SetCapture(aura::Window* window) override {}
-
-  // Releases a capture from the |window|.
   void ReleaseCapture(aura::Window* window) override {}
-
-  // Returns the current capture window.
-  aura::Window* GetCaptureWindow() override { return NULL; }
-  aura::Window* GetGlobalCaptureWindow() override { return NULL; }
+  aura::Window* GetCaptureWindow() override { return nullptr; }
+  aura::Window* GetGlobalCaptureWindow() override { return nullptr; }
+  void AddObserver(aura::client::CaptureClientObserver* observer) override {}
+  void RemoveObserver(aura::client::CaptureClientObserver* observer) override {}
 
   DISALLOW_COPY_AND_ASSIGN(NoneCaptureClient);
 };
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn
index 2fda230..457615b5 100644
--- a/ui/aura/BUILD.gn
+++ b/ui/aura/BUILD.gn
@@ -34,6 +34,7 @@
     "client/aura_constants.h",
     "client/capture_client.cc",
     "client/capture_client.h",
+    "client/capture_client_observer.h",
     "client/capture_delegate.h",
     "client/cursor_client.cc",
     "client/cursor_client.h",
diff --git a/ui/aura/client/capture_client.h b/ui/aura/client/capture_client.h
index a792fb3..c787426 100644
--- a/ui/aura/client/capture_client.h
+++ b/ui/aura/client/capture_client.h
@@ -12,6 +12,8 @@
 
 namespace client {
 
+class CaptureClientObserver;
+
 // An interface implemented by an object that manages input capture.
 class AURA_EXPORT CaptureClient {
  public:
@@ -31,6 +33,9 @@
   // See description of GetCaptureWindow() for details.
   virtual Window* GetGlobalCaptureWindow() = 0;
 
+  virtual void AddObserver(CaptureClientObserver* observer) = 0;
+  virtual void RemoveObserver(CaptureClientObserver* observer) = 0;
+
  protected:
   virtual ~CaptureClient() {}
 };
diff --git a/ui/aura/client/capture_client_observer.h b/ui/aura/client/capture_client_observer.h
new file mode 100644
index 0000000..19031f2d
--- /dev/null
+++ b/ui/aura/client/capture_client_observer.h
@@ -0,0 +1,28 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_AURA_CLIENT_CAPTURE_CLIENT_OBSERVER_H_
+#define UI_AURA_CLIENT_CAPTURE_CLIENT_OBSERVER_H_
+
+#include "ui/aura/aura_export.h"
+
+namespace aura {
+class Window;
+
+namespace client {
+
+// Used to observe changes in capture.
+class AURA_EXPORT CaptureClientObserver {
+ public:
+  virtual void OnCaptureChanged(Window* lost_capture,
+                                Window* gained_capture) = 0;
+
+ protected:
+  virtual ~CaptureClientObserver() {}
+};
+
+}  // namespace client
+}  // namespace aura
+
+#endif  // UI_AURA_CLIENT_CAPTURE_CLIENT_OBSERVER_H_
diff --git a/ui/aura/client/default_capture_client.cc b/ui/aura/client/default_capture_client.cc
index b0719fc..19f0d40 100644
--- a/ui/aura/client/default_capture_client.cc
+++ b/ui/aura/client/default_capture_client.cc
@@ -4,27 +4,29 @@
 
 #include "ui/aura/client/default_capture_client.h"
 
+#include "ui/aura/client/capture_client_observer.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_tree_host.h"
 
 namespace aura {
 namespace client {
+namespace {
 
-// static
 // Track the active capture window across root windows.
 Window* global_capture_window_ = nullptr;
 
+}  // namespace
+
 DefaultCaptureClient::DefaultCaptureClient(Window* root_window)
-    : root_window_(root_window),
-      capture_window_(NULL) {
+    : root_window_(root_window), capture_window_(nullptr) {
   SetCaptureClient(root_window_, this);
 }
 
 DefaultCaptureClient::~DefaultCaptureClient() {
   if (global_capture_window_ == capture_window_)
     global_capture_window_ = nullptr;
-  SetCaptureClient(root_window_, NULL);
+  SetCaptureClient(root_window_, nullptr);
 }
 
 void DefaultCaptureClient::SetCapture(Window* window) {
@@ -44,6 +46,9 @@
     capture_delegate->ReleaseNativeCapture();
 
   capture_delegate->UpdateCapture(old_capture_window, capture_window_);
+
+  for (CaptureClientObserver& observer : observers_)
+    observer.OnCaptureChanged(old_capture_window, capture_window_);
 }
 
 void DefaultCaptureClient::ReleaseCapture(Window* window) {
@@ -60,5 +65,13 @@
   return global_capture_window_;
 }
 
+void DefaultCaptureClient::AddObserver(CaptureClientObserver* observer) {
+  observers_.AddObserver(observer);
+}
+
+void DefaultCaptureClient::RemoveObserver(CaptureClientObserver* observer) {
+  observers_.RemoveObserver(observer);
+}
+
 }  // namespace client
 }  // namespace aura
diff --git a/ui/aura/client/default_capture_client.h b/ui/aura/client/default_capture_client.h
index d9dbd57..40ab823 100644
--- a/ui/aura/client/default_capture_client.h
+++ b/ui/aura/client/default_capture_client.h
@@ -5,8 +5,8 @@
 #ifndef UI_AURA_CLIENT_DEFAULT_CAPTURE_CLIENT_H_
 #define UI_AURA_CLIENT_DEFAULT_CAPTURE_CLIENT_H_
 
-#include "base/compiler_specific.h"
 #include "base/macros.h"
+#include "base/observer_list.h"
 #include "ui/aura/aura_export.h"
 #include "ui/aura/client/capture_client.h"
 
@@ -15,7 +15,7 @@
 
 class AURA_EXPORT DefaultCaptureClient : public client::CaptureClient {
  public:
-  explicit DefaultCaptureClient(Window* root_window);
+  explicit DefaultCaptureClient(Window* root_window = nullptr);
   ~DefaultCaptureClient() override;
 
  protected:
@@ -24,10 +24,13 @@
   void ReleaseCapture(Window* window) override;
   Window* GetCaptureWindow() override;
   Window* GetGlobalCaptureWindow() override;
+  void AddObserver(CaptureClientObserver* observer) override;
+  void RemoveObserver(CaptureClientObserver* observer) override;
 
  private:
-  Window* root_window_;
+  Window* root_window_;  // May be null.
   Window* capture_window_;
+  base::ObserverList<CaptureClientObserver> observers_;
 
   DISALLOW_COPY_AND_ASSIGN(DefaultCaptureClient);
 };
diff --git a/ui/views/widget/desktop_aura/desktop_capture_client.cc b/ui/views/widget/desktop_aura/desktop_capture_client.cc
index f2f3cf1..5ce64e9d 100644
--- a/ui/views/widget/desktop_aura/desktop_capture_client.cc
+++ b/ui/views/widget/desktop_aura/desktop_capture_client.cc
@@ -98,4 +98,14 @@
   return NULL;
 }
 
+void DesktopCaptureClient::AddObserver(
+    aura::client::CaptureClientObserver* observer) {
+  NOTREACHED();
+}
+
+void DesktopCaptureClient::RemoveObserver(
+    aura::client::CaptureClientObserver* observer) {
+  NOTREACHED();
+}
+
 }  // namespace views
diff --git a/ui/views/widget/desktop_aura/desktop_capture_client.h b/ui/views/widget/desktop_aura/desktop_capture_client.h
index 93be84a..f297127 100644
--- a/ui/views/widget/desktop_aura/desktop_capture_client.h
+++ b/ui/views/widget/desktop_aura/desktop_capture_client.h
@@ -42,6 +42,8 @@
   void ReleaseCapture(aura::Window* window) override;
   aura::Window* GetCaptureWindow() override;
   aura::Window* GetGlobalCaptureWindow() override;
+  void AddObserver(aura::client::CaptureClientObserver* observer) override;
+  void RemoveObserver(aura::client::CaptureClientObserver* observer) override;
 
  private:
   typedef std::set<DesktopCaptureClient*> CaptureClients;
diff --git a/ui/wm/core/capture_controller.cc b/ui/wm/core/capture_controller.cc
index b10cc1a..08238de 100644
--- a/ui/wm/core/capture_controller.cc
+++ b/ui/wm/core/capture_controller.cc
@@ -4,6 +4,7 @@
 
 #include "ui/wm/core/capture_controller.h"
 
+#include "ui/aura/client/capture_client_observer.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_tracker.h"
@@ -72,6 +73,9 @@
     if (capture_delegate_)
       capture_delegate_->SetNativeCapture();
   }
+
+  for (aura::client::CaptureClientObserver& observer : observers_)
+    observer.OnCaptureChanged(old_capture_window, capture_window_);
 }
 
 void CaptureController::ReleaseCapture(aura::Window* window) {
@@ -88,6 +92,16 @@
   return capture_window_;
 }
 
+void CaptureController::AddObserver(
+    aura::client::CaptureClientObserver* observer) {
+  observers_.AddObserver(observer);
+}
+
+void CaptureController::RemoveObserver(
+    aura::client::CaptureClientObserver* observer) {
+  observers_.RemoveObserver(observer);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // CaptureController, private:
 
diff --git a/ui/wm/core/capture_controller.h b/ui/wm/core/capture_controller.h
index bad56e6..6c1ef14 100644
--- a/ui/wm/core/capture_controller.h
+++ b/ui/wm/core/capture_controller.h
@@ -7,8 +7,8 @@
 
 #include <map>
 
-#include "base/compiler_specific.h"
 #include "base/macros.h"
+#include "base/observer_list.h"
 #include "ui/aura/client/capture_client.h"
 #include "ui/aura/window_observer.h"
 #include "ui/wm/wm_export.h"
@@ -39,6 +39,8 @@
   void ReleaseCapture(aura::Window* window) override;
   aura::Window* GetCaptureWindow() override;
   aura::Window* GetGlobalCaptureWindow() override;
+  void AddObserver(aura::client::CaptureClientObserver* observer) override;
+  void RemoveObserver(aura::client::CaptureClientObserver* observer) override;
 
  private:
   friend class ScopedCaptureClient;
@@ -58,6 +60,8 @@
   // The delegates notified when capture changes.
   std::map<aura::Window*, aura::client::CaptureDelegate*> delegates_;
 
+  base::ObserverList<aura::client::CaptureClientObserver> observers_;
+
   DISALLOW_COPY_AND_ASSIGN(CaptureController);
 };