From 83af41000afc41b6e256d0e98c74f6d4d902f879 Mon Sep 17 00:00:00 2001 From: Andreas Schiffler Date: Sat, 29 Oct 2011 23:43:59 -0700 Subject: [PATCH] Update SDL_HasClipboardText functions to return value based on clipboard content; Fix memory leak in fallback SetClipboard implementation --- include/SDL_clipboard.h | 2 +- src/video/SDL_clipboard.c | 5 ++- src/video/bwindow/SDL_bclipboard.cc | 39 ++++++++++-------------- src/video/cocoa/SDL_cocoaclipboard.m | 22 +++---------- src/video/windows/SDL_windowsclipboard.c | 12 +++++--- src/video/x11/SDL_x11clipboard.c | 21 +++++-------- 6 files changed, 41 insertions(+), 60 deletions(-) diff --git a/include/SDL_clipboard.h b/include/SDL_clipboard.h index fa2ee0855..7c60d6373 100644 --- a/include/SDL_clipboard.h +++ b/include/SDL_clipboard.h @@ -55,7 +55,7 @@ extern DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text); extern DECLSPEC char * SDLCALL SDL_GetClipboardText(void); /** - * \brief Returns whether the clipboard has text + * \brief Returns a flag indicating whether the clipboard exists and contains a text string that it non-empty * * \sa SDL_GetClipboardText() */ diff --git a/src/video/SDL_clipboard.c b/src/video/SDL_clipboard.c index fbfcfb9da..3cc233a89 100644 --- a/src/video/SDL_clipboard.c +++ b/src/video/SDL_clipboard.c @@ -35,6 +35,9 @@ SDL_SetClipboardText(const char *text) if (_this->SetClipboardText) { return _this->SetClipboardText(_this, text); } else { + if (_this->clipboard_text) { + SDL_free(_this->clipboard_text); + } _this->clipboard_text = SDL_strdup(text); return 0; } @@ -64,7 +67,7 @@ SDL_HasClipboardText(void) if (_this->HasClipboardText) { return _this->HasClipboardText(_this); } else { - if (_this->clipboard_text) { + if ((_this->clipboard_text) && (SDL_strlen(_this->clipboard_text)>0)) { return SDL_TRUE; } else { return SDL_FALSE; diff --git a/src/video/bwindow/SDL_bclipboard.cc b/src/video/bwindow/SDL_bclipboard.cc index 90914a1fd..a4560827a 100644 --- a/src/video/bwindow/SDL_bclipboard.cc +++ b/src/video/bwindow/SDL_bclipboard.cc @@ -51,8 +51,9 @@ int BE_SetClipboardText(_THIS, const char *text) { char *BE_GetClipboardText(_THIS) { BMessage *clip = NULL; - const char *text; + const char *text = NULL; ssize_t length; + char *result; if(be_clipboard->Lock()) { if((clip = be_clipboard->Data())) { /* Presumably the string of characters is ascii-format */ @@ -60,37 +61,29 @@ char *BE_GetClipboardText(_THIS) { &length); } else { be_clipboard->Unlock(); - return NULL; } be_clipboard->Unlock(); + } + + if (!text) { + result = SDL_strdup(""); } else { - return NULL; + /* Copy the data and pass on to SDL */ + result = (char*)SDL_calloc(1, sizeof(char*)*length); + SDL_strlcpy(result, text, length); } - /* Copy the data and pass on to SDL */ - char *result = (char*)SDL_calloc(1, sizeof(char*)*length); - SDL_strlcpy(result, text, length); - return result; } SDL_bool BE_HasClipboardText(_THIS) { - BMessage *clip = NULL; - const char *text; - ssize_t length; - SDL_bool retval = SDL_FALSE; - - if(be_clipboard->Lock()) { - if((clip = be_clipboard->Data())) { - /* Presumably the string of characters is ascii-format */ - clip->FindData("text/plain", B_MIME_TYPE, (const void**)&text, - &length); - if( text ) retval = SDL_TRUE; - } - be_clipboard->Unlock(); - } - return retval; - + SDL_bool result = SDL_FALSE; + char *text = BE_GetClipboardText(_this); + if (text) { + result = (SDL_strlen(text)>0) ? SDL_TRUE : SDL_FALSE; + SDL_free(text); + } + return result; } #ifdef __cplusplus diff --git a/src/video/cocoa/SDL_cocoaclipboard.m b/src/video/cocoa/SDL_cocoaclipboard.m index 3166708ce..e575f2ca1 100644 --- a/src/video/cocoa/SDL_cocoaclipboard.m +++ b/src/video/cocoa/SDL_cocoaclipboard.m @@ -94,24 +94,12 @@ SDL_bool Cocoa_HasClipboardText(_THIS) { - NSAutoreleasePool *pool; - NSPasteboard *pasteboard; - NSString *format = GetTextFormat(_this); - NSString *available; - SDL_bool result; - - pool = [[NSAutoreleasePool alloc] init]; - - pasteboard = [NSPasteboard generalPasteboard]; - available = [pasteboard availableTypeFromArray: [NSArray arrayWithObject:format]]; - if ([available isEqualToString:format]) { - result = SDL_TRUE; - } else { - result = SDL_FALSE; + SDL_bool result = SDL_FALSE; + char *text = Cocoa_GetClipboardText(_this); + if (text) { + result = (SDL_strlen(text)>0) ? SDL_TRUE : SDL_FALSE; + SDL_free(text); } - - [pool release]; - return result; } diff --git a/src/video/windows/SDL_windowsclipboard.c b/src/video/windows/SDL_windowsclipboard.c index c854b7f6f..12d02281f 100644 --- a/src/video/windows/SDL_windowsclipboard.c +++ b/src/video/windows/SDL_windowsclipboard.c @@ -136,11 +136,13 @@ WIN_GetClipboardText(_THIS) SDL_bool WIN_HasClipboardText(_THIS) { - if (IsClipboardFormatAvailable(TEXT_FORMAT)) { - return SDL_TRUE; - } else { - return SDL_FALSE; - } + SDL_bool result = SDL_FALSE; + char *text = WIN_GetClipboardText(_this); + if (text) { + result = (SDL_strlen(text)>0) ? SDL_TRUE : SDL_FALSE; + SDL_free(text); + } + return result; } void diff --git a/src/video/x11/SDL_x11clipboard.c b/src/video/x11/SDL_x11clipboard.c index e2c8d9ae9..71f7c9390 100644 --- a/src/video/x11/SDL_x11clipboard.c +++ b/src/video/x11/SDL_x11clipboard.c @@ -129,25 +129,20 @@ X11_GetClipboardText(_THIS) if (!text) { text = SDL_strdup(""); } + return text; } SDL_bool X11_HasClipboardText(_THIS) { - /* Not an easy way to tell with X11, as far as I know... */ - char *text; - SDL_bool retval; - - text = X11_GetClipboardText(_this); - if (*text) { - retval = SDL_TRUE; - } else { - retval = SDL_FALSE; - } - SDL_free(text); - - return retval; + SDL_bool result = SDL_FALSE; + char *text = X11_GetClipboardText(_this); + if (text) { + result = (SDL_strlen(text)>0) ? SDL_TRUE : SDL_FALSE; + SDL_free(text); + } + return result; } #endif /* SDL_VIDEO_DRIVER_X11 */