From 87977d430e2167df8abee263db7a41abb9121a75 Mon Sep 17 00:00:00 2001
From: Ricardo Antonio Tejada <ricardo.a.tejada@gmail.com>
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 4f38e0d4..6686f614 100644
--- a/src/SFML/Window/CMakeLists.txt
+++ b/src/SFML/Window/CMakeLists.txt
@@ -54,6 +54,8 @@ source_group("" FILES ${SRC})
 # add platform specific sources
 if(SFML_OS_WINDOWS)
     set(PLATFORM_SRC
+        ${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 <SFML/Window/Win32/ClipboardImpl.hpp>
+#include <SFML/System/String.hpp>
+#include <iostream>
+#include <windows.h>
+
+
+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<wchar_t*>(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 <SFML/System/String.hpp>
+
+
+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