Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| eb30701e07 |
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.24)
|
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)
|
if(NOT WIN32)
|
||||||
message(FATAL_ERROR "KSwitcher uses native Windows APIs")
|
message(FATAL_ERROR "KSwitcher uses native Windows APIs")
|
||||||
endif()
|
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
|
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.
|
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.
|
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.
|
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,
|
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,
|
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
|
Manual conversion attempts in `kswitcher.log` have request IDs and explicit outcomes, including
|
||||||
busy, empty copy, verification mismatch, unchanged conversion, and cancelled paste. Requests
|
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
|
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
|
input. Successful repeated commands do not flush the log; intentional layout cycling is normal.
|
||||||
layout cycling can also trigger it. An unchanged result containing no letters, or a direct command
|
An unchanged result containing no letters, or a direct command
|
||||||
to the detected current layout, is treated as expected. `paste-sent-unverified` means Windows
|
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.
|
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.
|
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
|
# 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.
|
- Fix overlapping Settings controls that obscured the Next layout and Change case labels.
|
||||||
- Explicitly compile the UTF-8 Windows resource source as UTF-8, both in the resource file and the portable build command.
|
- Stop treating successful repeated conversions as diagnostic incidents. Failed operations still flush their diagnostic context to the log.
|
||||||
- Add regression checks against the compiled executable's version and exact Unicode description.
|
|
||||||
|
|
||||||
Verified: 168 native checks, 51 input/layout checks, and 26 updater/metadata checks.
|
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,
|
Download **KSwitcher-win-x64.zip**, extract the entire archive to a writable folder,
|
||||||
and launch `KSwitcher.exe`. Keep `dictionaries/` next to the executable.
|
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"
|
1 RT_MANIFEST "app.manifest"
|
||||||
201 RCDATA "update.ps1"
|
201 RCDATA "update.ps1"
|
||||||
1 VERSIONINFO
|
1 VERSIONINFO
|
||||||
FILEVERSION 0,2,2,0
|
FILEVERSION 0,2,3,0
|
||||||
PRODUCTVERSION 0,2,2,0
|
PRODUCTVERSION 0,2,3,0
|
||||||
FILEOS VOS_NT_WINDOWS32
|
FILEOS VOS_NT_WINDOWS32
|
||||||
FILETYPE VFT_APP
|
FILETYPE VFT_APP
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -16,7 +16,7 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "FileDescription", "KSwitcher — native keyboard and clipboard utility"
|
VALUE "FileDescription", "KSwitcher — native keyboard and clipboard utility"
|
||||||
VALUE "ProductName", "KSwitcher"
|
VALUE "ProductName", "KSwitcher"
|
||||||
VALUE "FileVersion", "0.2.2"
|
VALUE "FileVersion", "0.2.3"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
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" window=" + std::to_wstring(reinterpret_cast<uintptr_t>(target)) +
|
||||||
L" version=" + std::to_wstring(currentVersion) +
|
L" version=" + std::to_wstring(currentVersion) +
|
||||||
L" repeat=" + std::to_wstring(repeatAttempts));
|
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))
|
if (busy.exchange(true))
|
||||||
{
|
{
|
||||||
@@ -643,8 +640,7 @@ void App::transform(int command, int snippet)
|
|||||||
version = inputVersion;
|
version = inputVersion;
|
||||||
}
|
}
|
||||||
enqueue(
|
enqueue(
|
||||||
[this, target, recent, previous, config, available, version, command, snippet, attempt, manual, requestedAt,
|
[this, target, recent, previous, config, available, version, command, snippet, attempt, manual, requestedAt]
|
||||||
suspicious = manual && repeatAttempts >= 2]
|
|
||||||
{
|
{
|
||||||
struct BusyReset
|
struct BusyReset
|
||||||
{
|
{
|
||||||
@@ -679,7 +675,6 @@ void App::transform(int command, int snippet)
|
|||||||
uint64_t version, attempt;
|
uint64_t version, attempt;
|
||||||
ULONGLONG start;
|
ULONGLONG start;
|
||||||
bool enabled;
|
bool enabled;
|
||||||
bool suspicious;
|
|
||||||
std::wstring &reason;
|
std::wstring &reason;
|
||||||
std::wstring &text, &result, &expected;
|
std::wstring &text, &result, &expected;
|
||||||
int &hint, &to;
|
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" source=" + std::to_wstring(hint) + L" target=" + std::to_wstring(to) +
|
||||||
L" expected=" + diagnosticText(expected) + L" copied=" + diagnosticText(text) +
|
L" expected=" + diagnosticText(expected) + L" copied=" + diagnosticText(text) +
|
||||||
L" result=" + diagnosticText(result),
|
L" result=" + diagnosticText(result),
|
||||||
suspicious || (reason != L"paste-sent-unverified" && reason != L"layout-only" &&
|
reason != L"paste-sent-unverified" && reason != L"layout-only" &&
|
||||||
reason != L"unchanged-expected"));
|
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
|
try
|
||||||
{
|
{
|
||||||
auto valid = [&]
|
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);
|
HWND w = makeWindow(app, L"KSwitcher.Settings", L"KSwitcher settings", settingsProc, 780, 660);
|
||||||
app.settingsWindow = w;
|
app.settingsWindow = w;
|
||||||
label(w, L"Text conversion", 18, 16);
|
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"Convert recently typed text when nothing is selected", 201, 18, 43, 390);
|
||||||
checkbox(w, L"Switch Windows input layout after conversion", 202, 18, 70, 440);
|
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"Record clipboard history", 203, 18, 106);
|
||||||
checkbox(w, L"Start with Windows", 204, 18, 133);
|
checkbox(w, L"Start with Windows", 204, 18, 133);
|
||||||
checkbox(w, L"Start with Windows as administrator", 206, 18, 160, 395);
|
checkbox(w, L"Start with Windows as administrator", 206, 18, 160, 395);
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
namespace ks
|
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;
|
inline constexpr UINT UpdateMessage = WM_APP + 7;
|
||||||
struct UpdateResult
|
struct UpdateResult
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user