From f44570f039279e7ddaeb0957047cfdd44e19aa70 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Thu, 1 Oct 2026 18:37:01 +1000 Subject: [PATCH] [client] network: restore clipboard after reconnect --- client/transports/Network/clipboard.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/client/transports/Network/clipboard.c b/client/transports/Network/clipboard.c index d3b9c27e..0e19f0ef 100644 --- a/client/transports/Network/clipboard.c +++ b/client/transports/Network/clipboard.c @@ -4022,7 +4022,7 @@ static void networkClipboardDispatchDisconnected( struct NetworkFileTransfer * fileReads, struct NetworkFileTransfer * fileWrites, struct NetworkFileAcquisition * acquisitions, - bool release) + bool release, bool clearAttachment) { LG_LOCK(clipboard->eventLock); LG_LOCK(clipboard->stateLock); @@ -4061,6 +4061,16 @@ static void networkClipboardDispatchDisconnected( if (release && events->release) events->release(opaque); } + + if (clearAttachment) + { + LG_LOCK(clipboard->stateLock); + clipboard->events = NULL; + clipboard->eventOpaque = NULL; + clipboard->attached = false; + clipboard->localOffer = (struct NetworkLocalOffer) { 0 }; + LG_UNLOCK(clipboard->stateLock); + } LG_UNLOCK(clipboard->eventLock); } @@ -4163,7 +4173,9 @@ void networkClipboardConnectionState(NetworkClipboard * clipboard, struct NetworkFileAcquisition * acquisitions = clipboard->fileAcquisitions; - const bool release = clipboard->remoteOffer.published; + + const bool release = clipboard->remoteOffer.published; + const bool clearAttachment = !clipboardService && clipboard->attached; clipboard->clipboardReads = NULL; clipboard->clipboardWrites = NULL; @@ -4185,20 +4197,23 @@ void networkClipboardConnectionState(NetworkClipboard * clipboard, networkClipboardClearSendNL(clipboard); networkClipboardClearInboundNL(clipboard); networkClipboardRemoteOfferResetNL(clipboard); - networkClipboardSetAvailableNL(clipboard, clipboardService); - if (clipboardService && clipboard->attached) - networkClipboardQueueClaimNL(clipboard); LG_UNLOCK(clipboard->stateLock); networkClipboardDispatchDisconnected(clipboard, clipboardReads, clipboardWrites, fileReads, fileWrites, - acquisitions, release); + acquisitions, release, clearAttachment); networkClipboardTransfersFree(clipboardReads); networkClipboardTransfersFree(clipboardWrites); networkClipboardFileTransfersFree(fileReads); networkClipboardFileTransfersFree(fileWrites); networkClipboardAcquisitionsFree(acquisitions); + LG_LOCK(clipboard->stateLock); + networkClipboardSetAvailableNL(clipboard, clipboardService); + if (clipboardService && clipboard->attached) + networkClipboardQueueClaimNL(clipboard); + LG_UNLOCK(clipboard->stateLock); + networkClipboardProcess(clipboard); }