[client] clipboard: keep controls responsive during stalls
Some checks failed
build / client (Debug, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / module (push) Has been cancelled
build / host-linux (push) Has been cancelled
build / host-windows-cross (push) Has been cancelled
build / host-windows-native (push) Has been cancelled
build / idd (push) Has been cancelled
build / obs (clang) (push) Has been cancelled
build / obs (gcc) (push) Has been cancelled
build / docs (push) Has been cancelled

Release LGMP stream slots before dispatching clipboard data so an X11
INCR consumer cannot prevent control queue acknowledgements.

Retain one bounded record in client memory while the sink is blocked.
Cancel abandoned X11 transfers after requestor destruction or a finite
progress timeout.
This commit is contained in:
Geoffrey McRae
2026-10-08 09:58:04 +11:00
parent 6214dccf12
commit cdba29f2f6
9 changed files with 336 additions and 113 deletions

View File

@@ -284,6 +284,21 @@ static bool spiceRequest(void * opaque, LG_ClipboardRequest request,
return false;
}
static bool spiceRequestCancel(void * opaque,
LG_ClipboardRequest request, LG_ClipboardCancelReason reason)
{
SpiceClipboard * clipboard = opaque;
(void)reason;
LG_LOCK(clipboard->stateLock);
const bool valid = clipboard->read.pending &&
clipboard->read.request == request;
if (valid)
clipboard->read = (PendingRequest) { 0 };
LG_UNLOCK(clipboard->stateLock);
return valid;
}
static const LG_ClipboardOps l_clipboardOps =
{
.name = "SPICE",
@@ -294,6 +309,7 @@ static const LG_ClipboardOps l_clipboardOps =
.notifyTypes = spiceNotifyTypes,
.data = spiceData,
.request = spiceRequest,
.requestCancel = spiceRequestCancel,
};
bool spiceClipboard_init(SpiceClipboard ** clipboard)