summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/sdl/sdlos_win32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/sdl/sdlos_win32.cpp')
-rw-r--r--src/osd/sdl/sdlos_win32.cpp102
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;
+}