#include #if __has_include() #define CLIP_LIBRARY #endif #if defined(CLIP_LIBRARY) #include #else #include #include #include #endif namespace hex::clipboard { #if defined(CLIP_LIBRARY) static clip::format s_binaryFormat; static clip::format s_textFormat; void init() { s_binaryFormat = clip::register_format("net.werwolv.imhex.binary"); s_textFormat = clip::text_format(); } void setBinaryData(std::span data) { clip::lock l; l.set_data(s_binaryFormat, reinterpret_cast(data.data()), data.size()); } std::vector getBinaryData() { clip::lock l; const auto size = l.get_data_length(s_binaryFormat); std::vector data(size); l.get_data(s_binaryFormat, reinterpret_cast(data.data()), size); return data; } void setTextData(const std::string &string) { clip::lock l; l.set_data(s_textFormat, string.data(), string.size()); } std::string getTextData() { clip::lock l; const auto size = l.get_data_length(s_binaryFormat); std::string data(size, 0x00); l.get_data(s_textFormat, data.data(), size); return data; } #else void init() {} void setBinaryData(std::span data) { constexpr static auto Format = "{0:02X} "; std::string result; result.reserve(fmt::format(Format, 0x00).size() * data.size_bytes()); for (const auto &byte : data) result += fmt::format(Format, byte); result.pop_back(); ImGui::SetClipboardText(result.c_str()); } std::vector getBinaryData() { auto clipboard = ImGui::GetClipboardText(); if (clipboard == nullptr) return {}; return parseHexString(clipboard); } void setTextData(const std::string &string) { ImGui::SetClipboardText(string.c_str()); } std::string getTextData() { return ImGui::GetClipboardText(); } #endif }