|
|
|
@ -47,31 +47,33 @@ |
|
|
|
|
|
|
|
|
|
Atom _glfwSelectionRequest(XSelectionRequestEvent* request) |
|
|
|
|
{ |
|
|
|
|
Atom* atoms = _glfwLibrary.X11.selection.atoms.string; |
|
|
|
|
Atom* formats = _glfwLibrary.X11.selection.atoms.string; |
|
|
|
|
char* target = _glfwLibrary.X11.selection.clipboard.string; |
|
|
|
|
|
|
|
|
|
if (request->target == XA_STRING) |
|
|
|
|
{ |
|
|
|
|
// TODO: ISO Latin-1 specific characters don't get converted
|
|
|
|
|
// (yet). For cleanliness, would we need something like iconv?
|
|
|
|
|
XChangeProperty(_glfwLibrary.X11.display, |
|
|
|
|
request->requestor, |
|
|
|
|
request->target, |
|
|
|
|
request->target, |
|
|
|
|
8, |
|
|
|
|
PropModeReplace, |
|
|
|
|
(unsigned char*) _glfwLibrary.X11.selection.clipboard.string, |
|
|
|
|
8); |
|
|
|
|
request->requestor, |
|
|
|
|
request->target, |
|
|
|
|
request->target, |
|
|
|
|
8, |
|
|
|
|
PropModeReplace, |
|
|
|
|
(unsigned char*) target, |
|
|
|
|
8); |
|
|
|
|
} |
|
|
|
|
else if (request->target == atoms[_GLFW_STRING_ATOM_COMPOUND] || |
|
|
|
|
request->target == atoms[_GLFW_STRING_ATOM_UTF8]) |
|
|
|
|
else if (request->target == formats[_GLFW_STRING_ATOM_COMPOUND] || |
|
|
|
|
request->target == formats[_GLFW_STRING_ATOM_UTF8]) |
|
|
|
|
{ |
|
|
|
|
XChangeProperty(_glfwLibrary.X11.display, |
|
|
|
|
request->requestor, |
|
|
|
|
request->target, |
|
|
|
|
request->target, |
|
|
|
|
8, |
|
|
|
|
PropModeReplace, |
|
|
|
|
(unsigned char*) _glfwLibrary.X11.selection.clipboard.string, |
|
|
|
|
_glfwLibrary.X11.selection.clipboard.stringlen); |
|
|
|
|
request->requestor, |
|
|
|
|
request->target, |
|
|
|
|
request->target, |
|
|
|
|
8, |
|
|
|
|
PropModeReplace, |
|
|
|
|
(unsigned char*) target, |
|
|
|
|
_glfwLibrary.X11.selection.clipboard.stringlen); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
@ -91,14 +93,14 @@ Atom _glfwSelectionRequest(XSelectionRequestEvent* request) |
|
|
|
|
// Set the clipboard contents
|
|
|
|
|
//========================================================================
|
|
|
|
|
|
|
|
|
|
void _glfwPlatformSetClipboardData(void *data, size_t size, int format) |
|
|
|
|
void _glfwPlatformSetClipboardData(void* data, size_t size, int format) |
|
|
|
|
{ |
|
|
|
|
switch (format) |
|
|
|
|
{ |
|
|
|
|
case GLFW_CLIPBOARD_FORMAT_STRING: |
|
|
|
|
{ |
|
|
|
|
// Allocate memory to keep track of the clipboard
|
|
|
|
|
char *cb = malloc(size+1); |
|
|
|
|
char* cb = malloc(size + 1); |
|
|
|
|
|
|
|
|
|
// Copy the clipboard data
|
|
|
|
|
memcpy(cb, data, size); |
|
|
|
@ -135,10 +137,10 @@ void _glfwPlatformSetClipboardData(void *data, size_t size, int format) |
|
|
|
|
// Return the current clipboard contents
|
|
|
|
|
//========================================================================
|
|
|
|
|
|
|
|
|
|
size_t _glfwPlatformGetClipboardData(void *data, size_t size, int format) |
|
|
|
|
size_t _glfwPlatformGetClipboardData(void* data, size_t size, int format) |
|
|
|
|
{ |
|
|
|
|
size_t len, rembytes, dummy; |
|
|
|
|
unsigned char *d; |
|
|
|
|
unsigned char* d; |
|
|
|
|
int fmt; |
|
|
|
|
Atom type; |
|
|
|
|
|
|
|
|
@ -158,7 +160,7 @@ size_t _glfwPlatformGetClipboardData(void *data, size_t size, int format) |
|
|
|
|
// Convert the selection into a format we would like.
|
|
|
|
|
XConvertSelection(_glfwLibrary.X11.display, |
|
|
|
|
_glfwLibrary.X11.selection.atom, |
|
|
|
|
*xfmt, None, window, CurrentTime); |
|
|
|
|
*xfmt, None, window, CurrentTime); |
|
|
|
|
XFlush(_glfwLibrary.X11.display); |
|
|
|
|
|
|
|
|
|
// Process pending events until we get a SelectionNotify.
|
|
|
|
@ -200,20 +202,31 @@ size_t _glfwPlatformGetClipboardData(void *data, size_t size, int format) |
|
|
|
|
// The number of bytes remaining (which is all of them)
|
|
|
|
|
if (rembytes > 0) |
|
|
|
|
{ |
|
|
|
|
int result = XGetWindowProperty(_glfwLibrary.X11.display, window, |
|
|
|
|
*xfmt, 0, rembytes, 0, |
|
|
|
|
AnyPropertyType, &type, &fmt, |
|
|
|
|
&len, &dummy, &d); |
|
|
|
|
int result = XGetWindowProperty(_glfwLibrary.X11.display, |
|
|
|
|
window, |
|
|
|
|
*xfmt, |
|
|
|
|
0, rembytes, |
|
|
|
|
0, |
|
|
|
|
AnyPropertyType, |
|
|
|
|
&type, |
|
|
|
|
&fmt, |
|
|
|
|
&len, &dummy, |
|
|
|
|
&d); |
|
|
|
|
if (result == Success) |
|
|
|
|
{ |
|
|
|
|
size_t s = size - 1 > rembytes ? rembytes : size - 1; |
|
|
|
|
size_t s; |
|
|
|
|
|
|
|
|
|
if (rembytes < size - 1) |
|
|
|
|
s = rembytes; |
|
|
|
|
else |
|
|
|
|
s = size - 1; |
|
|
|
|
|
|
|
|
|
// Copy the data out.
|
|
|
|
|
memcpy(data, d, s); |
|
|
|
|
|
|
|
|
|
// Null-terminate strings.
|
|
|
|
|
if (format == GLFW_CLIPBOARD_FORMAT_STRING) |
|
|
|
|
((char *)data)[s] = '\0'; |
|
|
|
|
((char*) data)[s] = '\0'; |
|
|
|
|
|
|
|
|
|
// Free the data allocated using X11.
|
|
|
|
|
XFree(d); |
|
|
|
|