|
|
|
@ -31,6 +31,7 @@ |
|
|
|
|
|
|
|
|
|
#include <limits.h> |
|
|
|
|
#include <string.h> |
|
|
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
@ -43,6 +44,49 @@ |
|
|
|
|
|
|
|
|
|
void _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string) |
|
|
|
|
{ |
|
|
|
|
WCHAR* wideString; |
|
|
|
|
HANDLE stringHandle; |
|
|
|
|
size_t wideSize; |
|
|
|
|
|
|
|
|
|
wideString = _glfwCreateWideStringFromUTF8(string); |
|
|
|
|
if (!wideString) |
|
|
|
|
{ |
|
|
|
|
_glfwSetError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"Win32/WGL: Failed to convert clipboard string to " |
|
|
|
|
"wide string"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
wideSize = (wcslen(wideString) + 1) * sizeof(WCHAR); |
|
|
|
|
|
|
|
|
|
stringHandle = GlobalAlloc(GMEM_MOVEABLE, wideSize); |
|
|
|
|
if (!stringHandle) |
|
|
|
|
{ |
|
|
|
|
free(wideString); |
|
|
|
|
|
|
|
|
|
_glfwSetError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"Win32/WGL: Failed to allocate global handle for clipboard"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
memcpy(GlobalLock(stringHandle), wideString, wideSize); |
|
|
|
|
GlobalUnlock(stringHandle); |
|
|
|
|
|
|
|
|
|
if (!OpenClipboard(window->Win32.handle)) |
|
|
|
|
{ |
|
|
|
|
GlobalFree(stringHandle); |
|
|
|
|
free(wideString); |
|
|
|
|
|
|
|
|
|
_glfwSetError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"Win32/WGL: Failed to open clipboard"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
EmptyClipboard(); |
|
|
|
|
SetClipboardData(CF_UNICODETEXT, stringHandle); |
|
|
|
|
CloseClipboard(); |
|
|
|
|
|
|
|
|
|
free(wideString); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//========================================================================
|
|
|
|
@ -51,6 +95,54 @@ void _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string) |
|
|
|
|
|
|
|
|
|
size_t _glfwPlatformGetClipboardString(_GLFWwindow* window, char* string, size_t size) |
|
|
|
|
{ |
|
|
|
|
return 0; |
|
|
|
|
HANDLE stringHandle; |
|
|
|
|
char* utf8String; |
|
|
|
|
size_t utf8Size; |
|
|
|
|
|
|
|
|
|
if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) |
|
|
|
|
{ |
|
|
|
|
_glfwSetError(GLFW_FORMAT_UNAVAILABLE, NULL); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!OpenClipboard(window->Win32.handle)) |
|
|
|
|
{ |
|
|
|
|
_glfwSetError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"Win32/WGL: Failed to open clipboard"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
stringHandle = GetClipboardData(CF_UNICODETEXT); |
|
|
|
|
if (!stringHandle) |
|
|
|
|
{ |
|
|
|
|
CloseClipboard(); |
|
|
|
|
|
|
|
|
|
_glfwSetError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"Win32/WGL: Failed to retrieve clipboard data"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
utf8String = _glfwCreateUTF8FromWideString(GlobalLock(stringHandle)); |
|
|
|
|
GlobalUnlock(stringHandle); |
|
|
|
|
CloseClipboard(); |
|
|
|
|
|
|
|
|
|
if (!utf8String) |
|
|
|
|
{ |
|
|
|
|
_glfwSetError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"Win32/WGL: Failed to convert wide string to UTF-8"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
utf8Size = strlen(utf8String) + 1; |
|
|
|
|
if (utf8Size > size) |
|
|
|
|
{ |
|
|
|
|
memcpy(string, utf8String, size); |
|
|
|
|
string[size - 1] = '\0'; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
memcpy(string, utf8String, utf8Size); |
|
|
|
|
|
|
|
|
|
free(utf8String); |
|
|
|
|
return utf8Size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|