From bc15184c90a7eaf4cf16ea060916346e390a7c3b Mon Sep 17 00:00:00 2001 From: npwoods Date: Wed, 11 Sep 2019 14:16:02 -0400 Subject: Changed osd_get_clipboard_text() to return std::string (#5615) * Changed osd_get_clipboard_text() to return std::string This change has only been tested on Windows. The Un*x/Mac versions were made blindly; they might not even build. This needs to be checked prior to merging. * Fixing Mac OS X build (hopefully) --- src/emu/natkeyboard.cpp | 13 +++---------- src/frontend/mame/ui/ui.cpp | 11 ++--------- src/osd/modules/lib/osdlib.h | 9 ++------- src/osd/modules/lib/osdlib_macosx.cpp | 20 +++++++++----------- src/osd/modules/lib/osdlib_unix.cpp | 11 +++++------ src/osd/modules/lib/osdlib_uwp.cpp | 19 +++++++++++-------- src/osd/modules/lib/osdlib_win32.cpp | 26 ++++++++++++-------------- src/osd/osdcore.h | 7 +------ 8 files changed, 45 insertions(+), 71 deletions(-) diff --git a/src/emu/natkeyboard.cpp b/src/emu/natkeyboard.cpp index 17782815d22..c3c05f0e9fb 100644 --- a/src/emu/natkeyboard.cpp +++ b/src/emu/natkeyboard.cpp @@ -585,17 +585,10 @@ void natural_keyboard::post_coded(const std::string &text, const attotime &rate) void natural_keyboard::paste() { // retrieve the clipboard text - char *text = osd_get_clipboard_text(); + std::string text = osd_get_clipboard_text(); - // was a result returned? - if (text != nullptr) - { - // post the text - post_utf8(text); - - // free the string - free(text); - } + // post the text + post_utf8(text); } diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index 4269e674f84..27987bbc9c9 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -917,15 +917,8 @@ void mame_ui_manager::decrease_frameskip() bool mame_ui_manager::can_paste() { - // retrieve the clipboard text - char *text = osd_get_clipboard_text(); - - // free the string if allocated - if (text != nullptr) - free(text); - - // did we have text? - return text != nullptr; + // check to see if the clipboard is not empty + return !osd_get_clipboard_text().empty(); } diff --git a/src/osd/modules/lib/osdlib.h b/src/osd/modules/lib/osdlib.h index d080d1edd85..d126ed7f2ce 100644 --- a/src/osd/modules/lib/osdlib.h +++ b/src/osd/modules/lib/osdlib.h @@ -54,14 +54,9 @@ int osd_setenv(const char *name, const char *value, int overwrite); /*----------------------------------------------------------------------------- - osd_get_clipboard_text: retrieves text from the clipboard - - Return value: - - the returned string needs to be free-ed! + osd_get_clipboard_text: retrieves text from the clipboard -----------------------------------------------------------------------------*/ - -char *osd_get_clipboard_text(void); +std::string osd_get_clipboard_text(void); /*----------------------------------------------------------------------------- dynamic_module: load functions from optional shared libraries diff --git a/src/osd/modules/lib/osdlib_macosx.cpp b/src/osd/modules/lib/osdlib_macosx.cpp index b476261df41..372293ec1a3 100644 --- a/src/osd/modules/lib/osdlib_macosx.cpp +++ b/src/osd/modules/lib/osdlib_macosx.cpp @@ -116,22 +116,23 @@ void osd_break_into_debugger(const char *message) // osd_get_clipboard_text //============================================================ -char *osd_get_clipboard_text(void) +std::string osd_get_clipboard_text(void) { + std::string result; + bool has_result = false; OSStatus err; PasteboardRef pasteboard_ref; err = PasteboardCreate(kPasteboardClipboard, &pasteboard_ref); if (err) - return nullptr; + return result; PasteboardSynchronize(pasteboard_ref); ItemCount item_count; err = PasteboardGetItemCount(pasteboard_ref, &item_count); - char *result = nullptr; // core expects a malloced C string of uft8 data - for (UInt32 item_index = 1; (item_index <= item_count) && !result; item_index++) + for (UInt32 item_index = 1; (item_index <= item_count) && !has_result; item_index++) { PasteboardItemID item_id; err = PasteboardGetItemIdentifier(pasteboard_ref, item_index, &item_id); @@ -144,7 +145,7 @@ char *osd_get_clipboard_text(void) continue; CFIndex const flavor_count = CFArrayGetCount(flavor_type_array); - for (CFIndex flavor_index = 0; (flavor_index < flavor_count) && !result; flavor_index++) + for (CFIndex flavor_index = 0; (flavor_index < flavor_count) && !has_result; flavor_index++) { CFStringRef const flavor_type = (CFStringRef)CFArrayGetValueAtIndex(flavor_type_array, flavor_index); @@ -171,12 +172,9 @@ char *osd_get_clipboard_text(void) CFIndex const length = CFDataGetLength(data_ref); CFRange const range = CFRangeMake(0, length); - result = reinterpret_cast(malloc(length + 1)); - if (result) - { - CFDataGetBytes(data_ref, range, reinterpret_cast(result)); - result[length] = 0; - } + result.resize(length); + CFDataGetBytes(data_ref, range, reinterpret_cast(&result[0])); + has_result = true; CFRelease(data_ref); } diff --git a/src/osd/modules/lib/osdlib_unix.cpp b/src/osd/modules/lib/osdlib_unix.cpp index ba3eec9662c..178fb4594cb 100644 --- a/src/osd/modules/lib/osdlib_unix.cpp +++ b/src/osd/modules/lib/osdlib_unix.cpp @@ -100,24 +100,23 @@ void osd_break_into_debugger(const char *message) } #ifdef SDLMAME_ANDROID -char *osd_get_clipboard_text(void) +std::string osd_get_clipboard_text(void) { - return nullptr; + return std::string(); } #else //============================================================ // osd_get_clipboard_text //============================================================ -char *osd_get_clipboard_text(void) +std::string osd_get_clipboard_text(void) { - char *result = nullptr; + std::string result; if (SDL_HasClipboardText()) { char *temp = SDL_GetClipboardText(); - result = (char *) malloc(strlen(temp) + 1); - strcpy(result, temp); + result.assign(temp); SDL_free(temp); } return result; diff --git a/src/osd/modules/lib/osdlib_uwp.cpp b/src/osd/modules/lib/osdlib_uwp.cpp index 7bfb594f9c7..8d20c552cab 100644 --- a/src/osd/modules/lib/osdlib_uwp.cpp +++ b/src/osd/modules/lib/osdlib_uwp.cpp @@ -129,7 +129,7 @@ void osd_break_into_debugger(const char *message) // get_clipboard_text_by_format //============================================================ -static char *get_clipboard_text_by_format(UINT format, std::string (*convert)(LPCVOID data)) +static bool get_clipboard_text_by_format(std::string &result_text, UINT format, std::string (*convert)(LPCVOID data)) { DataPackageView^ dataPackageView; IAsyncOperation^ getTextOp; @@ -139,7 +139,8 @@ static char *get_clipboard_text_by_format(UINT format, std::string (*convert)(LP getTextOp = dataPackageView->GetTextAsync(); clipboardText = getTextOp->GetResults(); - return (char *)convert(clipboardText->Data()).c_str(); + result_text = convert(clipboardText->Data()); + return !result_text.empty(); } //============================================================ @@ -164,14 +165,16 @@ static std::string convert_ansi(LPCVOID data) // osd_get_clipboard_text //============================================================ -char *osd_get_clipboard_text(void) +std::string osd_get_clipboard_text(void) { - // try to access unicode text - char *result = get_clipboard_text_by_format(CF_UNICODETEXT, convert_wide); + std::string result; - // try to access ANSI text - if (result == nullptr) - result = get_clipboard_text_by_format(CF_TEXT, convert_ansi); + // try to access unicode text + if (!get_clipboard_text_by_format(result, CF_UNICODETEXT, convert_wide)) + { + // try to access ANSI text + get_clipboard_text_by_format(result, CF_TEXT, convert_ansi); + } return result; } diff --git a/src/osd/modules/lib/osdlib_win32.cpp b/src/osd/modules/lib/osdlib_win32.cpp index fb4b29e62af..911f95c3bfe 100644 --- a/src/osd/modules/lib/osdlib_win32.cpp +++ b/src/osd/modules/lib/osdlib_win32.cpp @@ -134,9 +134,9 @@ void osd_break_into_debugger(const char *message) // get_clipboard_text_by_format //============================================================ -static char *get_clipboard_text_by_format(UINT format, std::string (*convert)(LPCVOID data)) +static bool get_clipboard_text_by_format(std::string &result_text, UINT format, std::string (*convert)(LPCVOID data)) { - char *result = nullptr; + bool result = false; HANDLE data_handle; LPVOID data; @@ -155,12 +155,8 @@ static char *get_clipboard_text_by_format(UINT format, std::string (*convert)(LP if (data != nullptr) { // invoke the convert - std::string s = (*convert)(data); - - // copy the string - result = (char *) malloc(s.size() + 1); - if (result != nullptr) - memcpy(result, s.data(), (s.size() + 1) * sizeof(*result)); + result_text = (*convert)(data); + result = true; // unlock the data GlobalUnlock(data_handle); @@ -196,14 +192,16 @@ static std::string convert_ansi(LPCVOID data) // osd_get_clipboard_text //============================================================ -char *osd_get_clipboard_text(void) +std::string osd_get_clipboard_text(void) { - // try to access unicode text - char *result = get_clipboard_text_by_format(CF_UNICODETEXT, convert_wide); + std::string result; - // try to access ANSI text - if (result == nullptr) - result = get_clipboard_text_by_format(CF_TEXT, convert_ansi); + // try to access unicode text + if (!get_clipboard_text_by_format(result, CF_UNICODETEXT, convert_wide)) + { + // try to access ANSI text + get_clipboard_text_by_format(result, CF_TEXT, convert_ansi); + } return result; } diff --git a/src/osd/osdcore.h b/src/osd/osdcore.h index d64ca04c578..22179f9da45 100644 --- a/src/osd/osdcore.h +++ b/src/osd/osdcore.h @@ -752,13 +752,8 @@ void osd_break_into_debugger(const char *message); /*----------------------------------------------------------------------------- osd_get_clipboard_text: retrieves text from the clipboard - - Return value: - - the returned string needs to be osd_free()-ed! - -----------------------------------------------------------------------------*/ -char *osd_get_clipboard_text(void); +std::string osd_get_clipboard_text(void); /*************************************************************************** -- cgit v1.2.3