From 437e19c13bb78867625fef4a70b844e2f64e2093 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Thu, 1 Oct 2026 08:26:40 +1000 Subject: [PATCH] [client] network: defer clipboard offers until claimed --- client/transports/Network/clipboard.c | 36 +++++++++++++++++++-------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/client/transports/Network/clipboard.c b/client/transports/Network/clipboard.c index 8214037e..d3b9c27e 100644 --- a/client/transports/Network/clipboard.c +++ b/client/transports/Network/clipboard.c @@ -1108,7 +1108,7 @@ static bool networkClipboardQueueLocalOfferNL( NetworkClipboard * clipboard) { if (!clipboard->localOffer.offerID || !clipboard->localOffer.count || - (!clipboard->claimPending && !clipboard->claimed)) + !clipboard->claimed) return false; struct NetworkClipboardBatch batch = { 0 }; @@ -2982,12 +2982,22 @@ static bool networkClipboardRelease(void * opaque) NetworkClipboard * clipboard = opaque; LG_LOCK(clipboard->stateLock); - if ((!clipboard->claimPending && !clipboard->claimed) || - !clipboard->localOffer.offerID) + if (!clipboard->claimPending && !clipboard->claimed) { LG_UNLOCK(clipboard->stateLock); return false; } + if (!clipboard->localOffer.offerID) + { + LG_UNLOCK(clipboard->stateLock); + return true; + } + if (clipboard->claimPending) + { + clipboard->localOffer = (struct NetworkLocalOffer) { 0 }; + LG_UNLOCK(clipboard->stateLock); + return true; + } const uint64_t offerID = clipboard->localOffer.offerID; const bool queued = networkClipboardQueueControlNL(clipboard, @@ -3044,14 +3054,16 @@ static bool networkClipboardNotifyTypes(void * opaque, clipboard->localOffer.indices[types[index]] = index; } - const bool queued = networkClipboardQueueLocalOfferNL(clipboard); - if (!queued) + const bool deferred = clipboard->claimPending; + const bool accepted = deferred || + networkClipboardQueueLocalOfferNL(clipboard); + if (!accepted) clipboard->localOffer = previous; LG_UNLOCK(clipboard->stateLock); - if (queued) + if (accepted && !deferred) networkClipboardFlushQueued(clipboard); - return queued; + return accepted; } static bool networkClipboardOfferFiles(void * opaque, uint64_t dataset) @@ -3082,14 +3094,16 @@ static bool networkClipboardOfferFiles(void * opaque, uint64_t dataset) clipboard->localOffer.indices[LG_CLIPBOARD_DATA_FILES] = 0; clipboard->localOffer.files = true; - const bool queued = networkClipboardQueueLocalOfferNL(clipboard); - if (!queued) + const bool deferred = clipboard->claimPending; + const bool accepted = deferred || + networkClipboardQueueLocalOfferNL(clipboard); + if (!accepted) clipboard->localOffer = previous; LG_UNLOCK(clipboard->stateLock); - if (queued) + if (accepted && !deferred) networkClipboardFlushQueued(clipboard); - return queued; + return accepted; } static LG_ClipboardResult networkClipboardDataBegin(void * opaque,