aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2022-12-18 14:15:54 +0100
committerdec05eba <dec05eba@protonmail.com>2022-12-18 14:15:54 +0100
commiteb7bb70749079490da090a5ad01fd4546195378e (patch)
tree1a2b4dc91b43187375697b9e3efc571825c98468
parentff4eb7bb389930e345b0beaadfd97d7a219dc30a (diff)
Revert "Do lazy get clipboard version, get as much data as possible at once. This seems to be the only reliable method and other programs do this"
This reverts commit ff4eb7bb389930e345b0beaadfd97d7a219dc30a.
-rw-r--r--src/window/window.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/src/window/window.c b/src/window/window.c
index df56c94..6927992 100644
--- a/src/window/window.c
+++ b/src/window/window.c
@@ -727,11 +727,6 @@ static void mgl_window_on_receive_event(mgl_window *self, XEvent *xev, mgl_event
return;
}
case SelectionClear: {
- if(self->clipboard_string) {
- free(self->clipboard_string);
- self->clipboard_string = NULL;
- self->clipboard_size = 0;
- }
event->type = MGL_EVENT_UNKNOWN;
return;
}
@@ -1139,14 +1134,23 @@ bool mgl_window_get_clipboard(mgl_window *self, mgl_clipboard_callback callback,
}
} else if(xev.xselection.target == requested_clipboard_type) {
bool got_data = false;
+ long chunk_size = 65536;
+
+ //XDeleteProperty(context->connection, self->window, x11_context->incr_atom);
+ //XFlush(context->connection);
while(mgl_clock_get_elapsed_time_seconds(&timeout_timer) < timeout_seconds) {
+ unsigned long offset = 0;
+
+ /* offset is specified in XGetWindowProperty as a multiple of 32-bit (4 bytes) */
/* TODO: Wait for PropertyNotify event instead */
- while(XGetWindowProperty(context->connection, xev.xselection.requestor, xev.xselection.property, 0, 0x1fffffff, True, PropertyNewValue, &type, &format, &items, &remaining_bytes, &data) == Success) {
+ while(XGetWindowProperty(context->connection, xev.xselection.requestor, xev.xselection.property, offset/4, chunk_size, True, PropertyNewValue, &type, &format, &items, &remaining_bytes, &data) == Success) {
if(mgl_clock_get_elapsed_time_seconds(&timeout_timer) >= timeout_seconds)
break;
if(type == x11_context->incr_atom) {
+ if(data)
+ chunk_size = *(long*)data;
XDeleteProperty(context->connection, self->window, x11_context->incr_atom);
XFlush(context->connection);
XFree(data);
@@ -1176,16 +1180,20 @@ bool mgl_window_get_clipboard(mgl_window *self, mgl_clipboard_callback callback,
}
}
}
+ offset += num_items_bytes;
if(data) {
XFree(data);
data = NULL;
}
- if(got_data && items == 0) {
+ if(got_data && num_items_bytes == 0/* && format == 8*/) {
success = true;
goto done;
}
+
+ if(remaining_bytes == 0)
+ break;
}
}
@@ -1195,10 +1203,8 @@ bool mgl_window_get_clipboard(mgl_window *self, mgl_clipboard_callback callback,
}
done:
- if(requested_clipboard_type) {
+ if(requested_clipboard_type)
XDeleteProperty(context->connection, self->window, requested_clipboard_type);
- XFlush(context->connection);
- }
return success;
}