diff --git a/src/wine-host/xdnd-proxy.cpp b/src/wine-host/xdnd-proxy.cpp index c32f67d7..654093cb 100644 --- a/src/wine-host/xdnd-proxy.cpp +++ b/src/wine-host/xdnd-proxy.cpp @@ -155,14 +155,39 @@ WineXdndProxy::WineXdndProxy() */ static std::atomic_size_t instance_reference_count = 0; -WineXdndProxy::Handle::Handle(WineXdndProxy& proxy) : proxy(proxy) {} +WineXdndProxy::Handle::Handle(WineXdndProxy* proxy) : proxy(proxy) {} WineXdndProxy::Handle::~Handle() noexcept { if (instance_reference_count.fetch_sub(1) == 1) { - delete &proxy; + delete proxy; } } +WineXdndProxy::Handle::Handle(const Handle& o) noexcept : proxy(o.proxy) { + instance_reference_count += 1; +} +WineXdndProxy::Handle& WineXdndProxy::Handle::operator=( + const Handle& o) noexcept { + if (&o != this) { + instance_reference_count += 1; + proxy = o.proxy; + } + + return *this; +} + +WineXdndProxy::Handle::Handle(Handle&& o) noexcept : proxy(std::move(o.proxy)) { + instance_reference_count += 1; +} +WineXdndProxy::Handle& WineXdndProxy::Handle::operator=(Handle&& o) noexcept { + if (&o != this) { + instance_reference_count += 1; + proxy = std::move(o.proxy); + } + + return *this; +} + WineXdndProxy::Handle WineXdndProxy::init_proxy() { // We're doing a bit of a hybrid between a COM-style reference counted smart // pointer and a singleton here because we need to ensure that there's only @@ -176,5 +201,5 @@ WineXdndProxy::Handle WineXdndProxy::init_proxy() { instance = new WineXdndProxy{}; } - return Handle(*instance); + return Handle(instance); } diff --git a/src/wine-host/xdnd-proxy.h b/src/wine-host/xdnd-proxy.h index ffbc3e0e..334f906b 100644 --- a/src/wine-host/xdnd-proxy.h +++ b/src/wine-host/xdnd-proxy.h @@ -50,7 +50,7 @@ class WineXdndProxy { * Before calling this, the reference count should be increased by one * in `WineXdndProxy::init_proxy()`. */ - Handle(WineXdndProxy& proxy); + Handle(WineXdndProxy* proxy); public: /** @@ -59,8 +59,14 @@ class WineXdndProxy { */ ~Handle() noexcept; + Handle(const Handle&) noexcept; + Handle& operator=(const Handle&) noexcept; + + Handle(Handle&&) noexcept; + Handle& operator=(Handle&&) noexcept; + private: - WineXdndProxy& proxy; + WineXdndProxy* proxy; friend WineXdndProxy; };