#ifndef UI_WM_CORE_CAPTURE_CONTROLLER_H_
#define UI_WM_CORE_CAPTURE_CONTROLLER_H_
#include <map>
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "ui/aura/client/capture_client.h"
#include "ui/aura/window_observer.h"
namespace aura {
namespace client {
class CaptureDelegate;
}
}
namespace wm {
class COMPONENT_EXPORT(UI_WM) CaptureController
: public aura::client::CaptureClient {
public:
CaptureController();
CaptureController(const CaptureController&) = delete;
CaptureController& operator=(const CaptureController&) = delete;
~CaptureController() override;
static CaptureController* Get() { return instance_; }
void Attach(aura::Window* root);
void Detach(aura::Window* root);
void PrepareForShutdown();
bool is_active() const { return !delegates_.empty(); }
void SetCapture(aura::Window* window) override;
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;
static CaptureController* instance_;
bool destroying_ = false;
raw_ptr<aura::Window> capture_window_;
raw_ptr<aura::client::CaptureDelegate> capture_delegate_;
std::map<aura::Window*,
raw_ptr<aura::client::CaptureDelegate, CtnExperimental>>
delegates_;
base::ObserverList<aura::client::CaptureClientObserver>::Unchecked observers_;
};
class COMPONENT_EXPORT(UI_WM) ScopedCaptureClient
: public aura::WindowObserver {
public:
class COMPONENT_EXPORT(UI_WM) TestApi {
public:
explicit TestApi(ScopedCaptureClient* client) : client_(client) {}
TestApi(const TestApi&) = delete;
TestApi& operator=(const TestApi&) = delete;
~TestApi() {}
void SetDelegate(aura::client::CaptureDelegate* delegate);
private:
raw_ptr<ScopedCaptureClient> client_;
};
explicit ScopedCaptureClient(aura::Window* root);
ScopedCaptureClient(const ScopedCaptureClient&) = delete;
ScopedCaptureClient& operator=(const ScopedCaptureClient&) = delete;
~ScopedCaptureClient() override;
void OnWindowDestroyed(aura::Window* window) override;
private:
void Shutdown();
raw_ptr<aura::Window> root_window_;
};
}
#endif