Added Win32 implementation for Clipboard API

This commit is contained in:
Ricardo Antonio Tejada 2017-04-26 21:38:41 +02:00 committed by Lukas Dürrenberger
parent 4bc3c6f8bf
commit 692fa5ab33
3 changed files with 181 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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