From 83512822b17577e8a5feab2e6e6554f31900c0d0 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Mon, 23 Jun 2025 17:50:02 +0300 Subject: [PATCH] Support clipboard actions in Content Browser and Scene tree on Wayland --- .../Engine/Platform/SDL/SDLPlatform.Linux.cpp | 72 ++++++++++++++++++- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Platform/SDL/SDLPlatform.Linux.cpp b/Source/Engine/Platform/SDL/SDLPlatform.Linux.cpp index 51eab8809..9c1456ef3 100644 --- a/Source/Engine/Platform/SDL/SDLPlatform.Linux.cpp +++ b/Source/Engine/Platform/SDL/SDLPlatform.Linux.cpp @@ -1233,6 +1233,30 @@ void SDLClipboard::SetRawData(const Span& data) } else { + if (data.Length() == 0) + return; + + const char* uriList = "flaxengine/raw"; + Array* buffer = New>(data.Get(), data.Length()); + + SDL_SetClipboardData([](void* userdata, const char* mime_type, size_t* size) -> const void* + { + // Clipboard data is requested + Array* buffer = static_cast*>(userdata); + if (StringUtils::Compare(mime_type, "flaxengine/raw") == 0) + { + *size = buffer->Count(); + return buffer->Get(); + } + *size = 0; + return nullptr; + }, + [](void* userdata) + { + // Cleanup previous clipboard data + Array* buffer = static_cast*>(userdata); + Delete(buffer); + }, buffer, &uriList, 1); } } @@ -1259,6 +1283,36 @@ void SDLClipboard::SetFiles(const Array& files) } else { + if (files.Count() == 0) + return; + + const char* uriList = "text/uri-list"; + StringAnsi* buffer = New(); + for (auto file : files) + { + buffer->Append("file://"); + buffer->Append(StringAnsi(file)); + buffer->Append("\n"); + } + + SDL_SetClipboardData([](void* userdata, const char* mime_type, size_t* size) -> const void* + { + // Clipboard data is requested + StringAnsi* buffer = (StringAnsi*)userdata; + if (StringUtils::Compare(mime_type, "text/uri-list") == 0) + { + *size = buffer->Length(); + return buffer->Get(); + } + *size = 0; + return nullptr; + }, + [](void* userdata) + { + // Cleanup previous clipboard data + StringAnsi* buffer = (StringAnsi*)userdata; + Delete(buffer); + }, buffer, &uriList, 1); } } @@ -1306,7 +1360,10 @@ Array SDLClipboard::GetRawData() } else { - return Array(); + size_t length = 0; + byte* data = static_cast(SDL_GetClipboardData("flaxengine/raw", &length)); + Array rawData(data, length); + return rawData; } } @@ -1327,7 +1384,18 @@ Array SDLClipboard::GetFiles() } else { - return Array(); + size_t length = 0; + const char* data = static_cast(SDL_GetClipboardData("text/uri-list", &length)); + String stringBuffer = String(StringAnsi(data, length)); + Array files; + stringBuffer.Split('\n', files); + for (auto& file : files) + { + if (file.StartsWith(TEXT("file://"))) + file = file.Substring(7); + file = file.TrimTrailing(); // Trim '\r' + } + return files; } }