Skip to content

Commit a75c840

Browse files
committed
Win32 clipboard manager
1 parent d6bae89 commit a75c840

File tree

6 files changed

+47
-14
lines changed

6 files changed

+47
-14
lines changed

include/nbl/ui/CClipboardManagerWin32.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,11 @@ class CClipboardManagerWin32 final : public IClipboardManager
99
{
1010
using base_t = IClipboardManager;
1111
public:
12-
CClipboardManagerWin32(core::smart_refctd_ptr<system::ISystem>&& sys) : base_t(std::move(sys))
13-
{
14-
15-
}
12+
CClipboardManagerWin32() = default;
1613
virtual std::string getClipboardText() override;
1714
virtual bool setClipboardText(const std::string_view& data) override;
18-
virtual core::smart_refctd_ptr<asset::ICPUImage> getClipboardImage() override;
19-
virtual bool setClipboardImage(asset::ICPUImage* image, asset::ICPUImage::SImageCopy data) override;
15+
//virtual core::smart_refctd_ptr<asset::ICPUImage> getClipboardImage() override;
16+
//virtual bool setClipboardImage(asset::ICPUImage* image, asset::ICPUImage::SImageCopy data) override;
2017
private:
2118
HGLOBAL* CPUImageToClipboardImage(asset::ICPUImage* image);
2219
};

include/nbl/ui/CWindowWin32.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44

55
#include "nbl/ui/IWindowWin32.h"
6+
#include "nbl/ui/CClipboardManagerWin32.h"
67

78
#include <queue>
89

@@ -36,6 +37,7 @@ class CWindowWin32 final : public IWindowWin32
3637
core::map<HANDLE, core::smart_refctd_ptr<IKeyboardEventChannel>> m_keyboardEventChannels;
3738

3839
core::smart_refctd_ptr<CCursorControlWin32> m_cursorControl;
40+
core::smart_refctd_ptr<CClipboardManagerWin32> m_clipboardManager;
3941

4042
/*
4143
* Storing this data is required for the device removal to work properly

include/nbl/ui/IClipboardManager.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,13 @@ class IClipboardManager : public core::IReferenceCounted
2121
};
2222
virtual std::string getClipboardText() = 0;
2323
virtual bool setClipboardText(const std::string_view& data) = 0;
24-
virtual core::smart_refctd_ptr<asset::ICPUImage> getClipboardImage() = 0;
25-
virtual bool setClipboardImage(asset::ICPUImage* image, const SImageClipboardRegion& data) = 0;
24+
// virtual core::smart_refctd_ptr<asset::ICPUImage> getClipboardImage() = 0;
25+
// virtual bool setClipboardImage(asset::ICPUImage* image, const SImageClipboardRegion& data) = 0;
2626

2727
virtual ~IClipboardManager() = default;
2828

2929
protected:
30-
IClipboardManager(core::smart_refctd_ptr<system::ISystem>&& sys) : m_sys(std::move(sys)) {}
31-
32-
core::smart_refctd_ptr<system::ISystem> m_sys;
30+
IClipboardManager() = default;
3331
};
3432

3533
}

src/nbl/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ set(NBL_UI_SOURCES
193193
${NBL_ROOT_PATH}/src/nbl/ui/CWindowWayland.cpp
194194
${NBL_ROOT_PATH}/src/nbl/ui/CWaylandCaller.cpp
195195
${NBL_ROOT_PATH}/src/nbl/ui/CCursorControlWin32.cpp
196+
${NBL_ROOT_PATH}/src/nbl/ui/CClipboardManagerWin32.cpp
196197
${NBL_ROOT_PATH}/src/nbl/ui/CWindowManagerAndroid.cpp
197198
${NBL_ROOT_PATH}/src/nbl/ui/CGraphicalApplicationAndroid.cpp
198199
)

src/nbl/ui/CClipboardManagerWin32.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include "nbl/ui/CClipboardManagerWin32.h"
2+
#include <Windows.h>
3+
namespace nbl::ui
4+
{
5+
6+
std::string CClipboardManagerWin32::getClipboardText()
7+
{
8+
int32_t res = OpenClipboard(0);
9+
assert(res != 0);
10+
11+
std::string data = (const char*)GetClipboardData(CF_TEXT);
12+
13+
CloseClipboard();
14+
15+
return data;
16+
}
17+
18+
bool CClipboardManagerWin32::setClipboardText(const std::string_view& str)
19+
{
20+
int32_t res = OpenClipboard(0);
21+
if (res == 0) return false;
22+
23+
EmptyClipboard();
24+
const char* data = str.data();
25+
const size_t data_size = strlen(data) + 1;
26+
HGLOBAL h = GlobalAlloc(GMEM_MOVEABLE, data_size);
27+
strcpy((char*)GlobalLock(h), LPCSTR(data));
28+
GlobalUnlock(h);
29+
SetClipboardData(CF_TEXT, h);
30+
31+
CloseClipboard();
32+
33+
return true;
34+
}
35+
}

src/nbl/ui/CWindowWin32.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ namespace nbl::ui
1414

1515
CWindowWin32::CWindowWin32(core::smart_refctd_ptr<CWindowManagerWin32>&& winManager, SCreationParams&& params, native_handle_t hwnd) :
1616
IWindowWin32(std::move(params)), m_native(hwnd), m_windowManager(winManager),
17-
m_cursorControl(core::make_smart_refctd_ptr<CCursorControlWin32>(core::smart_refctd_ptr(m_windowManager)))
17+
m_cursorControl(core::make_smart_refctd_ptr<CCursorControlWin32>(core::smart_refctd_ptr(m_windowManager))),
18+
m_clipboardManager(core::make_smart_refctd_ptr<CClipboardManagerWin32>())
1819
{
1920
addAlreadyConnectedInputDevices();
2021
// do this last, we dont want the "WndProc" to be called concurrently to anything in the constructor
@@ -33,8 +34,7 @@ namespace nbl::ui
3334

3435
IClipboardManager* CWindowWin32::getClipboardManager()
3536
{
36-
assert(false);
37-
return nullptr;
37+
return m_clipboardManager.get();
3838
}
3939

4040
ICursorControl* CWindowWin32::getCursorControl()

0 commit comments

Comments
 (0)