diff --git a/CMakeLists.txt b/CMakeLists.txt index ae4600d..902bd67 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.24) -project(KSwitcher VERSION 0.6.28 LANGUAGES CXX RC) +project(KSwitcher VERSION 0.6.29 LANGUAGES CXX RC) if(NOT WIN32) message(FATAL_ERROR "KSwitcher uses native Windows APIs") endif() diff --git a/README.md b/README.md index 10a4b2d..69bba91 100644 --- a/README.md +++ b/README.md @@ -321,6 +321,10 @@ existing saved shortcuts are preserved. While KSwitcher runs, this binding opens History controls: Enter to paste, Shift+Enter for plain text, Ctrl+1…9 for quick paste, Ctrl+P to pin/unpin, Delete to delete, Ctrl+O for the full item, Escape to hide. + +**Clear history… / Alt+H** in the history window clears all saved entries after confirmation, +including pinned entries and entries hidden by search. No is the default choice. The current +Windows clipboard and future recording are unchanged. Settings also retains its Clear history action. For an image, **Edit image**, **Ctrl+O**, or **Edit image in screenshot editor** in the context menu opens the original image in the built-in screenshot editor. Annotate it there, then copy the result. Opening the editor leaves the diff --git a/Release/KSwitcher-win-x64.zip b/Release/KSwitcher-win-x64.zip index e142848..33e6313 100644 Binary files a/Release/KSwitcher-win-x64.zip and b/Release/KSwitcher-win-x64.zip differ diff --git a/Release/README.md b/Release/README.md index 0660ff8..23e5433 100644 --- a/Release/README.md +++ b/Release/README.md @@ -1,19 +1,18 @@ # Latest Windows release -## v0.6.28 — 2026-11-02 +## v0.6.29 — 2026-11-02 ## Changes -- Custom automatic replacement pairs and optional dictionary typo correction. Both are off by default; enable Automatic correction and the desired modes in Auto-correction options. Custom pairs take priority; dictionary correction accepts one unambiguous single edit in words of at least four letters. Case, punctuation, exclusions and Undo are preserved. -- First synchronization now merges independent entries immediately. Different values for one setting remain pending as individual conflicts instead of requiring Download/Upload of a whole profile. -- Optional partial sync keeps this PC's layout cycle and direct shortcuts while syncing other settings. Existing server layouts and bindings are preserved, including during explicit Upload. Missing-layout errors identify the language where available and exact layout IDs. -- Disabled synchronization disables dependent controls. Save can persist disabling without connecting; forgetting the saved password remains available. Status messages can be selected, copied and scrolled. -- Selection diagnostics record expected/copied text before and after recovery, clipboard sequences and retries, timing, focus/caret information and context interruptions. Failed verification now includes expected and actual text. Context retains up to 128 events for 30 seconds. +- Added **Clear history… / Alt+H** directly to the Clipboard history window beside Edit image / Open item. +- Clearing requires confirmation, with **No** selected by default. It removes all saved entries, including pinned entries and entries hidden by the current search. Cancelling leaves history unchanged. +- The button follows the existing bottom action row when resizing. Settings retains its existing Clear history action. +- Clearing saved history does not clear the current Windows clipboard or disable future recording. This release does not change memory management. ## Validation -105 sync/protocol/conflict checks and 483 native regression checks and 48 updater checks passed. All 12 manifest files and all three executable versions were verified in the release ZIP. Focused partial-sync UI checks and screenshot PNG-save regressions passed. During development, conversion/diagnostic and typo integration scenarios passed, including Undo and uninterrupted typing. Final interactive input testing is limited by this execution session reporting no foreground window; the full screenshot UI suite also failed its pan assertion at 240 DPI. These interactive checks are not claimed as passing. +The final build passed isolated checks for the new button, cancellation, confirmed deletion of pinned/search-hidden entries and persistence after reloading the history store. 48 updater regression checks passed; all executable versions and release-manifest hashes were verified. The full desktop-interaction suite was not rerun for this focused patch. -## Limitations -Dictionary typo correction is experimental and has no sentence context. Ambiguous words are unchanged. The reported asynchronous selection mismatch in ChatGPT is not fixed by the new diagnostics; full-range verification still cancels unsafe replacements. OpenBao synchronization remains experimental and requires HTTPS, KV v2 and a provisioned userpass account/policy. Ordered layout/language lists are resolved as whole settings; partial mode keeps the entire local layout configuration. Update participating PCs together for the new profile fields. No account registration, MFA, non-root namespaces or reverse-proxy URL prefixes. +## Known limitations +Existing asynchronous-editor selection/clipboard limitations remain; this release does not fix the reported ChatGPT selection mismatch. Dictionary typo correction and OpenBao synchronization remain experimental as documented in v0.6.28. **Upgrade:** choose Update in the tray menu. Legacy v0.3.0–v0.4.1 clients first receive the v0.4.2 compatibility bridge, then the current full release. v0.2.3 and earlier require manual installation. For manual installation, exit KSwitcher, close screenshot editors and extract the entire ZIP into its installation folder. Keep personal `data/` and customized dictionaries. diff --git a/Release/SHA256SUMS.txt b/Release/SHA256SUMS.txt index fd40f9e..ac6adf1 100644 --- a/Release/SHA256SUMS.txt +++ b/Release/SHA256SUMS.txt @@ -1 +1 @@ -c15937f52c981e7c6b15203aae51ae47dd2a261b495bd458533b01fd4cfe5498 KSwitcher-win-x64.zip +c9c3e3579575a41d434201d4f37bf3829e53c1ef23c42cb1c077930dfe8fdfa6 KSwitcher-win-x64.zip diff --git a/resources/app.rc b/resources/app.rc index 98c6539..bd17e1d 100644 --- a/resources/app.rc +++ b/resources/app.rc @@ -9,8 +9,8 @@ IDC_SCREENSHOT_PENCIL CURSOR "icons/lucide/pencil.cur" 1 RT_MANIFEST "app.manifest" 201 RCDATA "update.ps1" 1 VERSIONINFO - FILEVERSION 0,6,28,0 - PRODUCTVERSION 0,6,28,0 + FILEVERSION 0,6,29,0 + PRODUCTVERSION 0,6,29,0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP BEGIN @@ -20,7 +20,7 @@ BEGIN BEGIN VALUE "FileDescription", "KSwitcher — native keyboard and clipboard utility" VALUE "ProductName", "KSwitcher" - VALUE "FileVersion", "0.6.28" + VALUE "FileVersion", "0.6.29" END END BLOCK "VarFileInfo" diff --git a/src/ui.cpp b/src/ui.cpp index fa3575b..2e09815 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -83,7 +83,7 @@ void arrangeWindow(HWND w) { int id = GetDlgCtrlID(child); RECT next{scale(w, r.left) - layout->x, - scale(w, r.top) - layout->y + (id >= 110 && id <= 114 ? extraHeight : 0)}; + scale(w, r.top) - layout->y + ((id >= 110 && id <= 114) || id == 116 ? extraHeight : 0)}; next.right = next.left + scale(w, r.right - r.left) + (id == 101 || id == 102 ? extraWidth : 0); next.bottom = next.top + scale(w, r.bottom - r.top) + (id == 102 ? extraHeight : 0); if (child == layout->stretch) @@ -730,6 +730,13 @@ LRESULT CALLBACK historyProc(HWND w, UINT msg, WPARAM wp, LPARAM lp) } if (id == 102 && HIWORD(wp) == LBN_DBLCLK) id = 110; + if (id == 116) + { + if (MessageBoxW(w, L"Delete all clipboard history, including pinned items? This also deletes items hidden by the current search.", + L"Clear history", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2) == IDYES) + v->app->clearHistory(); + return 0; + } auto entry = selected(w, v); if (id == 110 || id == 111) { @@ -1650,6 +1657,7 @@ void showHistory(App &app, bool visible) button(w, L"P&in / unpin", 112, 222, 452, 110); button(w, L"&Delete", 113, 340, 452, 90); button(w, L"&Open item", 114, 438, 452, 100); + 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); } diff --git a/src/update.h b/src/update.h index 53372a8..bf4e7f2 100644 --- a/src/update.h +++ b/src/update.h @@ -2,7 +2,7 @@ #include "platform.h" namespace ks { -inline constexpr wchar_t AppVersion[] = L"0.6.28"; +inline constexpr wchar_t AppVersion[] = L"0.6.29"; inline constexpr UINT UpdateMessage = WM_APP + 7; inline constexpr UINT UpdateCheckIntervalMs = 6 * 60 * 60 * 1000; inline constexpr UINT UpdateNotificationRetryMs = 5 * 60 * 1000;