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 <ostream>
#include <string_view>
#include <cstring>
@ -65,7 +66,8 @@ String ClipboardImpl::getString()
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);
CloseClipboard();
@ -90,10 +92,11 @@ void ClipboardImpl::setString(const String& text)
}
// 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))
{
std::memcpy(GlobalLock(stringHandle), text.toWideString().data(), stringSize);
std::memcpy(GlobalLock(stringHandle), string.data(), stringSize);
GlobalUnlock(stringHandle);
SetClipboardData(CF_UNICODETEXT, stringHandle);
}

View File

@ -12,12 +12,32 @@ TEST_CASE("[Window] sf::Clipboard", runDisplayTests())
// Capture current clipboard state
const auto currentClipboard = sf::Clipboard::getString();
SECTION("Set/get string")
sf::String string;
SECTION("ASCII")
{
sf::Clipboard::setString("Welcome to SFML!");
CHECK(sf::Clipboard::getString() == "Welcome to SFML!");
string = "Snail";
}
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
sf::Clipboard::setString(currentClipboard);