|
@@ -27,14 +27,7 @@
|
|
|
#include "SDL_events.h"
|
|
|
#include "SDL_x11video.h"
|
|
|
#include "SDL_timer.h"
|
|
|
-
|
|
|
-
|
|
|
-/* If you don't support UTF-8, you might use XA_STRING here */
|
|
|
-#ifdef X_HAVE_UTF8_STRING
|
|
|
-#define TEXT_FORMAT X11_XInternAtom(display, "UTF8_STRING", False)
|
|
|
-#else
|
|
|
-#define TEXT_FORMAT XA_STRING
|
|
|
-#endif
|
|
|
+#include "SDL_x11clipboard.h"
|
|
|
|
|
|
/* Get any application owned window handle for clipboard association */
|
|
|
static Window
|
|
@@ -59,19 +52,77 @@ GetWindow(_THIS)
|
|
|
return data->clipboard_window;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/* We use our own cut-buffer for intermediate storage instead of
|
|
|
XA_CUT_BUFFER0 because their use isn't really defined for holding UTF8. */
|
|
|
Atom
|
|
|
-X11_GetSDLCutBufferClipboardType(Display *display)
|
|
|
+X11_GetSDLCutBufferClipboardType(Display *display, enum ESDLX11ClipboardMimeType mime_type)
|
|
|
{
|
|
|
- return X11_XInternAtom(display, "SDL_CUTBUFFER", False);
|
|
|
+ switch (mime_type) {
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_STRING:
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_TEXT_PLAIN:
|
|
|
+ #ifdef X_HAVE_UTF8_STRING
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_TEXT_PLAIN_UTF8:
|
|
|
+ #endif
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_TEXT:
|
|
|
+ return X11_XInternAtom(display, "SDL_CUTBUFFER", False);
|
|
|
+ default:
|
|
|
+ SDL_SetError("Can't find mime_type.");
|
|
|
+ return XA_STRING;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+Atom
|
|
|
+X11_GetSDLCutBufferClipboardExternalFormat(Display *display, enum ESDLX11ClipboardMimeType mime_type)
|
|
|
+{
|
|
|
+ switch (mime_type) {
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_STRING:
|
|
|
+ /* If you don't support UTF-8, you might use XA_STRING here */
|
|
|
+ #ifdef X_HAVE_UTF8_STRING
|
|
|
+ return X11_XInternAtom(display, "UTF8_STRING", False);
|
|
|
+ #else
|
|
|
+ return XA_STRING;
|
|
|
+ #endif
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_TEXT_PLAIN:
|
|
|
+ return X11_XInternAtom(display, "text/plain", False);
|
|
|
+ #ifdef X_HAVE_UTF8_STRING
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_TEXT_PLAIN_UTF8:
|
|
|
+ return X11_XInternAtom(display, "text/plain;charset=utf-8", False);
|
|
|
+ #endif
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_TEXT:
|
|
|
+ return X11_XInternAtom(display, "TEXT", False);
|
|
|
+ default:
|
|
|
+ SDL_SetError("Can't find mime_type.");
|
|
|
+ return XA_STRING;
|
|
|
+ }
|
|
|
+}
|
|
|
+Atom
|
|
|
+X11_GetSDLCutBufferClipboardInternalFormat(Display *display, enum ESDLX11ClipboardMimeType mime_type)
|
|
|
+{
|
|
|
+ switch (mime_type) {
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_STRING:
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_TEXT_PLAIN:
|
|
|
+ #ifdef X_HAVE_UTF8_STRING
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_TEXT_PLAIN_UTF8:
|
|
|
+ #endif
|
|
|
+ case SDL_X11_CLIPBOARD_MIME_TYPE_TEXT:
|
|
|
+ /* If you don't support UTF-8, you might use XA_STRING here */
|
|
|
+ #ifdef X_HAVE_UTF8_STRING
|
|
|
+ return X11_XInternAtom(display, "UTF8_STRING", False);
|
|
|
+ #else
|
|
|
+ return XA_STRING;
|
|
|
+ #endif
|
|
|
+ default:
|
|
|
+ SDL_SetError("Can't find mime_type.");
|
|
|
+ return XA_STRING;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
int
|
|
|
X11_SetClipboardText(_THIS, const char *text)
|
|
|
{
|
|
|
Display *display = ((SDL_VideoData *) _this->driverdata)->display;
|
|
|
- Atom format;
|
|
|
Window window;
|
|
|
Atom XA_CLIPBOARD = X11_XInternAtom(display, "CLIPBOARD", 0);
|
|
|
|
|
@@ -82,9 +133,8 @@ X11_SetClipboardText(_THIS, const char *text)
|
|
|
}
|
|
|
|
|
|
/* Save the selection on the root window */
|
|
|
- format = TEXT_FORMAT;
|
|
|
X11_XChangeProperty(display, DefaultRootWindow(display),
|
|
|
- X11_GetSDLCutBufferClipboardType(display), format, 8, PropModeReplace,
|
|
|
+ X11_GetSDLCutBufferClipboardType(display, SDL_X11_CLIPBOARD_MIME_TYPE_STRING), X11_GetSDLCutBufferClipboardInternalFormat(display, SDL_X11_CLIPBOARD_MIME_TYPE_STRING), 8, PropModeReplace,
|
|
|
(const unsigned char *)text, SDL_strlen(text));
|
|
|
|
|
|
if (XA_CLIPBOARD != None &&
|
|
@@ -125,7 +175,7 @@ X11_GetClipboardText(_THIS)
|
|
|
|
|
|
/* Get the window that holds the selection */
|
|
|
window = GetWindow(_this);
|
|
|
- format = TEXT_FORMAT;
|
|
|
+ format = X11_GetSDLCutBufferClipboardInternalFormat(display, SDL_X11_CLIPBOARD_MIME_TYPE_STRING);
|
|
|
owner = X11_XGetSelectionOwner(display, XA_CLIPBOARD);
|
|
|
if (owner == None) {
|
|
|
/* Fall back to ancient X10 cut-buffers which do not support UTF8 strings*/
|
|
@@ -134,7 +184,7 @@ X11_GetClipboardText(_THIS)
|
|
|
format = XA_STRING;
|
|
|
} else if (owner == window) {
|
|
|
owner = DefaultRootWindow(display);
|
|
|
- selection = X11_GetSDLCutBufferClipboardType(display);
|
|
|
+ selection = X11_GetSDLCutBufferClipboardType(display, SDL_X11_CLIPBOARD_MIME_TYPE_STRING);
|
|
|
} else {
|
|
|
/* Request that the selection owner copy the data to our window */
|
|
|
owner = window;
|