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

This commit is contained in:
agrynco committed 2026-11-04 19:40:54 +02:00
1 parent fa2f6d2ce4
commit 00c9cb0ee4
22 files changed
+747 -49

No files matched your search

+26 -5
View File
@@ -549,11 +549,11 @@ void requestPreview(HWND w, HistoryView *v, const Entry &entry)
auto result = new PreviewResult{generation, id, {}, {}};
try
{
auto clip = app->history->load(id);
if (!active->load()) { delete result; return; }
if (image)
result->pixels = decodeImage(clip, 208, 128);
result->pixels = app->history->thumbnail(id, [active] { return !active->load(); });
else {
auto clip = app->history->load(id);
if (!active->load()) { delete result; return; }
result->text.rtf = richPreview(clip, false);
if (result->text.rtf.empty()) {
result->text.plain = clip.text();
@@ -771,7 +771,10 @@ LRESULT CALLBACK historyProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)
{
if (!entry.empty())
{
if (id == 112)
if (v->app->historyService) {
v->app->remoteHistory(id == 112 ? "pin" : "remove", entry);
v->app->history->reload();
} else if (id == 112)
v->app->history->pin(entry);
else
v->app->history->remove(entry);
@@ -907,6 +910,7 @@ LRESULT CALLBACK historyProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)
v->rememberedSelection = selected(w, v);
int top = (int)SendDlgItemMessageW(w,102,LB_GETTOPINDEX,0,0);
v->rememberedTop = top >= 0 && top < (int)v->items.size() ? v->items[top].id : L"";
v->app->saveHistoryView(v->rememberedSelection, v->rememberedTop, value(w, 101));
KillTimer(w, 1);
v->closed = true;
v->previewActive->store(false);
@@ -918,6 +922,8 @@ LRESULT CALLBACK historyProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)
v->richTexts.clear();
if (v->rich) SetWindowTextW(v->rich, L"");
v->pending.clear();
if (v->app->historyService && !v->app->historyEntryWindows)
PostMessageW(v->app->window, WM_CLOSE, 0, 0);
return 0;
}
case WM_NCDESTROY:
@@ -1681,13 +1687,19 @@ LRESULT CALLBACK snippetProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)
#ifndef KS_CONFIG_APP
LRESULT CALLBACK entryProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)
{
if (msg == WM_NCCREATE)
SetWindowLongPtrW(w, GWLP_USERDATA, (LONG_PTR)((CREATESTRUCTW *)lp)->lpCreateParams);
if (msg == WM_SIZE)
{
MoveWindow(GetDlgItem(w, 1), 10, 10, LOWORD(lp) - 20, HIWORD(lp) - 20, TRUE);
return 0;
}
if (msg == WM_NCDESTROY)
if (msg == WM_NCDESTROY) {
disposeFont(w);
auto *app = (App *)GetWindowLongPtrW(w, GWLP_USERDATA);
if (app && app->historyService && app->historyEntryWindows && !--app->historyEntryWindows &&
!IsWindowVisible(app->historyWindow)) PostMessageW(app->window, WM_CLOSE, 0, 0);
}
return DefWindowProcW(w, msg, wp, lp);
}
#endif
@@ -1695,6 +1707,7 @@ LRESULT CALLBACK entryProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)
#ifndef KS_CONFIG_APP
void refreshHistory(App &app)
{
if (app.isolateHistory) { app.refreshHistoryProcess(); return; }
if (app.historyWindow)
{
auto *v = (HistoryView *)GetWindowLongPtrW(app.historyWindow, GWLP_USERDATA);
@@ -1703,6 +1716,7 @@ void refreshHistory(App &app)
}
void showHistory(App &app, bool visible)
{
if (app.isolateHistory) { if (visible) app.openHistoryProcess(); return; }
if (!app.history)
{
app.report(L"Clipboard history is unavailable. See the log in the data folder.");
@@ -1738,6 +1752,12 @@ void showHistory(App &app, bool visible)
button(w, L"Clear &history…", 116, 546, 452, 150);
SetWindowSubclass(list, historyKey, 1, (DWORD_PTR)w);
SetWindowSubclass(GetDlgItem(w, 101), historyKey, 1, (DWORD_PTR)w);
if (app.historyService) {
auto *v = (HistoryView *)GetWindowLongPtrW(w, GWLP_USERDATA);
v->rememberedSelection = app.historySelection;
v->rememberedTop = app.historyTop;
SetDlgItemTextW(w, 101, app.historyQuery.c_str());
}
}
if (!visible) return;
POINT cursor;
@@ -1894,6 +1914,7 @@ void showEntry(App &app, const std::wstring &id)
}
HWND w = makeWindow(app, L"KSwitcher.Entry", L"Clipboard item", entryProc, 720, 500,
WS_THICKFRAME | WS_MAXIMIZEBOX);
if (app.historyService) ++app.historyEntryWindows;
auto field = edit(w, 1, 10, 10, 700, 480, ES_MULTILINE | ES_READONLY | ES_AUTOVSCROLL | WS_VSCROLL);
SetWindowTextW(field, text.c_str());
showRequestedWindow(w);