From f6be69818f749bccaaa1336828ecf000d2ac1fcb Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 13 Apr 2025 09:44:43 +0200 Subject: [PATCH] [client,sdl] use a GUID to identify the clipboard Use a clipboard mime type with a GUID to identify the specific FreeRDP instance. When running multiple clients it might confuse a clipboard update from another instance with an internal one otherwise. --- client/SDL/SDL3/sdl_clip.cpp | 14 ++++++++++---- client/SDL/SDL3/sdl_clip.hpp | 4 ++++ client/SDL/SDL3/sdl_utils.cpp | 35 +++++++++++++++++++++++++++++++++++ client/SDL/SDL3/sdl_utils.hpp | 2 ++ 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/client/SDL/SDL3/sdl_clip.cpp b/client/SDL/SDL3/sdl_clip.cpp index e77a65aa9..9ea0c0549 100644 --- a/client/SDL/SDL3/sdl_clip.cpp +++ b/client/SDL/SDL3/sdl_clip.cpp @@ -19,6 +19,7 @@ */ #include +#include #include #include #include @@ -129,9 +130,14 @@ static bool operator==(const CLIPRDR_FORMAT& lhs, const CLIPRDR_FORMAT& rhs) sdlClip::sdlClip(SdlContext* sdl) : _sdl(sdl), _file(cliprdr_file_context_new(this)), _log(WLog_Get(TAG)), - _system(ClipboardCreate()), _event(CreateEventA(nullptr, TRUE, FALSE, nullptr)) + _system(ClipboardCreate()), _event(CreateEventA(nullptr, TRUE, FALSE, nullptr)), + _uuid(sdl::utils::generate_uuid_v4()) { WINPR_ASSERT(sdl); + + std::stringstream ss; + ss << s_mime_freerdp_update << "-" << _uuid; + _mime_uuid = ss.str(); } sdlClip::~sdlClip() @@ -166,12 +172,12 @@ BOOL sdlClip::uninit(CliprdrClientContext* clip) return TRUE; } -static bool contains(const char** mime_types, Sint32 count) +bool sdlClip::contains(const char** mime_types, Sint32 count) { for (Sint32 x = 0; x < count; x++) { const auto mime = mime_types[x]; - if (mime && (strcmp(s_mime_freerdp_update, mime) == 0)) + if (mime && (strcmp(_mime_uuid.c_str(), mime) == 0)) return true; } return false; @@ -542,7 +548,7 @@ UINT sdlClip::ReceiveServerFormatList(CliprdrClientContext* context, clipboard->_current_mimetypes.push_back(s_mime_gnome_copied_files); clipboard->_current_mimetypes.push_back(s_mime_mate_copied_files); } - clipboard->_current_mimetypes.push_back(s_mime_freerdp_update); + clipboard->_current_mimetypes.push_back(clipboard->_mime_uuid.c_str()); auto s = clipboard->_current_mimetypes.size(); SDL_Event ev = { SDL_EVENT_CLIPBOARD_UPDATE }; diff --git a/client/SDL/SDL3/sdl_clip.hpp b/client/SDL/SDL3/sdl_clip.hpp index 5df648cde..c8df04d9f 100644 --- a/client/SDL/SDL3/sdl_clip.hpp +++ b/client/SDL/SDL3/sdl_clip.hpp @@ -112,6 +112,8 @@ class sdlClip std::string getServerFormat(uint32_t id); uint32_t serverIdForMime(const std::string& mime); + bool contains(const char** mime_types, Sint32 count); + static UINT MonitorReady(CliprdrClientContext* context, const CLIPRDR_MONITOR_READY* monitorReady); @@ -162,4 +164,6 @@ class sdlClip }; std::map _cache_data; std::vector _current_mimetypes; + std::string _uuid; + std::string _mime_uuid; }; diff --git a/client/SDL/SDL3/sdl_utils.cpp b/client/SDL/SDL3/sdl_utils.cpp index 2911a3fde..a69c930c0 100644 --- a/client/SDL/SDL3/sdl_utils.cpp +++ b/client/SDL/SDL3/sdl_utils.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "sdl_utils.hpp" @@ -353,3 +354,37 @@ std::string sdl::utils::rdp_orientation_to_str(uint32_t orientation) } } } + +std::string sdl::utils::generate_uuid_v4() +{ + static std::random_device rd; + static std::mt19937 gen(rd()); + static std::uniform_int_distribution<> dis(0, 255); + std::stringstream ss; + ss << std::hex << std::setfill('0') << std::setw(2); + for (int i = 0; i < 4; i++) + { + ss << dis(gen); + } + ss << "-"; + for (int i = 0; i < 2; i++) + { + ss << dis(gen); + } + ss << "-"; + for (int i = 0; i < 2; i++) + { + ss << dis(gen); + } + ss << "-"; + for (int i = 0; i < 2; i++) + { + ss << dis(gen); + } + ss << "-"; + for (int i = 0; i < 6; i++) + { + ss << dis(gen); + }; + return ss.str(); +} diff --git a/client/SDL/SDL3/sdl_utils.hpp b/client/SDL/SDL3/sdl_utils.hpp index ccb9b1545..499754be3 100644 --- a/client/SDL/SDL3/sdl_utils.hpp +++ b/client/SDL/SDL3/sdl_utils.hpp @@ -86,4 +86,6 @@ namespace sdl::utils std::string rdp_orientation_to_str(uint32_t orientation); std::string sdl_orientation_to_str(SDL_DisplayOrientation orientation); UINT32 orientaion_to_rdp(SDL_DisplayOrientation orientation); + + std::string generate_uuid_v4(); }