// license:BSD-3-Clause // copyright-holders:Aaron Giles //============================================================ // // winclip.c - Win32 OSD core clipboard access functions // //============================================================ #define WIN32_LEAN_AND_MEAN #include #include "strconv.h" //============================================================ // get_clipboard_text_by_format //============================================================ static char *get_clipboard_text_by_format(UINT format, char *(*convert)(LPCVOID data)) { char *result = NULL; HANDLE data_handle; LPVOID data; // check to see if this format is available if (IsClipboardFormatAvailable(format)) { // open the clipboard if (OpenClipboard(NULL)) { // try to access clipboard data data_handle = GetClipboardData(format); if (data_handle != NULL) { // lock the data data = GlobalLock(data_handle); if (data != NULL) { // invoke the convert result = (*convert)(data); // unlock the data GlobalUnlock(data_handle); } } // close out the clipboard CloseClipboard(); } } return result; } //============================================================ // convert_wide //============================================================ static char *convert_wide(LPCVOID data) { return utf8_from_wstring((LPCWSTR) data); } //============================================================ // convert_ansi //============================================================ static char *convert_ansi(LPCVOID data) { return utf8_from_astring((LPCSTR) data); } //============================================================ // osd_get_clipboard_text //============================================================ char *osd_get_clipboard_text(void) { char *result; // try to access unicode text result = get_clipboard_text_by_format(CF_UNICODETEXT, convert_wide); // try to access ANSI text if (result == NULL) result = get_clipboard_text_by_format(CF_TEXT, convert_ansi); return result; }