Fix using Emoji with sf::Clipboard

This commit is contained in:
Chris Thrasher 2025-02-18 15:27:21 -07:00
parent 767ffbe636
commit 56c5dd35d6
2 changed files with 29 additions and 6 deletions

View File

@ -33,6 +33,7 @@
#include <SFML/System/Win32/WindowsHeader.hpp> #include <SFML/System/Win32/WindowsHeader.hpp>
#include <ostream> #include <ostream>
#include <string_view>
#include <cstring> #include <cstring>
@ -65,7 +66,8 @@ String ClipboardImpl::getString()
return text; return text;
} }
text = String(static_cast<wchar_t*>(GlobalLock(clipboardHandle))); const std::u16string_view string(static_cast<const char16_t*>(GlobalLock(clipboardHandle)));
text = String::fromUtf16(string.begin(), string.end());
GlobalUnlock(clipboardHandle); GlobalUnlock(clipboardHandle);
CloseClipboard(); CloseClipboard();
@ -90,10 +92,11 @@ void ClipboardImpl::setString(const String& text)
} }
// Create a Win32-compatible string // Create a Win32-compatible string
const std::size_t stringSize = (text.getSize() + 1) * sizeof(WCHAR); const auto string = text.toUtf16();
const std::size_t stringSize = (string.size() + 1) * sizeof(char16_t);
if (const HANDLE stringHandle = GlobalAlloc(GMEM_MOVEABLE, stringSize)) if (const HANDLE stringHandle = GlobalAlloc(GMEM_MOVEABLE, stringSize))
{ {
std::memcpy(GlobalLock(stringHandle), text.toWideString().data(), stringSize); std::memcpy(GlobalLock(stringHandle), string.data(), stringSize);
GlobalUnlock(stringHandle); GlobalUnlock(stringHandle);
SetClipboardData(CF_UNICODETEXT, stringHandle); SetClipboardData(CF_UNICODETEXT, stringHandle);
} }

View File

@ -12,12 +12,32 @@ TEST_CASE("[Window] sf::Clipboard", runDisplayTests())
// Capture current clipboard state // Capture current clipboard state
const auto currentClipboard = sf::Clipboard::getString(); const auto currentClipboard = sf::Clipboard::getString();
SECTION("Set/get string") sf::String string;
SECTION("ASCII")
{ {
sf::Clipboard::setString("Welcome to SFML!"); string = "Snail";
CHECK(sf::Clipboard::getString() == "Welcome to SFML!");
} }
SECTION("Latin1")
{
string = U"Limacé";
}
SECTION("Basic Multilingual Plane")
{
string = U"カタツムリ";
}
SECTION("Emoji")
{
string = U"🐌";
}
INFO("String: " << reinterpret_cast<const char*>(string.toUtf8().c_str()));
sf::Clipboard::setString(string);
CHECK(sf::Clipboard::getString() == string);
// Restore clipboard // Restore clipboard
sf::Clipboard::setString(currentClipboard); sf::Clipboard::setString(currentClipboard);