mirror of
https://github.com/yawut/SDL.git
synced 2026-06-03 06:35:10 -05:00
Update SDL_HasClipboardText functions to return value based on clipboard content; Fix memory leak in fallback SetClipboard implementation
This commit is contained in:
parent
71caea56e8
commit
bc907fee45
|
|
@ -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()
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Copy the data and pass on to SDL */
|
||||
char *result = (char*)SDL_calloc(1, sizeof(char*)*length);
|
||||
SDL_strlcpy(result, text, length);
|
||||
if (!text) {
|
||||
result = SDL_strdup("");
|
||||
} else {
|
||||
/* Copy the data and pass on to SDL */
|
||||
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
|
||||
|
|
|
|||
|
|
@ -94,24 +94,12 @@ Cocoa_GetClipboardText(_THIS)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user