diff --git a/CMakeLists.txt b/CMakeLists.txt index 91e8de5..bf3dfe7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.24) -project(KSwitcher VERSION 0.2.2 LANGUAGES CXX RC) +project(KSwitcher VERSION 0.2.3 LANGUAGES CXX RC) if(NOT WIN32) message(FATAL_ERROR "KSwitcher uses native Windows APIs") endif() diff --git a/README.md b/README.md index 13f3f2a..4b17c8e 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ only bounded previews/metadata stay in memory. Image data is loaded on demand an the history popup is hidden. Settings **Write log** (`writeLog`, enabled by default) controls all log writes. Disabling it also clears diagnostic context from memory; existing log files remain. Successful operations stay in a memory buffer of at most 40 diagnostic events for 30 seconds. -Only failures or suspected repeated commands flush this context to `kswitcher.log`; flushed +Only failures flush this context to `kswitcher.log`; flushed context is discarded. Ordinary application errors are also logged when logging is enabled. Incident context contains tracked physical input, the expected word, copied text, conversion result, and layout IDs, correlated by request ID even when verification fails. Text fields use quoted, @@ -121,8 +121,8 @@ original length and a truncation flag; each field is limited to 512 UTF-16 code Manual conversion attempts in `kswitcher.log` have request IDs and explicit outcomes, including busy, empty copy, verification mismatch, unchanged conversion, and cancelled paste. Requests record the process, window, input version, and repeated attempts within ten seconds without new -input. A second repeated manual command triggers a suspicion, not proof of failure; intentional -layout cycling can also trigger it. An unchanged result containing no letters, or a direct command +input. Successful repeated commands do not flush the log; intentional layout cycling is normal. +An unchanged result containing no letters, or a direct command to the detected current layout, is treated as expected. `paste-sent-unverified` means Windows accepted the paste shortcut; it does not prove that the editor applied the replacement. The previous 256 KiB log is retained as `kswitcher.log.1` when the current log rotates. diff --git a/Release/KSwitcher-win-x64.zip b/Release/KSwitcher-win-x64.zip index 55b1872..8d1cead 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 6cd0c83..e6b0d76 100644 --- a/Release/README.md +++ b/Release/README.md @@ -1,13 +1,11 @@ # Latest Windows release -## v0.2.2 — 2026-10-28 +## v0.2.3 — 2026-10-28 -- Fix the garbled dash in the executable description shown by Task Manager and Windows file properties. -- Explicitly compile the UTF-8 Windows resource source as UTF-8, both in the resource file and the portable build command. -- Add regression checks against the compiled executable's version and exact Unicode description. +- Fix overlapping Settings controls that obscured the Next layout and Change case labels. +- Stop treating successful repeated conversions as diagnostic incidents. Failed operations still flush their diagnostic context to the log. Verified: 168 native checks, 51 input/layout checks, and 26 updater/metadata checks. -The executable description is `KSwitcher — native keyboard and clipboard utility`. Download **KSwitcher-win-x64.zip**, extract the entire archive to a writable folder, and launch `KSwitcher.exe`. Keep `dictionaries/` next to the executable. diff --git a/Release/SHA256SUMS.txt b/Release/SHA256SUMS.txt index a63b8d1..9f2e98b 100644 --- a/Release/SHA256SUMS.txt +++ b/Release/SHA256SUMS.txt @@ -1 +1 @@ -9705cdb0c0a732eeae10b88e42101f9ff6714399ea8779e154fecc79269059a0 KSwitcher-win-x64.zip +ef3f21574f02edeb63661109056480506041372f1fa4ed40b07cdd2f544d79b5 KSwitcher-win-x64.zip diff --git a/resources/app.rc b/resources/app.rc index 8f61155..66485dd 100644 --- a/resources/app.rc +++ b/resources/app.rc @@ -5,8 +5,8 @@ IDI_KSWITCHER ICON "kswitcher.ico" 1 RT_MANIFEST "app.manifest" 201 RCDATA "update.ps1" 1 VERSIONINFO - FILEVERSION 0,2,2,0 - PRODUCTVERSION 0,2,2,0 + FILEVERSION 0,2,3,0 + PRODUCTVERSION 0,2,3,0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP BEGIN @@ -16,7 +16,7 @@ BEGIN BEGIN VALUE "FileDescription", "KSwitcher — native keyboard and clipboard utility" VALUE "ProductName", "KSwitcher" - VALUE "FileVersion", "0.2.2" + VALUE "FileVersion", "0.2.3" END END BLOCK "VarFileInfo" diff --git a/src/app.cpp b/src/app.cpp index af53cf7..19296d3 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -619,9 +619,6 @@ void App::transform(int command, int snippet) L" window=" + std::to_wstring(reinterpret_cast(target)) + L" version=" + std::to_wstring(currentVersion) + L" repeat=" + std::to_wstring(repeatAttempts)); - if (repeatAttempts >= 2) - diagnosticEvent(L"Transform suspicion id=" + std::to_wstring(attempt) + - L" reason=repeated-command-without-input (may be intentional cycling)"); } if (busy.exchange(true)) { @@ -643,8 +640,7 @@ void App::transform(int command, int snippet) version = inputVersion; } enqueue( - [this, target, recent, previous, config, available, version, command, snippet, attempt, manual, requestedAt, - suspicious = manual && repeatAttempts >= 2] + [this, target, recent, previous, config, available, version, command, snippet, attempt, manual, requestedAt] { struct BusyReset { @@ -679,7 +675,6 @@ void App::transform(int command, int snippet) uint64_t version, attempt; ULONGLONG start; bool enabled; - bool suspicious; std::wstring &reason; std::wstring &text, &result, &expected; int &hint, &to; @@ -693,10 +688,10 @@ void App::transform(int command, int snippet) L" source=" + std::to_wstring(hint) + L" target=" + std::to_wstring(to) + L" expected=" + diagnosticText(expected) + L" copied=" + diagnosticText(text) + L" result=" + diagnosticText(result), - suspicious || (reason != L"paste-sent-unverified" && reason != L"layout-only" && - reason != L"unchanged-expected")); + reason != L"paste-sent-unverified" && reason != L"layout-only" && + reason != L"unchanged-expected"); } - } audit{*this, target, version, attempt, requestedAt, manual, suspicious, reason, text, result, expected, hint, to}; + } audit{*this, target, version, attempt, requestedAt, manual, reason, text, result, expected, hint, to}; try { auto valid = [&] diff --git a/src/ui.cpp b/src/ui.cpp index baa1dc3..ebf769f 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -1623,8 +1623,8 @@ void showSettings(App &app, bool visible) HWND w = makeWindow(app, L"KSwitcher.Settings", L"KSwitcher settings", settingsProc, 780, 660); app.settingsWindow = w; label(w, L"Text conversion", 18, 16); - checkbox(w, L"Convert recently typed text when nothing is selected", 201, 18, 43, 440); - checkbox(w, L"Switch Windows input layout after conversion", 202, 18, 70, 440); + checkbox(w, L"Convert recently typed text when nothing is selected", 201, 18, 43, 390); + checkbox(w, L"Switch Windows input layout after conversion", 202, 18, 70, 390); checkbox(w, L"Record clipboard history", 203, 18, 106); checkbox(w, L"Start with Windows", 204, 18, 133); checkbox(w, L"Start with Windows as administrator", 206, 18, 160, 395); diff --git a/src/update.h b/src/update.h index 6e4b8c2..e437ac4 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.2.2"; +inline constexpr wchar_t AppVersion[] = L"0.2.3"; inline constexpr UINT UpdateMessage = WM_APP + 7; struct UpdateResult {