From 692fa5ab3357b2030bdff6a842b2a401eb2b9e97 Mon Sep 17 00:00:00 2001 From: Ricardo Antonio Tejada Date: Wed, 26 Apr 2017 21:38:41 +0200 Subject: [PATCH] Added Win32 implementation for Clipboard API --- src/SFML/Window/CMakeLists.txt | 2 + src/SFML/Window/Win32/ClipboardImpl.cpp | 103 ++++++++++++++++++++++++ src/SFML/Window/Win32/ClipboardImpl.hpp | 76 +++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 src/SFML/Window/Win32/ClipboardImpl.cpp create mode 100644 src/SFML/Window/Win32/ClipboardImpl.hpp diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt index 9a7da0a5..be1bb417 100644 --- a/src/SFML/Window/CMakeLists.txt +++ b/src/SFML/Window/CMakeLists.txt @@ -59,6 +59,8 @@ if(SFML_OS_WINDOWS) set(PLATFORM_SRC ${SRCROOT}/Win32/CursorImpl.hpp ${SRCROOT}/Win32/CursorImpl.cpp + ${SRCROOT}/Win32/ClipboardImpl.hpp + ${SRCROOT}/Win32/ClipboardImpl.cpp ${SRCROOT}/Win32/WglContext.cpp ${SRCROOT}/Win32/WglContext.hpp ${SRCROOT}/Win32/WglExtensions.cpp diff --git a/src/SFML/Window/Win32/ClipboardImpl.cpp b/src/SFML/Window/Win32/ClipboardImpl.cpp new file mode 100644 index 00000000..4f518ab9 --- /dev/null +++ b/src/SFML/Window/Win32/ClipboardImpl.cpp @@ -0,0 +1,103 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +namespace sf +{ +namespace priv +{ +//////////////////////////////////////////////////////////// +String ClipboardImpl::getString() +{ + String text; + + if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) + { + std::cerr << "Failed to get the clipboard data in Unicode format." << std::endl; + return text; + } + + if (!OpenClipboard(NULL)) + { + std::cerr << "Failed to open the Win32 clipboard." << std::endl; + return text; + } + + HANDLE clipboard_handle = GetClipboardData(CF_UNICODETEXT); + + if (!clipboard_handle) + { + std::cerr << "Failed to get Win32 handle for clipboard content." << std::endl; + CloseClipboard(); + return text; + } + + text = String(static_cast(GlobalLock(clipboard_handle))); + GlobalUnlock(clipboard_handle); + + CloseClipboard(); + return text; +} + + +//////////////////////////////////////////////////////////// +void ClipboardImpl::setString(const String& text) +{ + if (!OpenClipboard(NULL)) + { + std::cerr << "Failed to open the Win32 clipboard." << std::endl; + return; + } + + if (!EmptyClipboard()) + { + std::cerr << "Failed to empty the Win32 clipboard." << std::endl; + return; + } + + // Create a Win32-compatible string + size_t string_size = (text.getSize() + 1) * sizeof(WCHAR); + HANDLE string_handle = GlobalAlloc(GMEM_MOVEABLE, string_size); + + if (string_handle) + { + memcpy(GlobalLock(string_handle), text.toWideString().data(), string_size); + GlobalUnlock(string_handle); + SetClipboardData(CF_UNICODETEXT, string_handle); + } + + CloseClipboard(); +} + +} // namespace priv + +} // namespace sf diff --git a/src/SFML/Window/Win32/ClipboardImpl.hpp b/src/SFML/Window/Win32/ClipboardImpl.hpp new file mode 100644 index 00000000..0eee3418 --- /dev/null +++ b/src/SFML/Window/Win32/ClipboardImpl.hpp @@ -0,0 +1,76 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_CLIPBOARDIMPLWIN32_HPP +#define SFML_CLIPBOARDIMPLWIN32_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +namespace sf +{ +namespace priv +{ +//////////////////////////////////////////////////////////// +/// \brief Give access to the system clipboard +/// +//////////////////////////////////////////////////////////// +class ClipboardImpl +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Get the content of the clipboard as string data + /// + /// This function returns the content of the clipboard + /// as a string. If the clipboard does not contain string + /// it returns an empty sf::String object. + /// + /// \return Current content of the clipboard + /// + //////////////////////////////////////////////////////////// + static String getString(); + + //////////////////////////////////////////////////////////// + /// \brief Set the content of the clipboard as string data + /// + /// This function sets the content of the clipboard as a + /// string. + /// + /// \param text sf::String object containing the data to be sent + /// to the clipboard + /// + //////////////////////////////////////////////////////////// + static void setString(const String& text); +}; + +} // namespace priv + +} // namespace sf + + +#endif // SFML_CLIPBOARDIMPLWIN32_HPP