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);
};