|
|
|
@ -1704,10 +1704,6 @@ void _glfwSetClipboardStringWayland(const char* string) |
|
|
|
|
|
|
|
|
|
const char* _glfwGetClipboardStringWayland(void) |
|
|
|
|
{ |
|
|
|
|
int fds[2]; |
|
|
|
|
int ret; |
|
|
|
|
size_t len = 0; |
|
|
|
|
|
|
|
|
|
if (!_glfw.wl.selectionOffer) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_FORMAT_UNAVAILABLE, |
|
|
|
@ -1718,8 +1714,9 @@ const char* _glfwGetClipboardStringWayland(void) |
|
|
|
|
if (_glfw.wl.selectionSource) |
|
|
|
|
return _glfw.wl.clipboardString; |
|
|
|
|
|
|
|
|
|
ret = pipe2(fds, O_CLOEXEC); |
|
|
|
|
if (ret < 0) |
|
|
|
|
int fds[2]; |
|
|
|
|
|
|
|
|
|
if (pipe2(fds, O_CLOEXEC) == -1) |
|
|
|
|
{ |
|
|
|
|
// TODO: also report errno maybe?
|
|
|
|
|
_glfwInputError(GLFW_PLATFORM_ERROR, |
|
|
|
@ -1732,11 +1729,14 @@ const char* _glfwGetClipboardStringWayland(void) |
|
|
|
|
flushDisplay(); |
|
|
|
|
close(fds[1]); |
|
|
|
|
|
|
|
|
|
size_t length = 0; |
|
|
|
|
|
|
|
|
|
for (;;) |
|
|
|
|
{ |
|
|
|
|
// Grow the clipboard if we need to paste something bigger, there is no
|
|
|
|
|
// shrink operation yet.
|
|
|
|
|
const size_t requiredSize = len + 4096 + 1; |
|
|
|
|
const size_t readSize = 4096; |
|
|
|
|
const size_t requiredSize = length + readSize + 1; |
|
|
|
|
if (requiredSize > _glfw.wl.clipboardSize) |
|
|
|
|
{ |
|
|
|
|
char* string = _glfw_realloc(_glfw.wl.clipboardString, requiredSize); |
|
|
|
@ -1753,23 +1753,27 @@ const char* _glfwGetClipboardStringWayland(void) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Then read from the fd to the clipboard, handling all known errors.
|
|
|
|
|
ret = read(fds[0], _glfw.wl.clipboardString + len, 4096); |
|
|
|
|
if (ret == 0) |
|
|
|
|
const ssize_t result = read(fds[0], _glfw.wl.clipboardString + length, readSize); |
|
|
|
|
if (result == 0) |
|
|
|
|
break; |
|
|
|
|
if (ret == -1 && errno == EINTR) |
|
|
|
|
continue; |
|
|
|
|
if (ret == -1) |
|
|
|
|
else if (result == -1) |
|
|
|
|
{ |
|
|
|
|
if (errno == EINTR) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
// TODO: also report errno maybe.
|
|
|
|
|
_glfwInputError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"Wayland: Failed to read from clipboard fd"); |
|
|
|
|
close(fds[0]); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
len += ret; |
|
|
|
|
|
|
|
|
|
length += result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
close(fds[0]); |
|
|
|
|
_glfw.wl.clipboardString[len] = '\0'; |
|
|
|
|
|
|
|
|
|
_glfw.wl.clipboardString[length] = '\0'; |
|
|
|
|
return _glfw.wl.clipboardString; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|