diff options
Diffstat (limited to 'src/osd/sdl/sdlos_win32.cpp')
-rw-r--r-- | src/osd/sdl/sdlos_win32.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/osd/sdl/sdlos_win32.cpp b/src/osd/sdl/sdlos_win32.cpp new file mode 100644 index 00000000000..0de8a374817 --- /dev/null +++ b/src/osd/sdl/sdlos_win32.cpp @@ -0,0 +1,102 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert, R. Belmont +//============================================================ +// +// sdlos_*.c - OS specific low level code +// +// SDLMAME by Olivier Galibert and R. Belmont +// +//============================================================ + +// standard sdl header +#include "sdlinc.h" + + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +// MAME headers +#include "osdcore.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 + if (result == NULL) + 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; +} |