summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Weissflog <floooh@gmail.com>2023-03-28 19:09:42 +0200
committerAndre Weissflog <floooh@gmail.com>2023-03-28 19:09:42 +0200
commit39a40783cfde9c0726208a84916908c5152a85c9 (patch)
treeea8c935a284baee23b61641fc5e0cb35bb6d8739
parentc0e54485457b2e1645f2d809394753b53bf50cd4 (diff)
sokol_app.h win32.h: fix GlobalUnlock parameter in clipboard code (fixes #810)
-rw-r--r--sokol_app.h21
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;
}