diff options
Diffstat (limited to 'src/osd/modules/lib/osdlib_macosx.cpp')
-rw-r--r-- | src/osd/modules/lib/osdlib_macosx.cpp | 192 |
1 files changed, 64 insertions, 128 deletions
diff --git a/src/osd/modules/lib/osdlib_macosx.cpp b/src/osd/modules/lib/osdlib_macosx.cpp index 0d89e6c3596..4d1f839cabd 100644 --- a/src/osd/modules/lib/osdlib_macosx.cpp +++ b/src/osd/modules/lib/osdlib_macosx.cpp @@ -16,7 +16,6 @@ #include <mach/mach.h> #include <mach/mach_time.h> -#include <mach/mach_traps.h> #include <Carbon/Carbon.h> // MAME headers @@ -55,30 +54,6 @@ void osd_process_kill(void) } //============================================================ -// osd_num_processors -//============================================================ - -int osd_get_num_processors(void) -{ - int processors = 1; - - struct host_basic_info host_basic_info; - unsigned int count; - kern_return_t r; - mach_port_t my_mach_host_self; - - count = HOST_BASIC_INFO_COUNT; - my_mach_host_self = mach_host_self(); - if ( ( r = host_info(my_mach_host_self, HOST_BASIC_INFO, (host_info_t)(&host_basic_info), &count)) == KERN_SUCCESS ) - { - processors = host_basic_info.avail_cpus; - } - mach_port_deallocate(mach_task_self(), my_mach_host_self); - - return processors; -} - -//============================================================ // osd_malloc //============================================================ @@ -168,118 +143,79 @@ void osd_break_into_debugger(const char *message) //============================================================ -// PROTOTYPES -//============================================================ - -static osd_ticks_t init_cycle_counter(void); -static osd_ticks_t mach_cycle_counter(void); - -//============================================================ -// STATIC VARIABLES +// osd_get_clipboard_text //============================================================ -static osd_ticks_t (*cycle_counter)(void) = init_cycle_counter; -static osd_ticks_t (*ticks_counter)(void) = init_cycle_counter; -static osd_ticks_t ticks_per_second; - -//============================================================ -// init_cycle_counter -// -// to avoid total grossness, this function is split by subarch -//============================================================ - -static osd_ticks_t init_cycle_counter(void) +char *osd_get_clipboard_text(void) { - osd_ticks_t start, end; - osd_ticks_t a, b; + OSStatus err; - cycle_counter = mach_cycle_counter; - ticks_counter = mach_cycle_counter; + PasteboardRef pasteboard_ref; + err = PasteboardCreate(kPasteboardClipboard, &pasteboard_ref); + if (err) + return NULL; - // wait for an edge on the timeGetTime call - a = SDL_GetTicks(); - do - { - b = SDL_GetTicks(); - } while (a == b); + PasteboardSynchronize(pasteboard_ref); - // get the starting cycle count - start = (*cycle_counter)(); + ItemCount item_count; + err = PasteboardGetItemCount(pasteboard_ref, &item_count); - // now wait for 1/4 second total - do + char *result = NULL; // core expects a malloced C string of uft8 data + for (UInt32 item_index = 1; (item_index <= item_count) && !result; item_index++) { - a = SDL_GetTicks(); - } while (a - b < 250); - - // get the ending cycle count - end = (*cycle_counter)(); - - // compute ticks_per_sec - ticks_per_second = (end - start) * 4; - - // return the current cycle count - return (*cycle_counter)(); -} - -//============================================================ -// performance_cycle_counter -//============================================================ - -//============================================================ -// mach_cycle_counter -//============================================================ -static osd_ticks_t mach_cycle_counter(void) -{ - return mach_absolute_time(); -} - -//============================================================ -// osd_ticks -//============================================================ - -osd_ticks_t osd_ticks(void) -{ - return (*cycle_counter)(); -} - - -//============================================================ -// osd_ticks_per_second -//============================================================ - -osd_ticks_t osd_ticks_per_second(void) -{ - if (ticks_per_second == 0) - { - // if we haven't computed the value yet, there's no time like the present - init_cycle_counter(); + 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); } - return ticks_per_second; -} - - - -//============================================================ -// osd_sleep -//============================================================ - -void osd_sleep(osd_ticks_t duration) -{ - UINT32 msec; - // make sure we've computed ticks_per_second - if (ticks_per_second == 0) - (void)osd_ticks(); + CFRelease(pasteboard_ref); - // convert to milliseconds, rounding down - msec = (UINT32)(duration * 1000 / ticks_per_second); - - // only sleep if at least 2 full milliseconds - if (msec >= 2) - { - // take a couple of msecs off the top for good measure - msec -= 2; - usleep(msec*1000); - } + return result; } |