From a475de6cedc93f62c0027a0090af0d4d881effd0 Mon Sep 17 00:00:00 2001 From: Lemmy Date: Thu, 7 May 2026 21:08:32 -0400 Subject: [PATCH] fix(clipboard): unload payload --- src/shell/clipboard/clipboard_panel.cpp | 7 +++++++ src/wayland/clipboard_service.cpp | 19 +++++++++++++++++++ src/wayland/clipboard_service.h | 2 ++ 3 files changed, 28 insertions(+) diff --git a/src/shell/clipboard/clipboard_panel.cpp b/src/shell/clipboard/clipboard_panel.cpp index c1d051ebb..54d5eda11 100644 --- a/src/shell/clipboard/clipboard_panel.cpp +++ b/src/shell/clipboard/clipboard_panel.cpp @@ -716,6 +716,10 @@ void ClipboardPanel::onClose() { m_lastHeight = 0.0f; m_pendingScrollToSelected = false; m_thumbnailRefreshPending = false; + + if (m_clipboard != nullptr) { + m_clipboard->evictAllPayloads(); + } } InputArea* ClipboardPanel::initialFocusArea() const { @@ -821,6 +825,9 @@ void ClipboardPanel::rebuildPreview(Renderer& renderer, float width, float heigh } if (m_clipboard != nullptr) { + if (m_previewPayloadIndex != static_cast(-1) && m_previewPayloadIndex != historyIndex) { + m_clipboard->evictEntryPayload(m_previewPayloadIndex); + } (void)m_clipboard->ensureEntryLoaded(historyIndex); } const auto& loadedEntry = m_clipboard != nullptr ? m_clipboard->history()[historyIndex] : entry; diff --git a/src/wayland/clipboard_service.cpp b/src/wayland/clipboard_service.cpp index 8a217471c..13a9deaf3 100644 --- a/src/wayland/clipboard_service.cpp +++ b/src/wayland/clipboard_service.cpp @@ -405,6 +405,25 @@ bool ClipboardService::ensureEntryLoaded(std::size_t index) { return loadEntryPayload(m_history[index]); } +void ClipboardService::evictEntryPayload(std::size_t index) { + if (index >= m_history.size()) { + return; + } + auto& entry = m_history[index]; + if (entry.data.empty() || entry.payloadPath.empty()) { + return; + } + entry.data.clear(); + entry.data.shrink_to_fit(); + entry.payloadLoaded = false; +} + +void ClipboardService::evictAllPayloads() { + for (std::size_t i = 0; i < m_history.size(); ++i) { + evictEntryPayload(i); + } +} + bool ClipboardService::copyText(std::string text) { std::vector data(text.begin(), text.end()); return copyData({"text/plain;charset=utf-8", "text/plain"}, std::move(data)); diff --git a/src/wayland/clipboard_service.h b/src/wayland/clipboard_service.h index 503b75407..83e8d65de 100644 --- a/src/wayland/clipboard_service.h +++ b/src/wayland/clipboard_service.h @@ -73,6 +73,8 @@ public: [[nodiscard]] std::size_t addPollFds(std::vector& fds) const; bool ensureEntryLoaded(std::size_t index); + void evictEntryPayload(std::size_t index); + void evictAllPayloads(); bool copyText(std::string text); bool copyEntry(const ClipboardEntry& entry); bool promoteEntry(std::size_t index);