|
@@ -7518,26 +7518,32 @@ _SOKOL_PRIVATE bool _sapp_win32_set_clipboard_string(const char* str) {
|
|
|
SOKOL_ASSERT(_sapp.win32.hwnd);
|
|
|
SOKOL_ASSERT(_sapp.clipboard.enabled && (_sapp.clipboard.buf_size > 0));
|
|
|
|
|
|
+ if (!OpenClipboard(_sapp.win32.hwnd)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ HANDLE object = 0;
|
|
|
wchar_t* wchar_buf = 0;
|
|
|
+
|
|
|
const SIZE_T wchar_buf_size = (SIZE_T)_sapp.clipboard.buf_size * sizeof(wchar_t);
|
|
|
- HANDLE object = GlobalAlloc(GMEM_MOVEABLE, wchar_buf_size);
|
|
|
- if (!object) {
|
|
|
+ object = GlobalAlloc(GMEM_MOVEABLE, wchar_buf_size);
|
|
|
+ if (NULL == object) {
|
|
|
goto error;
|
|
|
}
|
|
|
wchar_buf = (wchar_t*) GlobalLock(object);
|
|
|
- if (!wchar_buf) {
|
|
|
+ if (NULL == wchar_buf) {
|
|
|
goto error;
|
|
|
}
|
|
|
if (!_sapp_win32_utf8_to_wide(str, wchar_buf, (int)wchar_buf_size)) {
|
|
|
goto error;
|
|
|
}
|
|
|
- GlobalUnlock(wchar_buf);
|
|
|
+ GlobalUnlock(object);
|
|
|
wchar_buf = 0;
|
|
|
- if (!OpenClipboard(_sapp.win32.hwnd)) {
|
|
|
+ EmptyClipboard();
|
|
|
+ // NOTE: when successful, SetClipboardData() takes ownership of memory object!
|
|
|
+ if (NULL == SetClipboardData(CF_UNICODETEXT, object)) {
|
|
|
goto error;
|
|
|
}
|
|
|
- EmptyClipboard();
|
|
|
- SetClipboardData(CF_UNICODETEXT, object);
|
|
|
CloseClipboard();
|
|
|
return true;
|
|
|
|
|
@@ -7548,6 +7554,7 @@ error:
|
|
|
if (object) {
|
|
|
GlobalFree(object);
|
|
|
}
|
|
|
+ CloseClipboard();
|
|
|
return false;
|
|
|
}
|
|
|
|