Release v0.2.3: fix Settings overlap and repeated-conversion logging
This commit is contained in:
+1
-1
@@ -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()
|
||||
|
||||
@@ -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.
|
||||
|
||||
Binary file not shown.
+3
-5
@@ -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.
|
||||
|
||||
@@ -1 +1 @@
|
||||
9705cdb0c0a732eeae10b88e42101f9ff6714399ea8779e154fecc79269059a0 KSwitcher-win-x64.zip
|
||||
ef3f21574f02edeb63661109056480506041372f1fa4ed40b07cdd2f544d79b5 KSwitcher-win-x64.zip
|
||||
|
||||
+3
-3
@@ -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"
|
||||
|
||||
+4
-9
@@ -619,9 +619,6 @@ void App::transform(int command, int snippet)
|
||||
L" window=" + std::to_wstring(reinterpret_cast<uintptr_t>(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 = [&]
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
+1
-1
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user