From 3579eb6828cba28f053273f435510700ec271827 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 7 Jul 2010 23:54:03 -0700 Subject: [PATCH] Simplified clipboard API for sanity's sake. A complete clipboard implementation would support multiple formats that could be queried at runtime, events for when the clipboard contents changed, support for HTML, images, etc. We're not going that crazy, at least for now. :) --- include/SDL_clipboard.h | 53 +------------------------- src/video/SDL_clipboard.c | 80 +++++++++++++-------------------------- src/video/SDL_sysvideo.h | 6 +++ src/video/SDL_video.c | 4 ++ 4 files changed, 38 insertions(+), 105 deletions(-) diff --git a/include/SDL_clipboard.h b/include/SDL_clipboard.h index 872c465c3..848c21d12 100644 --- a/include/SDL_clipboard.h +++ b/include/SDL_clipboard.h @@ -30,7 +30,6 @@ #define _SDL_clipboard_h #include "SDL_stdinc.h" -#include "SDL_surface.h" #include "begin_code.h" /* Set up for C function definitions, even when using C++ */ @@ -43,14 +42,14 @@ extern "C" { /* Function prototypes */ /** - * \brief Put text into the clipboard + * \brief Put UTF-8 text into the clipboard * * \sa SDL_GetClipboardText() */ extern DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text); /** - * \brief Get text from the clipboard, which must be freed with SDL_free() + * \brief Get UTF-8 text from the clipboard, which must be freed with SDL_free() * * \sa SDL_SetClipboardText() */ @@ -63,54 +62,6 @@ extern DECLSPEC char * SDLCALL SDL_GetClipboardText(); */ extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(); -/** - * \brief Put an image into the clipboard - * - * \sa SDL_GetClipboardImage() - */ -extern DECLSPEC int SDLCALL SDL_SetClipboardImage(SDL_Surface *image); - -/** - * \brief Get image from the clipboard, which must be freed with SDL_FreeSurface() - * - * \sa SDL_SetClipboard() - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_GetClipboardImage(); - -/** - * \brief Returns whether the clipboard has data in the specified format - * - * \sa SDL_GetClipboardImage() - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardImage(); - -/** - * \brief Set the data in the clipboard in the specified format - * - * \sa SDL_GetClipboard() - */ -extern DECLSPEC int SDLCALL SDL_SetClipboard(Uint32 format, void *data, size_t length); - -/** - * \brief Get the data in the clipboard in the specified format, which must be - * freed with SDL_free() - * - * \sa SDL_SetClipboard() - */ -extern DECLSPEC int SDLCALL SDL_GetClipboard(Uint32 format, void **data, size_t *length); - -/** - * \brief Returns whether the clipboard has data in the specified format - * - * \sa SDL_GetClipboard() - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardFormat(Uint32 format); - -/** - * \brief Clear any data out of the clipboard, if possible. - */ -extern DECLSPEC void SDLCALL SDL_ClearClipboard(void); - /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/src/video/SDL_clipboard.c b/src/video/SDL_clipboard.c index fe33216de..e459f6994 100644 --- a/src/video/SDL_clipboard.c +++ b/src/video/SDL_clipboard.c @@ -24,78 +24,50 @@ #include "SDL_clipboard.h" #include "SDL_sysvideo.h" -/* FOURCC values for text and image clipboard formats */ -#define TEXT_DATA SDL_FOURCC('T', 'E', 'X', 'T') -#define IMAGE_DATA SDL_FOURCC('B', 'M', 'P', ' ') int SDL_SetClipboardText(const char *text) { - return SDL_SetClipboard(TEXT_DATA, text, SDL_strlen(text)+1); + SDL_VideoDevice *_this = SDL_GetVideoDevice(); + + if (_this->SetClipboardText) { + return _this->SetClipboardText(_this, text); + } else { + _this->clipboard_text = SDL_strdup(text); + return 0; + } } char * SDL_GetClipboardText() { - void *data; - size_t length; + SDL_VideoDevice *_this = SDL_GetVideoDevice(); - if (SDL_GetClipboard(TEXT_DATA, &data, &length) == 0) { - return SDL_static_cast(char*, data); + if (_this->GetClipboardText) { + return _this->GetClipboardText(_this); } else { - return NULL; + const char *text = _this->clipboard_text; + if (!text) { + text = ""; + } + return SDL_strdup(text); } } SDL_bool SDL_HasClipboardText() { - return SDL_HasClipboardFormat(TEXT_DATA); -} - -int -SDL_SetClipboardImage(SDL_Surface *image) -{ - SDL_Unsupported(); - return -1; -} - -SDL_Surface * -SDL_GetClipboardImage() -{ - SDL_Unsupported(); - return NULL; -} - -SDL_bool -SDL_HasClipboardImage() -{ - return SDL_FALSE; -} - -int -SDL_SetClipboard(Uint32 format, void *data, size_t length) -{ - SDL_Unsupported(); - return -1; -} - -int -SDL_GetClipboard(Uint32 format, void **data, size_t *length) -{ - SDL_Unsupported(); - return -1; -} + SDL_VideoDevice *_this = SDL_GetVideoDevice(); -SDL_bool -SDL_HasClipboardFormat(Uint32 format) -{ - return SDL_FALSE; -} - -void -SDL_ClearClipboard(void) -{ + if (_this->HasClipboardText) { + return _this->HasClipboardText(_this); + } else { + if (_this->clipboard_text) { + return SDL_TRUE; + } else { + return SDL_FALSE; + } + } } /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 0a82717ec..91b2177cb 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -303,6 +303,11 @@ struct SDL_VideoDevice void (*StopTextInput) (_THIS); void (*SetTextInputRect) (_THIS, SDL_Rect *rect); + /* Clipboard */ + int (*SetClipboardText) (_THIS, const char *text); + char * (*GetClipboardText) (_THIS); + SDL_bool (*HasClipboardText) (_THIS); + /* * * */ /* Data common to all drivers */ SDL_bool suspend_screensaver; @@ -312,6 +317,7 @@ struct SDL_VideoDevice Uint8 window_magic; Uint8 texture_magic; Uint32 next_object_id; + char * clipboard_text; /* * * */ /* Data used by the GL drivers */ diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index db8b5d3cb..435f01696 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -2833,6 +2833,10 @@ SDL_VideoQuit(void) SDL_free(_this->displays); _this->displays = NULL; } + if (_this->clipboard_text) { + SDL_free(_this->clipboard_text); + _this->clipboard_text = NULL; + } _this->free(_this); _this = NULL; }