summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd
diff options
context:
space:
mode:
author npwoods <npwoods@mess.org>2019-09-11 14:16:02 -0400
committer R. Belmont <rb6502@users.noreply.github.com>2019-09-11 14:16:02 -0400
commitbc15184c90a7eaf4cf16ea060916346e390a7c3b (patch)
treebdf475c68602c37cba55338702343f572bbed6ee /src/osd
parent4f8928432a9db8cd46cfd5c6e2cb262eafaed9d2 (diff)
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)
Diffstat (limited to 'src/osd')
-rw-r--r--src/osd/modules/lib/osdlib.h9
-rw-r--r--src/osd/modules/lib/osdlib_macosx.cpp20
-rw-r--r--src/osd/modules/lib/osdlib_unix.cpp11
-rw-r--r--src/osd/modules/lib/osdlib_uwp.cpp19
-rw-r--r--src/osd/modules/lib/osdlib_win32.cpp26
-rw-r--r--src/osd/osdcore.h7
6 files changed, 40 insertions, 52 deletions
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<char *>(malloc(length + 1));
- if (result)
- {
- CFDataGetBytes(data_ref, range, reinterpret_cast<unsigned char *>(result));
- result[length] = 0;
- }
+ result.resize(length);
+ CFDataGetBytes(data_ref, range, reinterpret_cast<unsigned char *>(&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<String^>^ 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);
/***************************************************************************