Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

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. :)
  • Loading branch information
slouken committed Jul 8, 2010
1 parent d8a5b71 commit 3579eb6828cba28f053273f435510700ec271827
Showing with 38 additions and 105 deletions.
  1. +2 −51 include/SDL_clipboard.h
  2. +26 −54 src/video/SDL_clipboard.c
  3. +6 −0 src/video/SDL_sysvideo.h
  4. +4 −0 src/video/SDL_video.c
@@ -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
@@ -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: */
@@ -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 */
@@ -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;
}

0 comments on commit 3579eb6

Please sign in to comment.