From f5d496bc45e58bc758443ecc197575d3810438b9 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Wed, 12 Nov 2025 11:07:40 +0300 Subject: [PATCH] Use emscripten rich text clipboard method in native version as well to fix character encoding issues --- .../emscripten_browser_clipboard.h | 2 +- src/InputManager.cpp | 36 +++++-------------- src/InputManager.hpp | 5 ++- 3 files changed, 12 insertions(+), 31 deletions(-) diff --git a/include/EmscriptenHelpers/emscripten_browser_clipboard.h b/include/EmscriptenHelpers/emscripten_browser_clipboard.h index 4a70fa5..731f02a 100644 --- a/include/EmscriptenHelpers/emscripten_browser_clipboard.h +++ b/include/EmscriptenHelpers/emscripten_browser_clipboard.h @@ -33,7 +33,7 @@ EM_JS_INLINE(void, paste_js, (paste_handler callback, void *callback_data), { /// Paste handler callback signature is: /// void my_handler(std::string const &paste_data, void *callback_data = nullptr); document.addEventListener('paste', (event) => { - Module["ccall"]('emscripten_browser_clipboard_detail_paste_return', 'number', ['string', 'number', 'number'], [event.clipboardData.getData('text/plain'), callback, callback_data]); + Module["ccall"]('emscripten_browser_clipboard_detail_paste_return', 'number', ['string', 'number', 'number'], [event.clipboardData.getData('text/plain;charset=UTF-8'), callback, callback_data]); }); }); diff --git a/src/InputManager.cpp b/src/InputManager.cpp index 75eef0b..2d8e54f 100644 --- a/src/InputManager.cpp +++ b/src/InputManager.cpp @@ -147,20 +147,9 @@ void InputManager::set_clipboard_str(std::string_view s) { #endif } -std::string InputManager::get_infpnt_richtext_mimetype() { - return "web text/infpnt"; -} - void InputManager::set_clipboard_plain_and_richtext_pair(const std::pair& plainAndRichtextPair) { -#ifdef __EMSCRIPTEN__ set_clipboard_str(plainAndRichtextPair.first); lastCopiedRichText = plainAndRichtextPair.second; -#else - std::unordered_map clipboardData; - clipboardData["text/plain"] = plainAndRichtextPair.first; - clipboardData[get_infpnt_richtext_mimetype()] = plainAndRichtextPair.second.get_serialized(); - set_clipboard_data(clipboardData); -#endif } void InputManager::set_clipboard_data(const std::unordered_map& newClipboardData) { @@ -176,6 +165,7 @@ void InputManager::set_clipboard_data(const std::unordered_map& clipboardData = *static_cast*>(userdata); std::string mimeTypeStr(mime_type); auto it = clipboardData.find(mimeTypeStr); + std::cout << "requesting: " << mime_type << std::endl; if(it == clipboardData.end()) return static_cast(nullptr); *size = it->second.length(); @@ -387,24 +377,16 @@ void InputManager::backend_key_down_update(const SDL_KeyboardEvent& e) { void InputManager::process_text_paste() { if(text.textBox) { - #ifdef __EMSCRIPTEN__ - // Workaround for not being able to copy richtext to system clipboard, this should at least work within the application itself - std::string plainClipboardStr = get_clipboard_str(); - if(lastCopiedRichText.has_value()) { - if(lastCopiedRichText.value().get_plain_text() == plainClipboardStr) - text.textBox->process_rich_text_input(*text.cursor, lastCopiedRichText.value()); - else - text.textBox->process_text_input(*text.cursor, plainClipboardStr, text.modMap); - } + // Workaround for not being able to copy richtext to system clipboard, this should at least work within the application itself + std::string plainClipboardStr = get_clipboard_str(); + if(lastCopiedRichText.has_value()) { + if(lastCopiedRichText.value().get_plain_text() == plainClipboardStr) + text.textBox->process_rich_text_input(*text.cursor, lastCopiedRichText.value()); else text.textBox->process_text_input(*text.cursor, plainClipboardStr, text.modMap); - #else - std::string richTextClipboard = get_clipboard_data_for_mimetype(get_infpnt_richtext_mimetype()); - if(!richTextClipboard.empty()) - text.textBox->process_rich_text_input(*text.cursor, RichText::TextData::deserialize_string(richTextClipboard)); - else - text.textBox->process_text_input(*text.cursor, get_clipboard_data_for_mimetype("text/plain"), text.modMap); - #endif + } + else + text.textBox->process_text_input(*text.cursor, plainClipboardStr, text.modMap); } } diff --git a/src/InputManager.hpp b/src/InputManager.hpp index f9e8bed..fe1292b 100644 --- a/src/InputManager.hpp +++ b/src/InputManager.hpp @@ -203,16 +203,15 @@ struct InputManager { void set_clipboard_data(const std::unordered_map& newClipboardData); void process_text_paste(); - static std::string get_infpnt_richtext_mimetype(); - std::unordered_map clipboardData; #ifdef __EMSCRIPTEN__ bool clipboardPasteEventHappened = false; std::unordered_map clipboardPasteEventData; - std::optional lastCopiedRichText; #endif + std::optional lastCopiedRichText; + std::string key_assignment_to_str(const Vector2ui32& k); Vector2ui32 key_assignment_from_str(const std::string& s);