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