summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/lib/osdlib_macosx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/lib/osdlib_macosx.cpp')
-rw-r--r--src/osd/modules/lib/osdlib_macosx.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/osd/modules/lib/osdlib_macosx.cpp b/src/osd/modules/lib/osdlib_macosx.cpp
index 34837e8aae4..4d1f839cabd 100644
--- a/src/osd/modules/lib/osdlib_macosx.cpp
+++ b/src/osd/modules/lib/osdlib_macosx.cpp
@@ -14,6 +14,10 @@
#include <sys/types.h>
#include <signal.h>
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+#include <Carbon/Carbon.h>
+
// MAME headers
#include "osdcore.h"
#include "osdlib.h"
@@ -136,3 +140,82 @@ void osd_break_into_debugger(const char *message)
printf("Ignoring MAME exception: %s\n", message);
#endif
}
+
+
+//============================================================
+// osd_get_clipboard_text
+//============================================================
+
+char *osd_get_clipboard_text(void)
+{
+ OSStatus err;
+
+ PasteboardRef pasteboard_ref;
+ err = PasteboardCreate(kPasteboardClipboard, &pasteboard_ref);
+ if (err)
+ return NULL;
+
+ PasteboardSynchronize(pasteboard_ref);
+
+ ItemCount item_count;
+ err = PasteboardGetItemCount(pasteboard_ref, &item_count);
+
+ char *result = NULL; // core expects a malloced C string of uft8 data
+ for (UInt32 item_index = 1; (item_index <= item_count) && !result; item_index++)
+ {
+ PasteboardItemID item_id;
+ err = PasteboardGetItemIdentifier(pasteboard_ref, item_index, &item_id);
+ if (err)
+ continue;
+
+ CFArrayRef flavor_type_array;
+ err = PasteboardCopyItemFlavors(pasteboard_ref, item_id, &flavor_type_array);
+ if (err)
+ continue;
+
+ CFIndex const flavor_count = CFArrayGetCount(flavor_type_array);
+ for (CFIndex flavor_index = 0; (flavor_index < flavor_count) && !result; flavor_index++)
+ {
+ CFStringRef const flavor_type = (CFStringRef)CFArrayGetValueAtIndex(flavor_type_array, flavor_index);
+
+ CFStringEncoding encoding;
+ if (UTTypeConformsTo(flavor_type, kUTTypeUTF16PlainText))
+ encoding = kCFStringEncodingUTF16;
+ else if (UTTypeConformsTo (flavor_type, kUTTypeUTF8PlainText))
+ encoding = kCFStringEncodingUTF8;
+ else if (UTTypeConformsTo (flavor_type, kUTTypePlainText))
+ encoding = kCFStringEncodingMacRoman;
+ else
+ continue;
+
+ CFDataRef flavor_data;
+ err = PasteboardCopyItemFlavorData(pasteboard_ref, item_id, flavor_type, &flavor_data);
+
+ if (!err)
+ {
+ CFStringRef string_ref = CFStringCreateFromExternalRepresentation(kCFAllocatorDefault, flavor_data, encoding);
+ CFDataRef data_ref = CFStringCreateExternalRepresentation (kCFAllocatorDefault, string_ref, kCFStringEncodingUTF8, '?');
+ CFRelease(string_ref);
+ CFRelease(flavor_data);
+
+ CFIndex const length = CFDataGetLength(data_ref);
+ CFRange const range = CFRangeMake(0, length);
+
+ result = reinterpret_cast<char *>(osd_malloc_array(length + 1));
+ if (result)
+ {
+ CFDataGetBytes(data_ref, range, reinterpret_cast<unsigned char *>(result));
+ result[length] = 0;
+ }
+
+ CFRelease(data_ref);
+ }
+ }
+
+ CFRelease(flavor_type_array);
+ }
+
+ CFRelease(pasteboard_ref);
+
+ return result;
+}