mirror of
https://github.com/SFML/SFML.git
synced 2025-02-23 14:56:02 +08:00
Fix using Emoji with sf::Clipboard
This commit is contained in:
parent
767ffbe636
commit
56c5dd35d6
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user