diff options
| author | Andre Weissflog <floooh@gmail.com> | 2023-03-28 19:09:42 +0200 |
|---|---|---|
| committer | Andre Weissflog <floooh@gmail.com> | 2023-03-28 19:09:42 +0200 |
| commit | 39a40783cfde9c0726208a84916908c5152a85c9 (patch) | |
| tree | ea8c935a284baee23b61641fc5e0cb35bb6d8739 | |
| parent | c0e54485457b2e1645f2d809394753b53bf50cd4 (diff) | |
sokol_app.h win32.h: fix GlobalUnlock parameter in clipboard code (fixes #810)
| -rw-r--r-- | sokol_app.h | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/sokol_app.h b/sokol_app.h index b19c501e..152cce06 100644 --- a/sokol_app.h +++ b/sokol_app.h @@ -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; } |