diff options
author | 2016-04-03 17:54:45 +0200 | |
---|---|---|
committer | 2016-04-03 17:55:10 +0200 | |
commit | 5e80a732aa7f8c6db116ec8753343f40a55034bd (patch) | |
tree | cfb1453c0a1f6d94e433e0b699bde9650d9a675d /src/osd/modules/lib/osdlib_win32.cpp | |
parent | 0730ffc328dd02b0b85660e056d6390518645b26 (diff) |
move clipboard handling on proper place (nw)
Diffstat (limited to 'src/osd/modules/lib/osdlib_win32.cpp')
-rw-r--r-- | src/osd/modules/lib/osdlib_win32.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/osd/modules/lib/osdlib_win32.cpp b/src/osd/modules/lib/osdlib_win32.cpp index 572774d6c4c..c5792f0307d 100644 --- a/src/osd/modules/lib/osdlib_win32.cpp +++ b/src/osd/modules/lib/osdlib_win32.cpp @@ -21,6 +21,7 @@ #include "osdlib.h" #include "osdcomm.h" #include "osdcore.h" +#include "strconv.h" #ifdef OSD_WINDOWS #include "winutf8.h" @@ -240,3 +241,76 @@ void osd_break_into_debugger(const char *message) } #endif } + +//============================================================ +// 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) +{ + // try to access unicode text + char *result = get_clipboard_text_by_format(CF_UNICODETEXT, convert_wide); + + // try to access ANSI text + if (result == nullptr) + result = get_clipboard_text_by_format(CF_TEXT, convert_ansi); + + return result; +} |