diff --git a/src/x11_clipboard.c b/src/x11_clipboard.c index ab2a5c1d..c46b0dd1 100644 --- a/src/x11_clipboard.c +++ b/src/x11_clipboard.c @@ -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);