Use string view for image clipboard data

This commit is contained in:
Yousef Khadadeh 2026-01-05 19:36:44 +03:00
parent 875a3760ed
commit 06079f80cd
4 changed files with 10 additions and 12 deletions

View file

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

View file

@ -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<World> 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;
}

View file

@ -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<void(std::string_view data)>& callback) {
#ifndef __EMSCRIPTEN__
static std::unordered_set<std::string> 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<char*>(clipboardData), clipboardDataSize);
callback(std::string_view(static_cast<char*>(clipboardData), clipboardDataSize));
SDL_free(clipboardData);
return toRet;
}
}
}
#endif
return std::string();
}
void InputManager::set_clipboard_str(std::string_view s) {

View file

@ -211,7 +211,7 @@ struct InputManager {
void set_clipboard_str(std::string_view s);
void set_clipboard_plain_and_richtext_pair(const std::pair<std::string, RichText::TextData>& plainAndRichtextPair);
std::string get_clipboard_str_SDL();
std::string get_clipboard_image_data_SDL();
void get_clipboard_image_data_SDL(const std::function<void(std::string_view data)>& callback);
void call_text_paste(bool isRichTextPaste);
void process_text_paste(const std::string& plainClipboardStr);