Release v0.6.39: isolate history UI and image clipboard memory

This commit is contained in:
2026-11-04 19:40:54 +02:00
parent fa2f6d2ce4
commit 00c9cb0ee4
22 changed files with 747 additions and 49 deletions
+17 -4
View File
@@ -265,15 +265,27 @@ std::wstring processName(HWND window)
CloseHandle(h);
return ok ? std::filesystem::path(std::wstring(path, n)).stem().wstring() : L"";
}
Clip readClipboard(HWND window, size_t limit)
Clip readClipboard(HWND window, size_t limit, ClipboardRead mode, std::optional<DWORD> expected)
{
ClipboardLock lock(window);
if (expected && *expected != GetClipboardSequenceNumber())
throw std::runtime_error("Clipboard changed while taking snapshot");
if (mode == ClipboardRead::WithoutImages &&
(IsClipboardFormatAvailable(CF_DIB) || IsClipboardFormatAvailable(CF_DIBV5) ||
IsClipboardFormatAvailable(CF_BITMAP) || IsClipboardFormatAvailable(RegisterClipboardFormatW(L"PNG"))))
throw std::runtime_error("Clipboard changed to an image");
Clip c;
size_t total = 0;
for (UINT f = EnumClipboardFormats(0); f; f = EnumClipboardFormats(f))
{
if (!globalFormat(f))
continue;
wchar_t name[256]{};
if (f >= 0xc000) GetClipboardFormatNameW(f, name, 256);
if (mode == ClipboardRead::Selection && f != CF_UNICODETEXT &&
std::wstring_view(name) != L"VisualStudioEditorOperationsLineCutCopyClipboardTag" &&
std::wstring_view(name) != L"MSDEVLineSelect" && std::wstring_view(name) != L"vscode-editor-data")
continue;
HANDLE handle = GetClipboardData(f);
if (!handle)
continue;
@@ -291,8 +303,6 @@ Clip readClipboard(HWND window, size_t limit)
GlobalUnlock(handle);
if (f >= 0xc000)
{
wchar_t name[256]{};
GetClipboardFormatNameW(f, name, 256);
format.name = name;
}
total += size;
@@ -300,7 +310,8 @@ Clip readClipboard(HWND window, size_t limit)
}
return c;
}
DWORD writeClipboard(HWND window, const Clip &c)
DWORD writeClipboard(HWND window, const Clip &c) { return writeClipboardGuarded(window, c, {}); }
DWORD writeClipboardGuarded(HWND window, const Clip &c, std::optional<DWORD> expected)
{
// Allocate all blocks before replacing any existing data.
std::vector<std::pair<UINT, HGLOBAL>> blocks;
@@ -327,6 +338,8 @@ DWORD writeClipboard(HWND window, const Clip &c)
blocks.emplace_back(id, h);
}
ClipboardLock lock(window);
if (expected && *expected != GetClipboardSequenceNumber())
throw std::runtime_error("Clipboard changed before restoring snapshot");
if (!EmptyClipboard())
throw std::runtime_error("Cannot replace clipboard");
for (auto &[id, h] : blocks)