Use emscripten rich text clipboard method in native version as well to fix character encoding issues

This commit is contained in:
Yousef Khadadeh 2025-11-12 11:07:40 +03:00
parent f97029552f
commit f5d496bc45
3 changed files with 12 additions and 31 deletions

View file

@ -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]);
});
});

View file

@ -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<std::string, RichText::TextData>& plainAndRichtextPair) {
#ifdef __EMSCRIPTEN__
set_clipboard_str(plainAndRichtextPair.first);
lastCopiedRichText = plainAndRichtextPair.second;
#else
std::unordered_map<std::string, std::string> 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<std::string, std::string>& newClipboardData) {
@ -176,6 +165,7 @@ void InputManager::set_clipboard_data(const std::unordered_map<std::string, std:
std::unordered_map<std::string, std::string>& clipboardData = *static_cast<std::unordered_map<std::string, std::string>*>(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<const void*>(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);
}
}

View file

@ -203,16 +203,15 @@ struct InputManager {
void set_clipboard_data(const std::unordered_map<std::string, std::string>& newClipboardData);
void process_text_paste();
static std::string get_infpnt_richtext_mimetype();
std::unordered_map<std::string, std::string> clipboardData;
#ifdef __EMSCRIPTEN__
bool clipboardPasteEventHappened = false;
std::unordered_map<std::string, std::string> clipboardPasteEventData;
std::optional<RichText::TextData> lastCopiedRichText;
#endif
std::optional<RichText::TextData> lastCopiedRichText;
std::string key_assignment_to_str(const Vector2ui32& k);
Vector2ui32 key_assignment_from_str(const std::string& s);