From 06079f80cd9b99df84738d58bfb855188871067e Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Mon, 5 Jan 2026 19:36:44 +0300 Subject: [PATCH] Use string view for image clipboard data --- .../EmscriptenHelpers/emscripten_browser_clipboard.h | 4 ++-- src/DrawingProgram/DrawingProgram.cpp | 10 +++++----- src/InputManager.cpp | 6 ++---- src/InputManager.hpp | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/include/EmscriptenHelpers/emscripten_browser_clipboard.h b/include/EmscriptenHelpers/emscripten_browser_clipboard.h index 5cb062e..d82bf38 100644 --- a/include/EmscriptenHelpers/emscripten_browser_clipboard.h +++ b/include/EmscriptenHelpers/emscripten_browser_clipboard.h @@ -17,7 +17,7 @@ namespace emscripten_browser_clipboard { /////////////////////////////////// Interface ////////////////////////////////// -using paste_image_handler = void(*)(std::string, void*); +using paste_image_handler = void(*)(std::string_view, void*); using paste_handler = void(*)(std::string&&, void*); using copy_handler = char const*(*)(void*); @@ -142,7 +142,7 @@ EMSCRIPTEN_KEEPALIVE inline int emscripten_browser_clipboard_detail_paste_return EMSCRIPTEN_KEEPALIVE inline int emscripten_browser_clipboard_detail_paste_image_return(char const *pasteData, int pasteSize, paste_image_handler callback, void *callback_data) { /// Call paste callback - this function is called from javascript when the paste event occurs - callback(std::string(pasteData, pasteSize), callback_data); + callback(std::string_view(pasteData, pasteSize), callback_data); return 1; } diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index c51ff76..909fc70 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -179,18 +179,18 @@ bool DrawingProgram::selection_action_menu(Vector2f popupPos) { static PasteData pasteData; pasteData.screenPos = popupPos; pasteData.w = make_weak_ptr(world.main.world); - emscripten_browser_clipboard::paste_async_image([](std::string pasteData, void* callbackData){ + emscripten_browser_clipboard::paste_async_image([](std::string_view pasteData, void* callbackData){ PasteData* p = (PasteData*)callbackData; std::shared_ptr wLock = p->w.lock(); if(wLock) - wLock->drawProg.add_file_to_canvas_by_data("Image from clipboard", std::string(pasteData), p->screenPos); + wLock->drawProg.add_file_to_canvas_by_data("Image from clipboard", pasteData, p->screenPos); else Logger::get().log("INFO", "Loading image to canvas that has been destroyed"); }, &pasteData); #else - std::string imageData = world.main.input.get_clipboard_image_data_SDL(); - if(!imageData.empty()) - add_file_to_canvas_by_data("Image from clipboard", imageData, popupPos); + world.main.input.get_clipboard_image_data_SDL([&](std::string_view pasteData) { + add_file_to_canvas_by_data("Image from clipboard", pasteData, popupPos); + }); #endif shouldClose = true; } diff --git a/src/InputManager.cpp b/src/InputManager.cpp index 55f35d9..aa09609 100644 --- a/src/InputManager.cpp +++ b/src/InputManager.cpp @@ -136,7 +136,7 @@ std::string InputManager::get_clipboard_str_SDL() { return toRet; } -std::string InputManager::get_clipboard_image_data_SDL() { +void InputManager::get_clipboard_image_data_SDL(const std::function& callback) { #ifndef __EMSCRIPTEN__ static std::unordered_set validMimetypes; if(validMimetypes.empty()) { @@ -153,14 +153,12 @@ std::string InputManager::get_clipboard_image_data_SDL() { if(validMimetypes.contains(mimeTypes[i])) { size_t clipboardDataSize; void* clipboardData = SDL_GetClipboardData(mimeTypes[i], &clipboardDataSize); - std::string toRet(static_cast(clipboardData), clipboardDataSize); + callback(std::string_view(static_cast(clipboardData), clipboardDataSize)); SDL_free(clipboardData); - return toRet; } } } #endif - return std::string(); } void InputManager::set_clipboard_str(std::string_view s) { diff --git a/src/InputManager.hpp b/src/InputManager.hpp index 491678c..50f9fc4 100644 --- a/src/InputManager.hpp +++ b/src/InputManager.hpp @@ -211,7 +211,7 @@ struct InputManager { void set_clipboard_str(std::string_view s); void set_clipboard_plain_and_richtext_pair(const std::pair& plainAndRichtextPair); std::string get_clipboard_str_SDL(); - std::string get_clipboard_image_data_SDL(); + void get_clipboard_image_data_SDL(const std::function& callback); void call_text_paste(bool isRichTextPaste); void process_text_paste(const std::string& plainClipboardStr);