aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/win/Clipboard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/gui/win/Clipboard.cpp')
-rw-r--r--src/platform/gui/win/Clipboard.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/platform/gui/win/Clipboard.cpp b/src/platform/gui/win/Clipboard.cpp
new file mode 100644
index 00000000..26850d3d
--- /dev/null
+++ b/src/platform/gui/win/Clipboard.cpp
@@ -0,0 +1,81 @@
+#include "cru/platform/gui/win/Clipboard.h"
+#include "cru/common/log/Logger.h"
+#include "cru/platform/gui/win/GodWindow.h"
+#include "cru/platform/gui/win/UiApplication.h"
+
+namespace cru::platform::gui::win {
+WinClipboard::WinClipboard(WinUiApplication* application)
+ : application_(application) {}
+
+WinClipboard::~WinClipboard() {}
+
+String WinClipboard::GetText() {
+ auto god_window = application_->GetGodWindow();
+
+ if (!::OpenClipboard(god_window->GetHandle())) {
+ CRU_LOG_WARN(u"Failed to open clipboard.");
+ return {};
+ }
+
+ if (!::IsClipboardFormatAvailable(CF_UNICODETEXT)) {
+ CRU_LOG_WARN(u"Clipboard format for text is not available.");
+ return {};
+ }
+
+ auto handle = ::GetClipboardData(CF_UNICODETEXT);
+
+ if (handle == nullptr) {
+ CRU_LOG_WARN(u"Failed to get clipboard data.");
+ return {};
+ }
+
+ auto ptr = ::GlobalLock(handle);
+ if (ptr == nullptr) {
+ CRU_LOG_WARN(u"Failed to lock clipboard data.");
+ ::CloseClipboard();
+ return {};
+ }
+
+ String result(static_cast<wchar_t*>(ptr));
+
+ ::GlobalUnlock(handle);
+ ::CloseClipboard();
+
+ return result;
+}
+
+void WinClipboard::SetText(String text) {
+ auto god_window = application_->GetGodWindow();
+
+ if (!::OpenClipboard(god_window->GetHandle())) {
+ CRU_LOG_WARN(u"Failed to open clipboard.");
+ return;
+ }
+
+ auto handle = GlobalAlloc(GMEM_MOVEABLE, (text.size() + 1) * sizeof(wchar_t));
+
+ if (handle == nullptr) {
+ CRU_LOG_WARN(u"Failed to allocate clipboard data.");
+ ::CloseClipboard();
+ return;
+ }
+
+ auto ptr = ::GlobalLock(handle);
+ if (ptr == nullptr) {
+ CRU_LOG_WARN(u"Failed to lock clipboard data.");
+ ::GlobalFree(handle);
+ ::CloseClipboard();
+ return;
+ }
+
+ std::memcpy(ptr, text.c_str(), (text.size() + 1) * sizeof(wchar_t));
+
+ ::GlobalUnlock(handle);
+
+ if (::SetClipboardData(CF_UNICODETEXT, handle) == nullptr) {
+ CRU_LOG_WARN(u"Failed to set clipboard data.");
+ }
+
+ ::CloseClipboard();
+}
+} // namespace cru::platform::gui::win