diff options
Diffstat (limited to 'src/osd/windows/winclip.cpp')
-rw-r--r-- | src/osd/windows/winclip.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/osd/windows/winclip.cpp b/src/osd/windows/winclip.cpp new file mode 100644 index 00000000000..a951b525cc1 --- /dev/null +++ b/src/osd/windows/winclip.cpp @@ -0,0 +1,89 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +//============================================================ +// +// winclip.c - Win32 OSD core clipboard access functions +// +//============================================================ + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +#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 = NULL; + + // 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; +} |