diff options
author | crupest <crupest@outlook.com> | 2022-05-15 13:56:40 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-05-15 13:56:40 +0800 |
commit | 9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752 (patch) | |
tree | 7342f6991771fa31b16fd6a5ed892ff6025f3d05 /src/platform/gui/win/Clipboard.cpp | |
parent | 41de54bad2c0f857821fcc83f41af3334d068b6d (diff) | |
download | cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.tar.gz cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.tar.bz2 cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.zip |
...
Diffstat (limited to 'src/platform/gui/win/Clipboard.cpp')
-rw-r--r-- | src/platform/gui/win/Clipboard.cpp | 81 |
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 |