Release v0.6.22: recover verified partial text selections

This commit is contained in:
2026-10-31 12:32:26 +02:00
parent 64a04b4382
commit c0ab02df16
12 changed files with 103 additions and 14 deletions
+35
View File
@@ -26,10 +26,17 @@ bool conversionOnly = false;
int pasteBehavior = 0;
int enterPresses = 0;
int copyFailuresRemaining = 0, copyRequests = 0;
int droppedSelectionKeys = 0;
bool temporaryClipboardExcluded = true;
bool clipboardAccessTimedOut = false;
LRESULT CALLBACK observeEnter(HWND w, UINT message, WPARAM wp, LPARAM lp, UINT_PTR, DWORD_PTR)
{
if (message == WM_KEYDOWN && wp == VK_LEFT && droppedSelectionKeys > 0 &&
(GetKeyState(VK_SHIFT) & 0x8000))
{
--droppedSelectionKeys;
return 0;
}
// This bare EDIT control is our test fixture, not a full editor with
// clipboard retries. Keep clipboard access on its owning UI thread while
// it handles Ctrl+C/Ctrl+V, so unrelated Windows clipboard listeners cannot
@@ -205,10 +212,12 @@ LRESULT CALLBACK procedure(HWND w, UINT msg, WPARAM wp, LPARAM lp)
break;
case 3:
require(text() == L"Hello World", "case conversion");
droppedSelectionKeys = 5;
app->transform(ks::Case);
break;
case 4:
require(text() == L"HELLO WORLD", "consecutive command reselects verified previous result");
require(droppedSelectionKeys == 0, "partial suffix selection recovered after dropped arrow keys");
prepare(L"OLDghbdtn", false);
record(L"ghbdtn");
app->transform(ks::Direct + ru);
@@ -392,6 +401,32 @@ LRESULT CALLBACK procedure(HWND w, UINT msg, WPARAM wp, LPARAM lp)
require(text() == L"привет" && diagnosticLog().size() == diagnosticStart,
"disabled diagnostics preserves conversion and writes no records");
ks::setLoggingEnabled(true);
prepare(L"PuntoSwitcher ", true);
app->transform(ks::Direct + ru);
break;
case 44:
app->transform(ks::Direct + en);
break;
case 45:
require(text() == L"PuntoSwitcher ", "previous conversion restores CamelCase and trailing space");
droppedSelectionKeys = 5;
app->transform(ks::Direct + ru);
break;
case 46:
require(text() == ks::convertTo(L"PuntoSwitcher ", app->layouts, ru, en),
"repeat conversion recovers Switcher suffix and preserves full result");
require(droppedSelectionKeys == 0, "CamelCase suffix regression dropped five selection keys");
require(ks::readClipboard(app->window).text() == sentinel,
"suffix recovery restores original clipboard");
// Derive the actual text from the physical keys, preserving an older prefix.
prepare((L"OLD" + ks::convertTo(L"snipping ", app->layouts, ru, en)).c_str(), false);
record(L"snipping ");
droppedSelectionKeys = 4;
app->transform(ks::Direct + en);
break;
case 47:
require(text() == L"OLDsnipping ", "recent Cyrillic suffix recovery preserves older prefix");
require(droppedSelectionKeys == 0, "recent suffix regression dropped four selection keys");
finish();
break;
case 30:
+20
View File
@@ -192,6 +192,26 @@ int main(int argc, char **argv)
require(ks::convert(L"hello привет", en, ru) == L"руддщ привет", "mixed text preserves target words");
require(ks::convert(L"htdm.dftim", en, ru) == L"ревьюваешь", "punctuation in words");
std::vector<ks::Layout> layouts{en, ru, uk};
ks::Run suffixRun;
suffixRun.keys = L"snipping ";
require(suffixRun.matchSuffix(L"зштп ", layouts, en) >= 0,
"recent Cyrillic suffix matches physical keys across layouts");
require(suffixRun.matchSuffix(L"ping ", layouts, en) == 0,
"recent English suffix matches physical keys");
require(suffixRun.matchSuffix(L"other", layouts, en) < 0 &&
suffixRun.matchSuffix(L"", layouts, en) < 0 &&
suffixRun.matchSuffix(L"snipping ", layouts, en) < 0,
"suffix recovery rejects unrelated, empty and complete ranges");
suffixRun.overflow = true;
require(suffixRun.matchSuffix(L"зштп ", layouts, en) < 0,
"suffix recovery rejects overflowed tracking");
suffixRun.overflow = false;
suffixRun.keys = L"LinkedIn ";
require(suffixRun.matchSuffix(L"лувШт ", layouts, en) >= 0,
"ChatGPT partial CamelCase selection matches tracked physical suffix");
require(suffixRun.match(L"ДштлувШт ", layouts, en) >= 0 &&
suffixRun.match(L"лувШт ", layouts, en) < 0,
"CamelCase conversion still requires the complete tracked text after recovery");
ks::AutoCorrector corrector;
ks::Settings autoSettings;
require(!autoSettings.autoCorrect, "auto-correction defaults off");